详解spring boot mybatis全注解化

 更新时间:2017年09月25日 11:15:06   作者:给人生一个梦  
这篇文章主要介绍了spring boot mybatis全注解化的相关资料,需要的朋友可以参考下

本文重点给大家介绍spring boot mybatis 注解化的实例代码,具体内容大家参考下本文:

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> 

基本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值

扫描Mapper

@MapperScan("hello.dao")

在配置类上添加以上注解,可以扫描dao包中的所有接口,替代在每个dao中写@Mapper注解,不过这样会提高耦合度。而@Mapper可以与dao自成一体,与@Controller、@Service遥相呼应,整体结构更优雅

驼峰命名

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

mybatis.configuration.mapUnderscoreToCamelCase=true 

结果映射@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>

可复用的@Results

声明时给id赋值为user

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

在其他 方法中,重复使用id为user的结果映射

@ResultMap("user")

打印SQL日志到控制台

在application.properties中添加以下配置

logging.level.你的包名.mybatis接口包=debug 

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

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

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

第三行:查到一行数据

分页

首先要在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对象的相关参数赋值

回传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()); 

控制台

存储过程

这是一个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()); 

执行结果

总结

以上所述是小编给大家介绍的spring boot mybatis全注解化,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • 在SpringBoot中实现一个订单号生成系统的示例代码

    在SpringBoot中实现一个订单号生成系统的示例代码

    在Spring Boot中设计一个订单号生成系统,主要考虑到生成的订单号需要满足的几个要求:唯一性、可扩展性、以及可能的业务相关性,本文给大家介绍了几种常见的解决方案及相应的示例代码,需要的朋友可以参考下
    2024-02-02
  • HttpServletRequest对象简介_动力节点Java学院整理

    HttpServletRequest对象简介_动力节点Java学院整理

    这篇文章主要为大家详细介绍了HttpServletRequest对象简介的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Java中clone方法使用笔记

    Java中clone方法使用笔记

    clone顾名思义是复制,在Java语言中,clone方法被对象调用,所以会复制对象,下面这篇文章主要给大家介绍了关于Java中clone方法使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • SpringAOP中的通知Advice解析

    SpringAOP中的通知Advice解析

    这篇文章主要介绍了SpringAOP中的通知Advice解析,AOP 中的通知是基于连接点业务逻辑的一种增强,Spring AOP 可以基于 XML 方式和基于注解方式定义,只是写法不同,这里只使用注解的方式来讲解通知的详细用法,需要的朋友可以参考下
    2023-09-09
  • Spring Security6 最新版配置及实现动态权限管理

    Spring Security6 最新版配置及实现动态权限管理

    Spring Security 在最近几个版本中配置的写法都有一些变化,很多常见的方法都废弃了,并且将在未来的 Spring Security7 中移除,因此又补充了一些新的内容,重新发一下,供各位使用 Spring Security 的小伙伴们参考,需要的朋友可以参考下
    2024-03-03
  • Java仿Windows记事本源代码分享

    Java仿Windows记事本源代码分享

    这篇文章主要为大家详细介绍了Java仿Windows记事本源代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • java 通过发送json,post请求,返回json数据的方法

    java 通过发送json,post请求,返回json数据的方法

    下面小编就为大家分享一篇java 通过发送json,post请求,返回json数据的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • springboot访问404问题的解决办法

    springboot访问404问题的解决办法

    工作中遇到url404问题,解决问题的进程比较崎岖,写篇文章记录,下面这篇文章主要给大家介绍了关于springboot访问404问题的解决办法,文中通过图文介绍的非常详细,要的朋友可以参考下
    2023-03-03
  • springboot整合mybatis实现数据库的更新批处理方式

    springboot整合mybatis实现数据库的更新批处理方式

    这篇文章主要介绍了springboot整合mybatis实现数据库的更新批处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Spring Boot实现分布式系统中的服务发现和注册(最新推荐)

    Spring Boot实现分布式系统中的服务发现和注册(最新推荐)

    在本文中,我们深入探讨了Spring Boot如何实现分布式系统中的服务发现和注册,我们使用Eureka作为服务注册中心,Ribbon作为负载均衡器,Hystrix作为熔断器,成功地实现了服务发现、服务注册、负载均衡和服务熔断等功能,需要的朋友参考下吧
    2023-06-06

最新评论