mybatis 基础入门
mybatis 基础入门
ruoxijunMyBatis 入门
MyBatis 环境配置与简单查询实例:
MyBatis 就是封装版的 JDBC 简化了对数据库的操作:
1. 创建maven程序,添加依赖 (jar 包):
在 maven 项目文件 pom.xml
下的 dependencies
标签中导入一下依赖(jar包):
- MyBatis 依赖:
1 | <dependency> |
- SQL 数据库驱动依赖(根据所使用的数据库自行选择依赖):
1 | <dependency> |
2. 编写核心配置xml文件:
- 在
resources
文件夹中新建mybatis-config.xml
(文件名也可自定义):
1 |
|
3. 编写Mapper接口与配置Mapper.xml:
Mapper接口中定义对数据库表增删改查的方法,接口名建议以 [表名|数据库名]Mapper
命名。以配置Mapper.xml(建议以 对应接口名.xml
命名)的方式实现该接口,下以查询为例:
查询的每一条数据都作为一个对象返回,我们需要先创建一个对应表字段的实体类(pojo):
以下表为例:
为此表字段编写一个对应的类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30public class UserPojo {
// 1.设置变量字段,注意变量的名称与类型应与表字段保持一致
private int id;
private String name;
private int age;
// 2.为每个字段设置 get 和 set 方法
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
// 其它可自行根据需要进行增添设置
// 构造函数
public UserPojo(){}
public UserPojo(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
// toString 方法
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}编写执行数据库方法的Mapper接口:
建议每一个表的实体类(pojo)对应一个Mapper接口,接口中定义对对应表的增删改查方法,接口名建议以
实体类名+Mapper
命名。
1 | public interface UsersMapper { |
编写Mapper.xml实现接口中的方法:
Mapper.xml建议以
对应接口名.xml
命名,它可以看成是Mapper的具体实现类。对接口中的方法进行配置实现对表的操作。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 头文件(mapper.xml的头部声明) -->
<!-- 绑定Mapper.xml对应的Mapper接口类 -->
<mapper namespace="io.github.ruoxijun.mapper.UsersMapper">
<!-- select 查询:
id 对应接口中的方法名
resultType 每条查询结果封装的类型
标签内为查询语句 -->
<select id="getUserList" resultType="io.github.ruoxijun.data.UserPojo">
select * from user
</select>
</mapper>在核心配置文件中注册配置好的Mapper.xml:
注意:resource中值为文件相对路径以
/
为分隔符,切记不能用.
分隔。1
2
3
4
5<!-- 在mybatis-config.xml文件的configuration标签内 -->
<mappers>
<!-- 注意路径使用的是文件方式 “/” 注册 -->
<mapper resource="io/github/ruoxijun/mapper/UsersMapper.xml"/>
</mappers>
4. 编写测试类验证程序:
建议在test文件夹下对应main文件夹下的Mapper接口位置创建测试类:
1 |
|
最后因为Maven项目中默认只有resources 文件夹中的资源(配置)文件才能被打包,测试时可能因为我们的Mapper.xml文件在java文件夹中而不能被打包到classpath中。
所以有必要对 pom.xml
配置构建时的配置:
1 | <build> |
此时运行测试项目成功。
5. 增加带参方法条件查询:
Mapper 接口中新增方法:
1
2// 因为确定返回的数据最多只有1条,所以返回值类型为该对象而不用List(也行)
UserPojo getUserById(int id);Mapper.xml中添加方法配置:
1
2
3
4
5
6
7<!-- parameterType 代表传入参数的类型,只有一个参数且为基本类型时可以不声明
查询语句中增加条件,利用 #{参数(变量)名} 的方式调用参数
使用 ${}(不安全有SQL注入风险) 或 #{0}(不灵活) 也可达到效果但不推荐 -->
<select id="getUserById" parameterType="int"
resultType="io.github.ruoxijun.data.UserPojo">
select * from user where id = #{id}
</select>测试时同上所讲获取到接口实例化对象调用方法即可:
1
2UserPojo user = mapper.getUserById(4);
System.out.println(user);
对象作用域(生命周期)与封装:
对象生命周期:
了解Mybatis中对象的生命周期也是很重要的,错误的使用会导致严重的并发问题。
SqlSessionFactoryBuilder:
一旦创建了 SqlSessionFactory,就不再需要它了。所以最好定义为局部方法变量。
SqlSessionFactory:
一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
SqlSession:
SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的作用域是局部作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。并且使用完后一定要关闭。
获取 SqlSession 的封装:
之后的应用中需要经常用到 SqlSession
不可能每次都写一次,在此对获取 SqlSession
做一个简单的封装。创建一个专用于获取 SqlSession
的工具类:
1 | public class GetSqlSession { |
此后使用时只需要两句便可以获取到Mapper接口的实例对象:
1 | // 通过定义好的工具类获取 SqlSession |
这只是一个简单的封装,实际使用时建议使用 单例模式 来设计更好的封装方法。
增改删操作:
增改删流程与查类似,Mapper接口中定方法再在Mapper.xml中使用对应的标签(如增是使用insert标签)绑定方法。
增改删与查不同的是,接口实例对象所有的增改删方法被调用后,
SqlSession
对象必须commit
(提交事务)才能生效。且这些方法的返回值为int
即数据更改成功的个数。
1. 增(insert):
在Mapper接口中定义插入数据的方法:
int insertUser(UserPojo user);
在Mapper.xml中进行对插入方法具体实现的配置:
1
2
3
4
5
6<!-- parameterType中声明传入一个字段对象类型作为参数
因为字段类中设置了成员变量的get方法,
可直接通过 #{成员变量名} 的方式来获取具体的值 -->
<insert id="insertUser" parameterType="io.github.ruoxijun.data.UserPojo">
insert into user(id,name,age) values(#{id},#{name},#{age})
</insert>使用时在获取到接口实例对象后:
1
2
3
4
5
6
7// 利用获取到的接口实例调用方法,传入一个字段对象
int insertNum = mapper.insertUser(new UserPojo(6,"哈哈",18));
if (insertNum==1){
// 对表数据更改的操作,必须 commit 提交事务才能生效
sqlSession.commit();
System.out.println("插入成功!");
}
2. 改(update):
操作都基本类似,只看一下Mapper.xml配置:
1 | <update id="updateUser" parameterType="io.github.ruoxijun.data.UserPojo"> |
3. 删(delete):
Mapper.xml配置:
1 | <delete id="deleteUser" parameterType="int"> |
Map 传参与模糊查询:
Map简化传参:
上方所讲 改(update) 处在修改方法中传入了一个用户对象,但可以看出实际使用时并未使用到全部属性。当表的字段较多时字段对象的成员变量也会相应增多,而SQL语句中需要用到的值只有几个,此时传入一个完整的对象显得不再合理。利用传入一个 Map
就可只传入我们需要使用的数据,而不用在创建一个完整的对象方式。
Mapper接口中传入值替换为Map:
1 | // key为 String,value类型不定采用 Object |
Mapper.xml中传入类型替换为map:
1 | <!-- parameterType 值更改为map,即传入的参数类型为Map |
使用时:
1 | // 准备数据 |
模糊查询与SQL拼接:
Mapper接口中定义查询方法:List<User> findLikeNameList(String name);
Mapper.xml中实现方法与书写模糊查询语句:
1 | <!-- 在标签的SQL语句中字符串 "" 与挨着的变量值会自动拼接 --> |
在标签内把SQL语句写死,而不用参数的方式 %name%
传入模糊语句是为了数据库安全防止SQL注入。