Mybatis-基本学习(上)
Mybatis
定义:持久层?
干啥的?作用于哪一方面?
基本配置,基本操作?
- 重点,难点---结果集映射
- 分页,
- 注解开发(重点)
- 一对多,多对多的处理(难点)
- 动态SQL(重点)
- 缓存(十分重要,极其重要)
mybatis开始
-----环境准备
- JDK 1.8
- mysql 8.0.21
- maven 3.6.1
- mybatis 3.5.3
- IDEA
回顾 - JDBC - Mysql - java - Maven - Junit
框架,都有配置文件。最好的方式---看官网
下载:GitHub : https://github.com/mybatis/mybatis-3/releases
maven下载 mybatis 3.5.3
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
一.简介
1.什么是MyBatis
- MyBatis 是一款优秀的持久层框架
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程
- MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,
将接口和 Java 的 实体类 【Plain Old Java Objects,普通的 Java对象】映射成数据库中的记录。 - MyBatis 本是apache的一个开源项目ibatis, 2010年这个项目由apache 迁移到了google code,并且改名为MyBatis 。
- 2013年11月迁移到Github .
2.持久化
1.持久化是将程序数据在持久状态和瞬时状态间转换的机制。
- 1).即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用
是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。 - 2).JDBC就是一种持久化机制。文件IO也是一种持久化机制。
- 3).在生活中 : 将鲜肉冷藏,吃的时候再解冻的方法也是。将水果做成罐头的方法也是。
- 1).即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用
2.为什么需要持久化服务呢?那是由于内存本身的缺陷引起的(内存断电即失)
- 1).内存断电后数据会丢失,但有一些对象是无论如何都不能丢失的,比如银行账号等,遗憾的
是,人们还无法保证内存永不掉电。 - 2).内存过于昂贵,与硬盘、光盘等外存相比,内存的价格要高2~3个数量级,而且维持成本也
高,至少需要一直供电吧。所以即使对象不需要永久保存,也会因为内存的容量限制不能一直
呆在内存中,需要持久化来缓存到外存。
- 1).内存断电后数据会丢失,但有一些对象是无论如何都不能丢失的,比如银行账号等,遗憾的
3.持久层
- 什么是持久层?
- 1.完成持久化工作的代码块 . ----> dao层 【DAO (Data Access Object) 数据访问对象】
- 2.大多数情况下特别是企业级应用,数据持久化往往也就意味着将内存中的数据保存到磁盘上加
以固化,而持久化的实现过程则大多通过各种关系数据库来完成。 - 3.不过这里有一个字需要特别强调,也就是所谓的“层”。对于应用系统而言,数据持久功能大多
是必不可少的组成部分。也就是说,我们的系统中,已经天然的具备了“持久层”概念?也许
是,但也许实际情况并非如此。之所以要独立出一个“持久层”的概念,而不是“持久模块”,“持久
单元”,也就意味着,我们的系统架构中,应该有一个相对独立的逻辑层面,专著于数据持久
化逻辑的实现. - 4.与系统其他部分相对而言,这个层面应该具有一个较为清晰和严格的逻辑边界。 【说白了就
是用来操作数据库存在的!】
4.为什么需要Mybatis?
- 帮助程序员将数据存到数据库中
- 方便
- 传统JDBC代码台复杂。简化。框架。自动化
- 不用Mybatis也可以,更容易上手。技术没有高低之分
- 优点-------主要就是用的人多
二.第一个Mybatis程序
思路:搭建环境-->导入mybatis-->编写代码-->测试
1.搭建环境
1).数据库的
mysql> create database `mybatis`;
Query OK, 1 row affected (0.00 sec)
mysql> use `mybatis`;
Database changed
mysql> create table `user`(
-> `id` int not null,
-> `name` varchar(20) DEFAULT null,
-> `password` varchar(20) DEFAULT null,
-> primary key(`id`)
-> )engine = INNODB DEFAULT charset=utf8;
Query OK, 0 rows affected (0.02 sec)
mysql> insert into `user`(`id`,`name`,`password`) values(0,'zjz0','123456'),(1,'zjz1','123456'),(2,'zjz2','123456');
Query OK, 3 rows affected (0.00 sec)
2).maven项目
- 普通maven项目
- 删除src
- 导入mysql mybatis junit 包
<dependencies>
<!-- mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<!-- 单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<!--mybatis-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
</dependencies>
<!-- ex:此处增加的build详细在maven====太长不加了-->
3).创建一个子类modules

