Mybatis使用注解开发

    科技2022-08-17  100

    lyz的自学笔记

    文章目录

    一、使用注解开发1、面向接口开发2、使用注解开发3、Mybatis的执行流程4、使用注解实现CRUD


    一、使用注解开发

    1、面向接口开发

    在真正的开发中,很多时候会选择面向接口编程 根本原因:解耦可扩展,提高复用,分层开发中,上层不用管具体的实现,大家都遵守共同的标准,使得开发变得容易,规范性更好

    1、关于接口的理解

    接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离

    2、 接口应有两类:

    第一类是对一个个体的抽象,他可对应为一个抽象体第二类是对一个个体某一方面的抽象,即形成一个抽象面一个体有可能有多个抽象面,抽象体育抽象面是区别的

    3、三个面向的区别

    面向对象:以对象为单位,考虑他的属性和方法面向过程:以一个具体的流程(事务过程)为单位,考虑它的实现接口设计与非接口设计是针对复用技术而言的,与面对象向(过程)不是一个问题,更多的体现就是对系统整体的架构

    2、使用注解开发

    (1)、配置接口UserMapper,在抽象方法上面使用注解

    @Select("select * from user") List<User> getUsers();

    (2)、因为使用的是注解开发,也就不需要映射文件了,但还是需要去mybatis配置文件中注册

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

    (3)、测试

    @Test public void Test(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> users = mapper.getUsers(); for (User user : users) { System.out.println(user); } sqlSession.close(); }

    (4)、结果,因为数据库字段名和实体类属性名不一致,导致免疫查询到password 使用注解来映射简单语句会使代码更加简洁,然而对于稍微复杂一点的语句,注解就力不从心了,并且显得更加混乱,所以如果要完成复杂的事情,最好使用XML类映射语句

    3、Mybatis的执行流程

    (1)创建SqlSessionFactoryBuilder实例 (2)解析配置文件流XMLConfigBuilder (3)Configuration所有的配置信息 (4)SqlSessionFactory实例化 (5)transaction事务管理器 (6)创建executor执行器 (7)创建SqlSession (8)实现CRUD,成功则继续下一步,不成功就会回滚 (9)查看是否成功,成功则继续,不成功就会回滚 (10)提交事务,并且关闭连接

    4、使用注解实现CRUD

    我们可以在工具类创建的时候设置自动提交,也就是在使用openSession()方法的时候给一个参数,值为true,但是真正开发的时候不要使用自动提交,不然可能会出现问题

    例:查询 (1)修改Mybatis工具类

    public static SqlSession getSqlSession(){ return sqlsessionfactory.openSession(true); }

    (2)在接口中创建一个抽象方法(当方法中有多个基本数据类型的参数时,就必须使用@Param注解为参数起别名,那么在使用sql语句的时候参数使用的必须也是自己起的别名)

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

    (3)测试

    @Test public void Test1(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User par = mapper.getUserById(1, "张三"); System.out.println(par); sqlSession.close(); }

    (4)结果

    例:插入 (1)在接口中定义一个抽象方法,使用@Insert注解实现数据的插入

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

    (2)测试

    @Test public void addUser(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int i = mapper.addUser(new User(7,"hello","123456")); System.out.println(i); sqlSession.close(); }

    例:修改 (1)在接口中定义一个抽象方法

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

    (2)测试

    @Test public void updateUser(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int i = mapper.updateUser(new User(7,"赵九","123456")); System.out.println(i); sqlSession.close(); }

    例:删除 (1)在接口中定义一个删除的抽象方法

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

    (2)测试

    @Test public void deleteUser(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int i = mapper.deleteUser(7); System.out.println(i); sqlSession.close(); }

    关于@Param()注解

    基本数据类型的参数或者String类型,需要加上(只有一个基本数据类型不用加)引用数据类型不需要加我们在SQL中引用的就是我们在@Param中设定的属性名
    Processed: 0.015, SQL: 9