zoukankan      html  css  js  c++  java
  • 详解spring boot mybatis全注解化

      本文重点介绍spring boot mybatis 注解化的实例代码

    1、pom.xml

    //引入mybatis
    <dependency> 
      <groupId>org.mybatis.spring.boot</groupId> 
      <artifactId>mybatis-spring-boot-starter</artifactId> 
      <version>1.3.0</version> 
    </dependency> 
    // mybatis分页插件
    <dependency> 
      <groupId>com.github.pagehelper</groupId> 
      <artifactId>pagehelper-spring-boot-starter</artifactId> 
      <version>1.1.1</version> 
    </dependency>

    2、基本SQL操作

      spring boot已经自动实现了mybatis所有配置,直接写dao接口即可

    @Mapper
    public interface MybatisDao { 
      @Select("select * from user where id = #{id}") 
      public List<User> findById(User param);

      @Mapper:声明一个mybatis的dao接口,会被spring boot扫描到

      @Select:声明一个查询方法,相应的增、删、改使用:@Insert、 @Delete、 @Update

      List<User>:返回集合。如果只返回一个结果,返回值是User。如果是增、删、改方法,返回值是int

      User param:传参,#{id}就是param对象的id值

    3、扫描Mapper

    @MapperScan("hello.dao")

      在配置类上添加以上注解,可以扫描dao包中的所有接口,替代在每个dao中写@Mapper注解,不过这样会提高耦合度

      而@Mapper可以与dao自成一体,与@Controller、@Service遥相呼应,整体结构更优雅

    4、驼峰命名

      在properties中添加以下配置,在执行查询后,可以将数据库的NN_NN格式字段,在java结果集对象中自动转换成驼峰命名参数

    mybatis.configuration.mapUnderscoreToCamelCase=true

    5、结果映射@Results

      如果结果集不是JAVA对象而是Map,map中的列名会和数据库中的NN_NN一样,是不会自动驼峰转换的

      可以使用@Result来指明结果映射,同样也适用JAVA对象

    @Results({ 
      @Result(property="nnNn",column="NN_NN")   
    }) 
    @Select("select * from user")   
    public List<Map> findAll();

      使用List<Map>不用去维护pojo,适于用数据库字段不确定或经常变化的场景。但是程序的可读性、可维护性不如List<User>

    6、可复用的@Results

      声明时给id赋值为user

    @Results(id="user",value={ 
      @Result(property="nnNn",column="NN_NN") 
    })

      在其他方法中,重复使用id为user的结果映射:@ResultMap("user")

    7、打印SQL日志到控制台

      在application.properties中添加以下配置:logging.level.你的包名.mybatis接口包=debug 

      执行SQL时,会在控制台打印SQL日志

      第一行:==>左边是执行SQL的接口及其方法,右边是执行语句

      第二行:传参数1,String类型

      第三行:查到一行数据

    8、分页

      首先要在pom.xml中引入文章开头的分页插件,分页逻辑写在service层。

    @Service
    @Transactional
    public class HelloServiceImpl { 
      @Autowired
      MybatisDao mybatisDao; 
      public void find(){  
        //分页插件: 查询第1页,每页10行 
        Page<User> page =PageHelper.startPage(1, 10);  
        mybatisDao.findAll();  
        //数据表的总行数 
        page.getTotal(); 
        //分页查询结果的总行数 
        page.size(); 
        //第一个User对象,参考list,序号0是第一个元素,依此类推 
        page.get(0); 
      }

      执行原理:

      PageHelper.startPage会拦截下一个sql,也就是mybatisDao.findAll()的SQL。并且根据当前数据库的语法,把这个SQL改造成一个高性能的分页SQL,同时还会查询该表的总行数,具体可以看SQL日志。

      PageHelper.startPage和mybatisDao.findAll()最好紧跟在一起,中间不要有别的逻辑,否则可能出BUG

      Page<User> page:相当于一个list集合,findAll()方法查询完成后,会给page对象的相关参数赋值

    9、回传ID

      假设数据库表的ID主键是自动增长的,现在添加一条数据,想要得到这条数据自动增长的ID,方法如下

      dao层

      useGeneratedKeys=true:获取数据库生成的主键

      keyProperty="id":把主键值存入User param对象的id属性

    @Insert("insert into user(name) values(#{name})") 
    @Options(useGeneratedKeys=true,keyProperty="id")  
    public int add(User param);

      service层

    User user = new User(); 
    user.setName("tom"); 
    mybatisDao.add(user); 
    System.out.println("回传ID值:"+user.getId());

    10、控制台

      存储过程

      这是一个mysql存储过程,传入一个id值,根据这个id查询出name值并且做为传出参数

    DELIMITER $$ 
    CREATE PROCEDURE `hello`(IN id_in VARCHAR(10),OUT name_out VARCHAR(10)) 
    BEGIN 
         SELECT NAME INTO name_out FROM USER WHERE id=id_in; 
      END$$ 
    DELIMITER ;

      dao层

      mode=IN:传入参数,就是user.id

      mode=OUT:传出参数,就是user.name

      StatementType.CALLABLE:说明这是一个存储过程

    @Select("call hello(#{id,mode=IN,jdbcType=VARCHAR},#{name,mode=OUT,jdbcType=VARCHAR})") 
    @Options(statementType= StatementType.CALLABLE ) 
    public void call(User user);

      service层

    public void call(){ 
      User user = new User(); 
      user.setId("14"); 
      mybatisDao.call(user); 
      System.out.println(user.getName());
    }

      执行结果

  • 相关阅读:
    (LeetCode 141/142)Linked List Cycle
    (算法)随机播放歌曲
    (数组)数组排序,使所有奇数在左边,所有偶数在右边
    遗失的乔布斯访谈(文字版)
    幻想·梦想·理想
    立刻辞职,时不我待
    彩票漏洞让你快速致富
    剪刀石头布常胜秘笈
    9个心理学研究,让你学习更高效
    石头剪刀布手套:不止是寂寞宅的消遣
  • 原文地址:https://www.cnblogs.com/goloving/p/9125948.html
Copyright © 2011-2022 走看看