4).编写mybatis的核心配置文件
配置 mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"> <!--configuration核心配置文件--> <configuration>
<environments default="development">
<environment id="development">
<!-- 事务管理-->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis? useSSL=true&useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--每一个mapper.xml都需要在mybatis核心配置文件中注册-->
<mappers>
<mapper resource="com/zjz/dao/UserMapper.xml"/>
</mappers>
</configuration>- 编写mybatis工具类
- sqlSessionFactory -- 构建sqlSession
// sqlSessionFactory -产生-> sqlSession
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory; static {
try {
// 第一步--获取sqlSessionFactory对象 String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}//获取SqlSession连接 public static SqlSession getSqlSession() {
SqlSession sqlSession = sqlSessionFactory.openSession(); // sqlSession 不是线程安全的
return sqlSession; }
}- 编写mybatis工具类
5).编写代码
UserMapper接口
public interface UserMapper {
List<User> getUserList();
}UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace,绑定一个Dao/Mapper接口-->
<mapper namespace="com.zjz.dao.UserMapper">
<!--id要与mapper的方法对应-->
<!--resultType返回类型-->
<select id="getUserList" resultType="com.zjz.pojo.User">
select * from user
</select>
</mapper>
6).测试
Junit测试
@Test
public void test(){ // 第一步,获得SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 执行sql
UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.getUserList(); System.out.println(userList.toString()); // 关闭SqlSession
sqlSession.close(); }
三个核心接口


注意
- org.apache.ibatis.binding.BindingException:
Type interface com.zjz.dao.UserMapper is not known to the MapperRegistry. - MapperRegistry
- 问题
- 1.配置文件没有注册(mybatis-config没配置)
- UserMapper.xml--2.绑定接口错误 3.方法名不对 4.返回类型不对
- pom.xml 5.Maven导出资源错误 MapperRegistry
总:

