前言
有了第一篇《Mybaits-入门(一)》的铺垫,我们已经有一个基本的程序骨架了,虽然只是简单的查询,但是我们可以大概了解到 Mybatis
的相关操作了。接下来咱们一点一点的来,慢慢了解 Mybatis 的增
、删
、改
、查
操作。
CRUD
我们把上一篇文章中com/yubulang/dao/UserMapper.xml
的配置贴出来,看看相关的参数
1 |
|
2 |
|
3 |
|
4 |
|
5 | |
6 | <!-- 绑定一个指定的Dao/Mapper接口 --> |
7 | <mapper namespace="com.yubulang.dao.UserMapper"> |
8 | <!-- 查询语句, id对应UserMapper接口中的方法名 --> |
9 | <!-- resultType 返回类型:要填写全类型名 --> |
10 | <select id="getUserList" resultType="com.yubulang.pojo.User"> |
11 | select * from users |
12 | </select> |
13 | </mapper> |
namespace
我们需要注意的是 namespace
中的包名和 Dao/Mapper
接口的包名一致。
select:选择查询语句
- id 就是对应的 namespace 中的方法名
- resultType:Sql 语句执行的返回值
- parameterType:参数类型
刚才我们已经查询全部用户的方法,现在我们实现一个查询指定用户的 id 的用户消息。还是老规矩,我们先实现接口实现类。
1 | package com.yubulang.dao; |
2 | |
3 | import com.yubulang.pojo.User; |
4 | |
5 | import java.util.List; |
6 | |
7 | public interface UserMapper { |
8 | // 获取全部用户 |
9 | List<User> getUserList(); |
10 | |
11 | // 根据id获取用户 |
12 | User getUserById(int id); |
13 | } |
在接口实现类中添加了getUserById
方法,同时我们也要在UserMapper.xml
下面添加对应的 <select>
标签,这个标签需要我们传递参数进入 parameterType
参数类型。在写 sql 语句时,我们要用 #{id}
来做参数占位符。
1 |
|
2 |
|
3 |
|
4 |
|
5 | |
6 | <!-- 绑定一个指定的Dao/Mapper接口 --> |
7 | <mapper namespace="com.yubulang.dao.UserMapper"> |
8 | <!-- 查询语句, id对应UserMapper接口中的方法名 --> |
9 | |
10 | <!-- resultType 返回类型:要填写全类型名 --> |
11 | <select id="getUserList" resultType="com.yubulang.pojo.User"> |
12 | select * from users |
13 | </select> |
14 | |
15 | <!-- 查询指定用户id的信息 --> |
16 | <select id="getUserById" resultType="com.yubulang.pojo.User" parameterType="int"> |
17 | select * from users where id=#{id} |
18 | </select> |
19 | </mapper> |
写完之后,测试代码也要跟上:
1 | package com.yubulang.dao; |
2 | |
3 | import com.yubulang.pojo.User; |
4 | import com.yubulang.utils.MybatisUtils; |
5 | import org.apache.ibatis.session.SqlSession; |
6 | import org.junit.Test; |
7 | |
8 | import java.util.List; |
9 | |
10 | public class UserMapperTest { |
11 | |
12 | public void testGetUserList() { |
13 | // 第一步:获得SqlSession对象 |
14 | SqlSession sqlSession = MybatisUtils.getSqlSession(); |
15 | |
16 | // 执行SQL |
17 | // 方式一:getMapper |
18 | UserMapper mapper = sqlSession.getMapper(UserMapper.class); |
19 | List<User> userList = mapper.getUserList(); |
20 | for (User user : userList) { |
21 | System.out.println(user); |
22 | } |
23 | |
24 | System.out.println("============================================"); |
25 | |
26 | // 方式二:旧的一种方式不太推荐 |
27 | List<User> userList2 = sqlSession.selectList("com.yubulang.dao.UserMapper.getUserList"); |
28 | for (User user : userList2) { |
29 | System.out.println(user); |
30 | } |
31 | |
32 | // 关闭SqlSession |
33 | sqlSession.close(); |
34 | } |
35 | |
36 | |
37 | public void testGetUserById() { |
38 | SqlSession sqlSession = MybatisUtils.getSqlSession(); |
39 | |
40 | UserMapper mapper = sqlSession.getMapper(UserMapper.class); |
41 | |
42 | User user = mapper.getUserById(1); |
43 | |
44 | System.out.println(user); |
45 | |
46 | sqlSession.close(); |
47 | } |
48 | } |
insert: 插入操作
既然有查询,就肯定有插入的操作,其实方式都差不多,需要我们耐心的去重复,直到形成本能记忆。我们还是在 com.yubulang.dao.UserMapper
中创建一个 addUser
方法。
1 | package com.yubulang.dao; |
2 | |
3 | import com.yubulang.pojo.User; |
4 | |
5 | import java.util.List; |
6 | |
7 | public interface UserMapper { |
8 | // 获取全部用户 |
9 | List<User> getUserList(); |
10 | |
11 | // 根据id获取用户 |
12 | User getUserById(int id); |
13 | |
14 | // 创建一个用户 |
15 | int addUser(User user); |
16 | } |
UserMapper.xml
也要加入对应的 <insert> 标签,这个 insert 标签,没有 returnType 标签,这里我们的 parameterType
是一个 User 类型,我们要怎么传值呢?Mybatis 允许我们直接使用类的字段属性做占位符。我们来看看 xml 文件如何编写。
1 |
|
2 |
|
3 |
|
4 |
|
5 | |
6 | <!-- 绑定一个指定的Dao/Mapper接口 --> |
7 | <mapper namespace="com.yubulang.dao.UserMapper"> |
8 | <!-- 查询语句, id对应UserMapper接口中的方法名 --> |
9 | |
10 | <!-- resultType 返回类型:要填写全类型名 --> |
11 | <select id="getUserList" resultType="com.yubulang.pojo.User"> |
12 | select * from users |
13 | </select> |
14 | |
15 | <!-- 查询指定用户id的信息 --> |
16 | <select id="getUserById" resultType="com.yubulang.pojo.User" parameterType="int"> |
17 | select * from users where id=#{id} |
18 | </select> |
19 | |
20 | <!-- 创建一个用户 --> |
21 | <!-- insert 没有returnType --> |
22 | <!-- User 对象中的属性,可以直接取出 --> |
23 | <insert id="addUser" parameterType="com.yubulang.pojo.User"> |
24 | insert into users (name, password) values (#{name}, #{password}) |
25 | </insert> |
26 | </mapper> |
测试代码这个时候要跟上,在 test/java
目录 com.yubulang.dao.UserMapperTest
添加 testAddUser
测试方法:
1 |
|
2 | public void testAddUser() { |
3 | SqlSession sqlSession = MybatisUtils.getSqlSession(); |
4 | |
5 | UserMapper mapper = sqlSession.getMapper(UserMapper.class); |
6 | |
7 | User user = new User(); |
8 | user.setName("赵云"); |
9 | user.setPassword("666666"); |
10 | |
11 | int result = mapper.addUser(user); |
12 | if (result > 0) { |
13 | System.out.println("插入成功!"); |
14 | } |
15 | |
16 | sqlSession.close(); |
17 | } |
我们执行,会发现这条数据并未插入到数据库,这是为什么呢?因为增删改都需要提交事务才能完成入库。
所以我们需要将代码调整一下:
1 | // 增删改查需要提交事务 |
2 |
|
3 | public void testAddUser() { |
4 | SqlSession sqlSession = MybatisUtils.getSqlSession(); |
5 | |
6 | UserMapper mapper = sqlSession.getMapper(UserMapper.class); |
7 | |
8 | User user = new User(); |
9 | user.setName("赵云"); |
10 | user.setPassword("666666"); |
11 | |
12 | int result = mapper.addUser(user); |
13 | if (result > 0) { |
14 | System.out.println("插入成功!"); |
15 | } |
16 | |
17 | // 提交事务 |
18 | sqlSession.commit(); |
19 | |
20 | sqlSession.close(); |
21 | } |
parameterType 的参数为 map 时,这个方式实际开发中也会用到,我们也拿过来看看。
创建一个 addUserWithMap
接口实现方法到 UserMapper.java
接口中:
1 | // 添加用户使用 Map 参数 |
2 | int addUserWithMap(Map<String, Object> map); |
添加对应的 xml 到 UserMapper.xml
中:
1 | <insert id="addUserWithMap" parameterType="map"> |
2 | insert into users (name, password) values (#{userName}, #{passWord}) |
3 | </insert> |
4 | ``` |
5 | |
6 | 键入测试代码: |
7 | ```java |
8 | @Test |
9 | public void testAddUserWithMap() { |
10 | SqlSession sqlSession = MybatisUtils.getSqlSession(); |
11 | |
12 | UserMapper mapper = sqlSession.getMapper(UserMapper.class); |
13 | |
14 | Map<String, Object> map = new HashMap<String, Object>(); |
15 | |
16 | map.put("userName", "大番薯"); |
17 | map.put("passWord", "666666"); |
18 | |
19 | int result = mapper.addUserWithMap(map); |
20 | if (result > 0) { |
21 | System.out.println("插入成功!"); |
22 | } |
23 | |
24 | // 提交事务 |
25 | sqlSession.commit(); |
26 | |
27 | sqlSession.close(); |
28 | } |
29 | ``` |
30 | |
31 | 我们可以看到占位符 `#{userName}`,`#{passWord}` 是对应了 Map传入的键。 |
32 | |
33 | ### update:修改操作 |
34 | |
35 | 有了添加操作的铺垫,我相信 update 的操作也就是依葫芦画瓢的事儿,我还是继续将代码敲一遍。接口实现类代码如下: |
36 | |
37 | ```java |
38 | package com.yubulang.dao; |
39 | |
40 | import com.yubulang.pojo.User; |
41 | |
42 | import java.util.List; |
43 | |
44 | public interface UserMapper { |
45 | // 获取全部用户 |
46 | List<User> getUserList(); |
47 | |
48 | // 根据id获取用户 |
49 | User getUserById(int id); |
50 | |
51 | // 创建一个用户 |
52 | int addUser(User user); |
53 | |
54 | // 修改一个用户 |
55 | int updateUser(User user); |
56 | } |
UserMapper.xml
也要加入对应的 <update> 标签。
1 |
|
2 |
|
3 |
|
4 |
|
5 | |
6 | <!-- 绑定一个指定的Dao/Mapper接口 --> |
7 | <mapper namespace="com.yubulang.dao.UserMapper"> |
8 | <!-- 查询语句, id对应UserMapper接口中的方法名 --> |
9 | |
10 | <!-- resultType 返回类型:要填写全类型名 --> |
11 | <select id="getUserList" resultType="com.yubulang.pojo.User"> |
12 | select * from users |
13 | </select> |
14 | |
15 | <!-- 查询指定用户id的信息 --> |
16 | <select id="getUserById" resultType="com.yubulang.pojo.User" parameterType="int"> |
17 | select * from users where id=#{id} |
18 | </select> |
19 | |
20 | <!-- 创建一个用户 --> |
21 | <!-- insert 没有returnType --> |
22 | <!-- User 对象中的属性,可以直接取出 --> |
23 | <insert id="addUser" parameterType="com.yubulang.pojo.User"> |
24 | insert into users (name, password) values (#{name}, #{password}) |
25 | </insert> |
26 | |
27 | <!-- 修改一个用户 --> |
28 | <update id="updateUser" parameterType="com.yubulang.pojo.User"> |
29 | update users set name=#{name}, password=#{password} where id=#{id} |
30 | </update> |
31 | </mapper> |
测试代码走起,在 test/java
目录 com.yubulang.dao.UserMapperTest
添加 testUpdateUser
测试方法:
1 |
|
2 | public void testUpdateUser() { |
3 | SqlSession sqlSession = MybatisUtils.getSqlSession(); |
4 | |
5 | UserMapper mapper = sqlSession.getMapper(UserMapper.class); |
6 | |
7 | User user = mapper.getUserById(3); |
8 | user.setName(user.getName() + "修改"); |
9 | |
10 | int result = mapper.updateUser(user); |
11 | if (result > 0) { |
12 | System.out.println("修改成功"); |
13 | } |
14 | |
15 | sqlSession.commit(); |
16 | sqlSession.close(); |
17 | } |
delete:删除操作
删除用户的操作接口实现类:
1 | package com.yubulang.dao; |
2 | |
3 | import com.yubulang.pojo.User; |
4 | |
5 | import java.util.List; |
6 | |
7 | public interface UserMapper { |
8 | // 获取全部用户 |
9 | List<User> getUserList(); |
10 | |
11 | // 根据id获取用户 |
12 | User getUserById(int id); |
13 | |
14 | // 创建一个用户 |
15 | int addUser(User user); |
16 | |
17 | // 修改一个用户 |
18 | int updateUser(User user); |
19 | |
20 | // 删除一个用户 |
21 | int deleteUser(int id); |
22 | } |
UserMapper.xml
也要加入对应的 <delete> 标签。
1 |
|
2 |
|
3 |
|
4 |
|
5 | |
6 | <!-- 绑定一个指定的Dao/Mapper接口 --> |
7 | <mapper namespace="com.yubulang.dao.UserMapper"> |
8 | <!-- 查询语句, id对应UserMapper接口中的方法名 --> |
9 | |
10 | <!-- resultType 返回类型:要填写全类型名 --> |
11 | <select id="getUserList" resultType="com.yubulang.pojo.User"> |
12 | select * from users |
13 | </select> |
14 | |
15 | <!-- 查询指定用户id的信息 --> |
16 | <select id="getUserById" resultType="com.yubulang.pojo.User" parameterType="int"> |
17 | select * from users where id=#{id} |
18 | </select> |
19 | |
20 | <!-- 创建一个用户 --> |
21 | <!-- insert 没有returnType --> |
22 | <!-- User 对象中的属性,可以直接取出 --> |
23 | <insert id="addUser" parameterType="com.yubulang.pojo.User"> |
24 | insert into users (name, password) values (#{name}, #{password}) |
25 | </insert> |
26 | |
27 | <!-- 修改一个用户 --> |
28 | <update id="updateUser" parameterType="com.yubulang.pojo.User"> |
29 | update users set name=#{name}, password=#{password} where id=#{id} |
30 | </update> |
31 | |
32 | <!-- 删除一个用户 --> |
33 | <delete id="deleteUser" parameterType="int"> |
34 | delete from users where id=#{id} |
35 | </delete> |
36 | </mapper> |
测试代码走起,在 test/java
目录 com.yubulang.dao.UserMapperTest
添加 testDeleteUser
测试方法:
1 |
|
2 | public void testDeleteUser() { |
3 | SqlSession sqlSession = MybatisUtils.getSqlSession(); |
4 | |
5 | UserMapper mapper = sqlSession.getMapper(UserMapper.class); |
6 | |
7 | int result = mapper.deleteUser(4); |
8 | if (result > 0) { |
9 | System.out.println("删除成功"); |
10 | } |
11 | |
12 | sqlSession.commit(); |
13 | sqlSession.close(); |
14 | } |
总结
基本的操作不是很难,不过复杂的还需要我们看看文档,才能知道一些具体的使用场景,加油!动手!动手!动手!