MyBatis学习笔记3、CRUD

3、CRUD

3.1、namespace

mapper.xml 中的 namespace 就是 DaoMapper 接口的全路径,必须一致。

3.2、select

id 属性就是对应的 namespace 中的方法名。

paramterType属性是 namespace 中的对应方法的接受参数类型。

resultType属性是 namespace 中的对应方法的返回类型。

例如:

<!-- id要和接口的方法名一致 resultType要写全名-->
<select id="getUserList" resultType="com.dzy.pojo.User">
    select * from mybatis.user
</select>

<select id="getUserById" parameterType="int" resultType="com.dzy.pojo.User">
    select * from mybatis.user where id = #{id}
</select>

3.3、insert

<!-- 对象中的属性可以直接取出来 #{id} 而不用 #{xx.id} -->
<insert id="addUser" parameterType="com.dzy.pojo.User">
    insert into mybatis.user (`id`, `name`, `pwd`) value (#{id},#{name},#{pwd})
</insert>

和select不同的是增删改需要提交事务。所以测试代码要多一句:

@Test
public void TestAddUser(){
    try(SqlSession session = MybatisUtils.getSqlSession()) {
        UserMapper mapper = session.getMapper(UserMapper.class);
        int r = mapper.addUser(new User(4, "王五", "654321"));
        System.out.println(r);
        // 提交事务,增删改需要提交事务
        if (r > 0) session.commit();
    }
}

3.4、update

<update id="updateUser" parameterType="com.dzy.pojo.User">
	update mybatis.user set `name` = #{name}, `pwd` = #{pwd} where `id` = #{id}
</update>

3.5、delete

<delete id="deleteUser" parameterType="int">
	delete from mybatis.user where id = #{id}
</delete>

3.6、万能的map

假设数据库中的表字段过多,就可以考虑使用map,map的优点在于可以不写完整个对象,值插入或修改一部分数据。但这并不是正规的写法。如插入时使用map:

<!-- 使用map时,#{}里的东西是map的key 可以乱写,可以不对应字段名 -->
<insert id="addUser2" parameterType="map">
	insert into mybatis.user (`id`, `name`) value (#{keyi},#{xiaxie})
</insert>

测试用例:

@Test
public void addUser2() {
	try (SqlSession session = MybatisUtils.getSqlSession()) {
    	UserMapper mapper = session.getMapper(UserMapper.class);
    	Map<String, Object> map = new HashMap<>();
    	map.put("keyi", "5");   // 和mapper.xml中#{}里的字符对应
    	map.put("xiaxie", "Hello");

		int r = mapper.addUser2(map);
		System.out.println(r);
		// 提交事务,增删改需要提交事务
		if (r > 0) session.commit();
	}
}

又如查询时使用map,可以传递 map.size() 个参数:

<select id="getUserByNameAndPwd" parameterType="map" resultType="com.dzy.pojo.User">
	select * from mybatis.user where `name` = #{key1} and `pwd` = #{key2}
</select>

测试用例:

@Test
public void TestSelectByNameAndPwd() {
    try (SqlSession session = MybatisUtils.getSqlSession()) {
        UserMapper mapper = session.getMapper(UserMapper.class);
        Map<String, Object> map = new HashMap<>();
        map.put("key1", "张三");
        map.put("key2", "123456");
        User user = mapper.getUserByNameAndPwd(map);
        System.out.println(user);
    }
}

常规的方法是通过实体类对象把值取出来,用 map 是使用 map 中的 key 把值取出来。

3.7、模糊查询

这里不加 parameterType 属性也可以运行

<select id="getUserLike" resultType="com.dzy.pojo.User">
    select * from mybatis.user where name like #{value}
</select>

测试用例:

@Test
public void selectLike() {
    try (SqlSession session = MybatisUtils.getSqlSession()) {
        UserMapper mapper = session.getMapper(UserMapper.class);
        List<User> userList = mapper.getUserLike("李%");
        for (User user : userList) {
            System.out.println(user);
        }
    }
}

最后附上com.dzy.pojo.User接口:

public interface UserMapper {
    List<User> getUserList();
    List<User> getUserLike(String value);
    User getUserById(int id);
    User getUserByNameAndPwd(Map<String, Object> map);
    int addUser(User user);
    int addUser2(Map<String, Object> map);
    int updateUser(User user);
    int deleteUser(int id);
}

注意:

  • 增删改需要提交事务
  • 如果sqlSessionFactory.openSession(true);就是自动提交事务。
  • 为什么不写parameterType也可以运行成功? 因为mybatis能自动识别,但返回值类型不能不写
发布了41 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/dzydzy7/article/details/104951315
今日推荐