Loading

mybatis-02 Mybatis的CRUD和其它基本操作

mybatis-02 mybatis的CRUD和其它基本操作

再次强调!!!xml 文件中的 namespqce 中的包名要和 mapper 接口保持一致!

默认条件下除查询之外的操作都需要提交!!!可以手动在创建 sqlSession 的时候通过构造器修改成自动提交。


3 CRUD

先来看看我们在 mapper 中编写的显而易见的一段 sql 的内容:

<select id="getUserList" resultType="com.ermao.pojo.User">
    select * from mybatis.user
</select>

第一眼望去就看了我们的 sql 语句,嘻嘻。然后就是一些个赋值语句,对于这些被赋值的语句,最最最常见的有:

名称 意义
id 对应接口中的方法名
resultType 返回值类型(全限定)
parameterType 参数类型(全限定)
…… ……

还可以使用#{参数名}的形式来直接使用参数,要注意,参数名可以是 pojo 类的 field,也可以是接口方法签名的参数。另外,出了查询之外的操作都需要通过 sqlSession 的 commit 进行提交,这么说有些模糊,咱们直接上代码:


select

根据姓用户id查找用户的全部信息

xml 代码:

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

java 代码:

// UserMapper 中
// 这里的 param 注解限定和指名了接口参数,这个名称将在 xml 文件中以 #{} 的形式被使用
User getUserByID(@Param("id") int id);


// 测试文件中
@Test
public void test02() {
    try (SqlSession sqlSession = MybatisUtils.getSqlSession()) {
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User userByID = mapper.getUserByID(1);
        System.out.println(userByID);
    }
}

执行结果:

User{id=1, name='ermao', pwd='123456'}

insert

根据字段信息插入新的用户

xml 文件:

<insert id="addUser">
    insert into mybatis.user (id, name, pwd)
    values (#{id}, #{name}, #{pwd})
</insert>

java 代码:

// UserMapper 中
int insertUser(@Param("id") int id, @Param("name") String name, @Param("pwd") String pwd);


@Test
public void test03() {
    try(SqlSession sqlSession = MybatisUtils.getSqlSession()) {
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int effected = mapper.insertUser(999, "jiumao", "123qwe");
        System.out.println(effected);
        //sqlSession.commit();	// 注意出了查询之外的其它操作都要通过 sqlSession 提交,否则不会生效,在这里为了不破坏表信息,不提交
    }
}

// 执行结果:1
// 说明数据库内确实被插入了一条新的用户记录

根据对象插入新的用户

xml 文件:

这次的 id,name,pwd 都是从传入的 User 对象中获取的。

<insert id="insertUserByUserObject" parameterType="com.ermao.pojo.User">
    insert into mybatis.user (id, name, pwd)
    values (#{id},#{name}, #{pwd})
</insert>

java 代码:

// UserMapper 中
int insertUserByUserObject(User user);


@Test
public void test04() {
    try (SqlSession sqlSession = MybatisUtils.getSqlSession()) {
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        // 在这里直接新建一个用户对象进行插入
        int effected = mapper.insertUserByUserObject(new User(789, "二毛", "111111"));
        System.out.println(effected);

        // 在这里进行插入结果的判断,成功则提交,失败则 rollback
        if (effected > 0) {
            sqlSession.commit();
        } else {
            sqlSession.rollback();
        }
    }
}

// 输出结果:1

如果在这里遇到了插入数据库的字段为乱码的情况,请从两个方面检查:IDE 环境编码和 MySQL 编码。

还有一点就是 mybatis 不支持 id 重载,也就是一条 sql 只能对应一个 id,一个 id 只能对应一条 sql,而不能根据传入的参数类型等信息进行重载!


update

根据用户对象更新

xml 文件:

参数也是从传入的用户对象中获取。

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

java 代码:

// UserMapper 中
int updateUserByUserObject(User user);

@Test
public void test05() {
    try (SqlSession sqlSession = MybatisUtils.getSqlSession()) {
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int effected = mapper.updateUserByUserObject(new User(4, "sanmao", "22222"));
        if (effected > 0) {
            sqlSession.commit();
        } else {
            sqlSession.rollback();
        }
    }
}

// 输出结果:1

delete

根据用户ID删除

xml 文件:

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

java 代码:


@Test
public void test06() {
   try (SqlSession sqlSession = MybatisUtils.getSqlSession()) {
      final UserMapper mapper = sqlSession.getMapper(UserMapper.class);
      int effected = mapper.deleteUserById(5);
      if (effected > 0) {
         sqlSession.commit();
      } else {
         sqlSession.rollback();
      }
   }
}

4 使用map传参

假如实体类中的字段过多,可以考虑使用 map 传递局部参数。因为如果直接传递所有参数的话会显得非常臃肿,毕竟谁也不喜欢搁函数实参那里摆一堆没有 IDE 提示都不知道是啥的变量吧。

xml 代码:

<insert id="addUser2" parameterType="map">
    insert into mybatis.user(id, name, pwd) values(#{userid}, #{username}, #{password})
</insert>

java 代码:

@Test
public void test07() {
    try (final SqlSession sqlSession = MybatisUtils.getSqlSession()) {
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        HashMap<String, Object> map = new HashMap<>();
        map.put("userid", 732);
        map.put("username", "aaa");
        map.put("password", "7777");

        int effected = mapper.insertUserByMap(map);
        if (effected > 0) {
            sqlSession.commit();
        }
    }
}

5 模糊查询

使用模糊查询时,要注意防止sql注入。下面两种方式都可行,且都是安全的,因为只要使用了#{}就可以防止sql注入了。

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

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

@Test
public void test08() {
    try (final SqlSession sqlSession = MybatisUtils.getSqlSession()) {
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.selectUserByNameLike("%三%");
        users.forEach(System.out::println);
    }
}

// User{id=4, name='张三', pwd='999'}
// User{id=5, name='李三', pwd='8888'}
posted @ 2021-10-08 16:17  槐下  阅读(41)  评论(0编辑  收藏  举报