Mybatis-使用注解开发


在JSP中使用servlet的时候需要先在web.xml中配置相关的servlet类才能正常使用,然后还有一种快捷的方式就是使用@WebServlet的快速开发。在之前的MyBatis中也都是使用的xml文件的配置,然后这个是说说用注解的方式使用Mybatis。

利用注解开发

  • sql 类型主要分成 :

    • @select ()
    • @update ()
    • @Insert ()
    • @delete ()

使用了注解开发后就不再需要mapper.xml的配置文件了。

注解开发步骤

  1. 在我们的接口中添加注解
    /**
     * 查询全部用户
     * @return
     */
    @Select("select * from user")
    public List<User> getAllUser();
  1. 在mybatis的核心配置文件中注入
<!--使用class绑定接口-->
<mappers>
   <mapper class="com.kailong.mapper.UserMapper"></mapper>
</mappers>
  1. 测试
    @Test
    public void testGetAllUser(){
        SqlSession sqlSession = MybatisUtils.getSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.getAllUser();
        for (User user:users){
            System.out.println(user);
        }
        sqlSession.close();
    }
  1. 测试结果

image

  1. 利用Debug查看本质

image

  1. 本质上利用了jvm的动态代理机制

image

  1. Mybatis详细的执行流程

image

注解增删改

改造MybatisUtils工具类的getSession( ) 方法,重载实现。

//获取SqlSession连接
  public static SqlSession getSession(){
      return getSession(true); //事务自动提交
  }
 
  public static SqlSession getSession(boolean flag){
      return sqlSessionFactory.openSession(flag);
  }

注意:确保实体类和数据库字段对应

查询

  1. 编写接口方法注解
    /**
     * 根据Id查询用户
     * @param id
     * @return
     */
    @Select(" select * from user where id = #{id}")
    User selectUserById(@Param("id")int id);
  1. 测试
@Test
public void testSelectUserById() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);

   User user = mapper.selectUserById(1);
   System.out.println(user);

   session.close();
}
  1. 测试结果

image

新增

  1. 编写接口方法注解
/**
 * 添加用户
 * @param user
 * @return
 */
@Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})")
int addUser(User user);
  1. 测试
@Test
public void testAddUser() {
    SqlSession session = MybatisUtils.getSession();
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = new User(5,"愚生浅末","123456");
    int i = mapper.addUser(user);
    System.out.println(i);
    session.commit(); //提交事务,重点!不写的话不会提交到数据库
    session.close();
}
  1. 测试结果

image

image

修改

  1. 编写接口方法注解
/**
 * 根据ID修改用户的信息
 * @param user
 * @return
 */
@Update("update user set name=#{name},pwd=#{pwd} where id = #{id}")
int updateUser(User user);
  1. 测试
@Test
public void testUpdateUser() {
    SqlSession session = MybatisUtils.getSession();
    UserMapper mapper = session.getMapper(UserMapper.class);

    User user = new User(5, "愷龍test", "kailong");
    mapper.updateUser(user);

    session.close();
}
  1. 测试结果

image

image

删除

  1. 编写接口方法注解
/**
 * 根据Id删除用户
 * @param id
 * @return
 */
@Delete("delete from user where id = #{id}")
int deleteUser(@Param("id")int id);
  1. 测试
@Test
public void testDeleteUser() {
    SqlSession session = MybatisUtils.getSession();
    UserMapper mapper = session.getMapper(UserMapper.class);
    mapper.deleteUser(5);
    session.close();
}
  1. 测试结果

image

image

注意:增删改一定记得对事务的处理!

关于@Param

@Param注解用于给方法参数起一个名字。以下是总结的使用原则:

  • 在方法只接受一个参数的情况下,可以不使用@Param。
  • 在方法接受多个参数的情况下,建议一定要使用@Param注解给参数命名。
  • 如果参数是 JavaBean , 则不能使用@Param。
  • 不使用@Param注解时,参数只能有一个,并且是Javabean。

#与$的区别

  • #{} 的作用主要是替换预编译语句(PrepareStatement)中的占位符? 【推荐使用】

    INSERT INTO user (name) VALUES (#{name});
    INSERT INTO user (name) VALUES (?);
    
  • ${} 的作用是直接进行字符串替换

    INSERT INTO user (name) VALUES ('${name}');
    INSERT INTO user (name) VALUES ('kailong');
    

使用注解和配置文件协同开发,才是MyBatis的最佳实践!

公众号本文地址:https://mp.weixin.qq.com/s/YsZgx7VtB18PsJkUgn7Ntg
欢迎关注公众号:愚生浅末。

posted @ 2022-12-31 17:32  愚生浅末  阅读(83)  评论(0编辑  收藏  举报