三,基本CRUD
操作DML一定要提交事务 sqlSession.commit();
1.namespace
- namespace中的包名要和Mapper接口的包名一致
2.Mapper.xml
- 语句
- 1.id:对应的namesapce中的方法名
- 2.resultType:
- Sql语句执行的返回值(对应对象则为对象类型)-单表返回对应的对象,多表返回
- --如果select,必须有,其它可以没有
- 3.parameterType 参数类型
- 4.语句中传参使用
#{XXX}XXX 要对应 parameterType里面的东西
问题 sqlSession 是如何控制全局的,中途关闭它,有什么影响?(或者只让它有初始值)
- 查询时,可以依据参数查找对象---入参parameterType 出参 resultType
- 插入时,入参parameterType--一般就是对象了 ,出参不写
代码
1.接口Mapper
public interface UserMapper {
// 查询全部用户
List<Object> getUserList(); // list中可以指定POJO,也可以指定Object(多表) // 根据id查询
User getUserById(int id); // 插入insert
int addUser(User user); // 修改用户
int updateUser(User user); // 删除用户
int deleteUser(int id);
}
2.Mapper.xml
<!--namespace,绑定一个Dao/Mapper接口-->
<mapper namespace="com.zjz.dao.UserMapper">
<!--id要与mapper的方法对应-->
<!--resultType返回类型-->
<!--resultType返回类型
select中,如果指定,那么返回指定对象,不指定报错 多表应该怎么写??
--> <select id="getUserList" resultType="com.zjz.pojo.User" >
select * from user
</select> <select id="getUserById" parameterType="int" resultType="com.zjz.pojo.User">
select * from mybatis.user where id = #{id}
</select> <insert id="addUser" parameterType="com.zjz.pojo.User">
insert into mybatis.user(id,name,password) values (#{id},#{name},#{password});
</insert> <update id="updateUser" parameterType="com.zjz.pojo.User">
update mybatis.user
set name = #{name},password = #{password}
where id = #{id};
</update> <delete id="deleteUser" parameterType="int">
delete from mybatis.user where id = #{id};
</delete>
</mapper>3.Test
@Test
public void TestGetUserById(){
SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User userById = mapper.getUserById(1);
System.out.println(userById); sqlSession.close();
} @Test
public void TestAddUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.addUser(new User(5, "zjz05", "123456")); // 提交事务
sqlSession.commit(); sqlSession.close(); } @Test
public void TestUpdateUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.updateUser(new User(4,"zjz04","123456")); sqlSession.commit();
sqlSession.close(); }
模糊查询 切记防止sql注入
方式一:安全的
- XXXMappper.xml
<!--like '%zjz%'-->
<select id="getUserLike" resultType="com.zjz.pojo.User" >
select * from user where name like #{value}
</select>
- test语句
List<User> list = mapper.getUserLike("%zjz%");
方式二:可sql注入
- XXXMappper.xml
<!--like '%zjz%'-->
<select id="getUserLike" resultType="com.zjz.pojo.User" >
select * from user where name like "%"#{value}"%"
</select>
- test语句
List<User> list = mapper.getUserLike("zjz");
一些错误
- 1.标签。。各对各的 select……
- 2.resource绑定mapper,需要使用路径
- 3.程序配置文件符合规范
- 4.NullPointException 没找到资源
- 5.输出的xml文件有乱码。。。
- 6.maven资源导出问题
Mybatis-基本学习(上)的更多相关文章
- Mybatis架构学习
Mybatis架构学习 MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架.MyBatis 封装了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.可以对配置和原生Map使用 ...
- MyBatis入门学习教程-使用MyBatis对表执行CRUD操作
上一篇MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对use ...
- MyBatis入门学习(二)
在MyBatis入门学习(一)中我们完成了对MyBatis简要的介绍以及简单的入门小项目测试,主要完成对一个用户信息的查询.这一节我们主要来简要的介绍MyBatis框架的增删改查操作,加深对该框架的了 ...
- Spring+SpringMVC+MyBatis深入学习及搭建(四)——MyBatis输入映射与输出映射
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6878529.html 前面有讲到Spring+SpringMVC+MyBatis深入学习及搭建(三)——My ...
- Spring+SpringMVC+MyBatis深入学习及搭建(六)——MyBatis关联查询
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6923464.html 前面有将到:Spring+SpringMVC+MyBatis深入学习及搭建(五)--动 ...
- Spring+SpringMVC+MyBatis深入学习及搭建(七)——MyBatis延迟加载
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6953005.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(六)——My ...
- Spring+SpringMVC+MyBatis深入学习及搭建(八)——MyBatis查询缓存
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6956206.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(七)——My ...
- Spring+SpringMVC+MyBatis深入学习及搭建(十一)——SpringMVC架构
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6985816.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十)--My ...
- Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序(一)
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)——S ...
- Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)--S ...
随机推荐
- Vue Router根据后台数据加载不同的组件(思考->实现->不止于实现)
实际项目中遇到的需求 同一个链接需要加载不同的页面组件.根据用户所购买服务的不同,有不同的页面展现. 有一些不好的实现方式 直接把这几个组件写在同一个组件下,通过v-if去判断.如果这么做的话,甚至可 ...
- fiddler 之 返回数据乱码解决方法
1.有时用fiddler抓包, 发现抓到的包, 发送数据和返回数据都是乱码, 怎么办? 直接上图 (这办法不是100%成功的) 方法一: 方法二:
- 守护线程_daemon
守护线程_daemon 线程分为用户线程和守护线程 虚拟机必须确保用户线程(main)执行完毕 虚拟机不用等待守护线程(gc)执行完毕 如:后台记录操作日志,监控内存,垃圾回收等等 测试案例: pac ...
- Tengine2.3+openssl1.1.1支持TLS1.3
安装包下载: openssl1.1.1 链接:https://pan.baidu.com/s/1-qCDhkLtlkT0fdwKdVuh2g 提取码:0ncc pcre3.2.1 链接:https:/ ...
- Golang语言系列-11-goroutine并发
goroutine 并发 概念 package main import ( "fmt" "time" ) /* [Go语言中的并发编程 goroutine] [ ...
- GO语言的基本语法之变量,常量,条件语句,循环语句
GO语言的基本语法之变量,常量,条件语句,循环语句 作为慕课网得笔记自己看 定义变量: 使用var关键字 var a, b, C bool var s1, s2 string = "hell ...
- Android WorkManager工作约束,延迟与查询工作
WorkManager工作约束,延迟与查询工作 本文可能会混用"工作"与"任务"这两个词. 本文例子使用Kotlin 准备一个工作类(任务)UploadWork ...
- SpringCloud升级之路2020.0.x版-20. 启动一个 Eureka Server 集群
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 我们的业务集群结构 ...
- 题解 Sequence
传送门 只会爆搜系列 关于「本质不同的子序列个数」:限定长度,无限制(就是这题) 无限制的柿子是(令 \(dp[i]\) 为以 \(i\) 为结尾的不同子序列个数) \(dp[i] = \sum dp ...
- JavaWeb学习笔记(五)
本文内容 1. JSP: 1. 指令 2. 注释 3. 内置对象 2. MVC开发模式 3. EL表达式 4. JSTL标签 5. 三层架构 JSP: 1. 指令 * 作用:用于配置JSP页面,导入资 ...