0%

Mybaits-入门(二)

前言

有了第一篇《Mybaits-入门(一)》的铺垫,我们已经有一个基本的程序骨架了,虽然只是简单的查询,但是我们可以大概了解到 Mybatis 的相关操作了。接下来咱们一点一点的来,慢慢了解 Mybatis 的操作。

CRUD

我们把上一篇文章中com/yubulang/dao/UserMapper.xml的配置贴出来,看看相关的参数

1
<?xml version="1.0" encoding="UTF-8" ?>
2
<!DOCTYPE mapper
3
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
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
<?xml version="1.0" encoding="UTF-8" ?>
2
<!DOCTYPE mapper
3
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
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
    @Test
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
    @Test
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
<?xml version="1.0" encoding="UTF-8" ?>
2
<!DOCTYPE mapper
3
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
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
@Test
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
@Test
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
<?xml version="1.0" encoding="UTF-8" ?>
2
<!DOCTYPE mapper
3
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
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
@Test
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
<?xml version="1.0" encoding="UTF-8" ?>
2
<!DOCTYPE mapper
3
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
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
@Test
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
}

总结

基本的操作不是很难,不过复杂的还需要我们看看文档,才能知道一些具体的使用场景,加油!动手!动手!动手!