zoukankan      html  css  js  c++  java
  • 使用注解开发MyBatis

    1、面向接口编程

    • 大家之前都学过面向对象编程,也学习过接口,但在真正的开发中,很多时候我们会选择面向接口编程
    • 根本原因 : 耦合, 可拓展 , 提高复用 , 分层开发中 , 上层不用管具体的实现 , 大家都遵守共同的标准 , 使得开发变得容易 , 规范性更好
    • 在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了;
    • 而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。

    关于接口的理解

    • 接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。
    • 接口的本身反映了系统设计人员对系统的抽象理解。
    • 接口应有两类:
      • 第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class);
      • 第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface);
    • 一个体有可能有多个抽象面。抽象体与抽象面是有区别的。

    三个面向区别

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

    2、MyBatis注解开发

    mybatis最初配置信息是基于 XML ,映射语句(SQL)也是定义在 XML 中的。而到MyBatis 3提供了新的基于注解的配置。不幸的是,Java 注解的的表达力和灵活性十分有限。最强大的 MyBatis 映射并不能用注解来构建

    sql的主要注解组成:

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

    注意:利用注解开发就不需要mapper.xml映射文件了。

    使用注解的具体步骤:

    1. 在接口的方法上添加注解

      public interface UserMapper {
          // 查询全部用户
          @Select("select * from mybatis.user")
          List<User> getUsers();
      }
      
    2. 在mybatis核心配置文件中注入接口(非常重要

      <mappers>
          <!-- 使用class绑定接口 -->
          <mapper class="com.jh.mapper.UserMapper"/>
      </mappers>
      
    3. 测试

      @Test
      public void getUsers() {
          SqlSession sqlSession = MyBatisUtils.getSqlSession();
          // 使用jvm动态代理机制
          UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
          List<User> userList = userMapper.getUsers();
          for (User user : userList) {
              System.out.println(user);
          }
          sqlSession.close();
      }
      
    4. 使用debug查看执行过程

      image-20210111130640278

    5. 本质上是使用了JVM的动态代理

      image-20210111125719836

    3、mybatis详细执行过程

    4、使用注解实现CRUD

    • 修改MyBatis工具类

      public class MyBatisUtils {
      	// 不传入参数则默认不自动提交事务
          public static SqlSession getSqlSession() {
              return sqlSessionFactory.openSession();
          }
          // 调用该方法时,可指定是否启用自动提交事务
          public static SqlSession getSqlSession(boolean flag) {
              return sqlSessionFactory.openSession(flag);
          }
      }
      

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

    select查询

    1. 编写接口方法及注解

      public interface UserMapper {
          @Select("select * from mybatis.user where id = #{id}")
          User getUserById(int id);
      }
      
    2. 测试

      @Test
      public void getUserById() {
          SqlSession sqlSession = MyBatisUtils.getSqlSession();
          UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
          User user = userMapper.getUserById(1);
          System.out.println(user);
          sqlSession.close();
      }
      

    insert插入

    1. 编写接口方法及注解

      public interface UserMapper {
          @Insert("insert into mybatis.user(id,name,pwd) values(#{id},#{name},#{pwd})")
          int addUser(User user);
      }
      
    2. 测试

      @Test
      public void insertUser() {
          SqlSession sqlSession = MyBatisUtils.getSqlSession(true);
          UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
          int result = userMapper.addUser(new User(4,"hello","1234"));
          System.out.println(result);
          sqlSession.close();
      }
      

    update更新

    1. 编写接口方法及注解

      public interface UserMapper {
          @Update("update mybatis.user set name=#{name} where id=#{id}")
          int updateUser(User user);
      }
      
    2. 测试

      @Test
      public void updateUser() {
          SqlSession sqlSession = MyBatisUtils.getSqlSession(true);
          UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
          int result = userMapper.updateUser(new User(4,"hello","修改后的密码"));
          System.out.println(result);
          sqlSession.close();
      }
      

    delete删除

    1. 编写接口方法及注解

      public interface UserMapper {
          @Delete("delete from mybatis.user where id=#{id}")
          int deleteUser(int id);
      }
      
    2. 测试

      @Test
      public void deleteUser() {
          SqlSession sqlSession = MyBatisUtils.getSqlSession(true);
          UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
          int result = userMapper.deleteUser(4);
          System.out.println(result);
          sqlSession.close();
      }
      

    【注意】:增删改一定需要进行事务提交

    5、@Param注解

    @Param注解用于给方法参数起一个名字,使用原则如下:

    • 在方法只接受一个参数的情况下,可以不使用@Param。
    • 在方法接受多个参数的情况下,建议一定要使用@Param注解给参数命名。
    • 如果参数是 JavaBean , 则不能使用@Param。
    • 不使用@Param注解时,参数只能有一个,并且是Javabean。
    • 使用@Param注解后,取值时,取注解的定义的value。
    // 方法存在多个参数,每个参数前面必须加上@Param注解
    @Select("select * from mybatis.user where id = #{uid} and name = #{name}")
    User getUserById(@Param("uid")int id,@Param("name")String name);
    

    6、#{}与${}的区别

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

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

      INSERT INTO user (name) VALUES ('${name}');
      # 编译后是
      INSERT INTO user (name) VALUES ('hello');
      

    相当于JDBC中的PreparedStatementStatement

    总结:

    • 合理使用注解开发可以提高我们的开发效率。
    • 使用注解和配置文件协同开发,才是MyBatis的最佳实践!
    懂不懂,都是收获
  • 相关阅读:
    MySQL
    权限(二)
    权限(一)
    化栈为队
    栈的最小值
    实现简易版react中createElement和render方法
    12.整数转罗马数字
    call,apply,bind的理解
    8. 字符串转换整数 (atoi)
    172.阶乘后的0
  • 原文地址:https://www.cnblogs.com/paidaxing0623/p/14263067.html
Copyright © 2011-2022 走看看