Mybatis-注解的CRUD

259 阅读2分钟
  1. 使用注解开发和使用接口类的xml配置文件开发的区别:
    • 使用注解开发,只需要改两个文件(接口类、测试类)
    • 使用接口类的xml配置文件开发,要修改三个文件(接口类、接口类的xml配置文件、测试类)
    • 使用注解开发,只能实现简单的CRUD
    • 推荐使用 接口类的xml配置文件开发 条件思路分明
  2. 使用注解实现CRUD的步骤
    • 在接口上写注解
    • 在核心配置文件绑定接口
    • 测试类测试
  3. 举例子

接口的注解:需要导入import org.apache.ibatis.annotations.*;这个包

    @Select("select * from user where id=#{id}")
    User getUserById(int id);

    @Insert("insert into user (id,name,pwd) values (#{id},#{name},#{pwd})")
    int insertUser(User user);

    @Delete("delete from user where id=#{id}")
    int deleteUser(int id);

    @Update("update user set id=#{id},pwd=#{pwd} where name=#{name}")
    int updateUser(User user);

在核心配置文件绑定接口

    <mappers>
        <mapper class="com.wu.dao.UserMapper"/>
    </mappers>

测试类的修改就和之前的一样,在这里我就不举例了

  1. 注意一个注解 @Param@Param 可以用来设置一个以上的基本类型的参数或者String类型的参数。比如说,我们要查找 id=1,name=小红的人的密码

接口类注解

    @Select("select pwd from user where id=#{id} and name=#{name}")
    String select(@Param("id")int id,@Param("name")String name);

测试类

        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        String pwd = mapper.select(1, "小红");
        System.out.println(pwd);

        sqlSession.close();

结果:

image.png

注意:@Param里面的参数的值是查询所取到的值 ,比如说,把上面那个接口类的注解代码改成

    @Select("select pwd from user where id=#{id} and name=#{name}")
    String select(@Param("pid")int id,@Param("name")String pname);

则取到的查询的参数为 pid 和 name ,因为pid没有,会报错。

image.png

  1. 细心的人会发现,在我的测试类中,没有书写sqlSession.commit();,但是在进行增删改的时候,事务自动提交了,这又是怎么回事呢?其实很简单,我就是将工具类中的 sqlSessionFactory.openSession(true); 由原来的没有参数,到将参数输入true,这样子,事务就自动提交了,不需要我们书写了,原来没有参数,默认为false,意为事务不自动提交。

  2. #{}和${}的区别

    • 使用#时:
      1. 用来传入参数,sql在解析的时候会加上" ",当成字符串来解析
      2. #{}能够很大程度上防止sql注入;
    • 使用${}时:
      1. 用${}传入数据直接显示在生成的sql中,无法防止sql注入;
      2. $一般用入传入数据库对象,比如数据库表名
    • 建议使用#{}方式