ORM对比图

框架对比 Spring JDBC Spring Data Jpa 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接口即可

package com.david.dao;

import com.david.bean.Cat;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select; import java.util.List; //声明一个mybatis的dao接口,会被spring boot扫描到
@Mapper
public interface MyBatisDao {
//声明一个查询方法,相应的增删改使用@Insert @Delete @Update
@Select("select * from Cat where id = #{id}")
List<Cat> findById(Cat param);
}

扫描Mapper

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

驼峰命名

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

mybatis.configuration.mapUnderscoreToCamelCase=true

结果映射@Results

  如果结果集不是java对象而是map,map中的列名回合数据库中的NN_NN一样,是不会自动驼峰转换的,可以使用@Result来指明结果映射,同时也适用java对象。

@Mapper
public interface MyBatisDao {
@Select("select * from Cat where id = #{id}")
List<Cat> findById(Cat param); @Results({
@Result(property = "catName", column = "cat_name"),
@Result(property = "catAge", column = "cat_age")
})
@Select("select * from Cat")
List<Map> findAll(Cat param);
}

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

可复用的@Results

  声明时给id赋值为cat

public interface MyBatisDao {

    @Results(id="cat",value={
@Result(property = "catName", column = "cat_name"),
@Result(property = "catAge", column = "cat_age")
})
@Select("select * from Cat")
List<Map> findAll(Cat param); @ResultMap("cat")
@Select("select * from Cat where id = #{id}")
List<Cat> findById(Cat param); }

在其他方法中直接@ResultMap("cat")即可重复适用id为cat的结果映射

打印SQL日志到控制台

  在application.properties中添加以下配置

logging.level.你的包名.mybatis接口包=debug 
logging.level.org.springframework=WARN
logging.level.com.david.dao.MyBatisDao=DEBUG
#输出日志文件,默认不输出
logging.file=logs/spring-boot-logging.log
#修改日志级别,默认为INFO
logging.level.root=DEBUG

执行SQL时,会在控制台打印sql日志,并记录到日志里去

@RestController
public class HelloController { @Resource
private MyBatisDao myBatisDao; @GetMapping("/findAll")
public List<Map> findAll() {
return myBatisDao.findAll();
}

分页

  分页逻辑写在service层

@Service
@Transactional
public class MyBatisService { @Resource
private MyBatisDao myBatisDao; public Page<Cat> findAll(){
//分页插件:查询第1页,每页10行
Page<Cat> page = PageHelper.startPage(1,10);
myBatisDao.findAll();
//数据表的总行数
page.getTotal();
//分页查询结果的总行数
page.size();
//第一个cat对象
page.get(0);
return page;
} }

controller

@RestController
public class HelloController { @Autowired
private MyBatisService myBatisService; @GetMapping("/findAll")
public Page<Cat> findAll() {
return myBatisService.findAll();
}

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

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

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

回传ID

  数据库的id主键是自增长的,添加一条数据后,想得到这条自动增长的id,在dao层添加以下代码

@Mapper
public interface MyBatisDao {
@Insert("insert into Cat (cat_name,cat_age) values (#{catName},#{catAge})")
@Options(useGeneratedKeys = true,keyProperty = "id")
int insert(Cat cat);
}

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

keyProperty="id":把主键存入Cat cat对象的id属性

service

    public int insert(Cat cat){
return myBatisDao.insert(cat);
}

controller

    @GetMapping("/addCat")
public int insert(){
Cat cat = new Cat();
cat.setCatAge(18);
cat.setCatName("mimi");
myBatisService.insert(cat);
return cat.getId(); //回传id
}

存储过程

  创建一个mysql存储过程,传入一个id值,根据这个id查询出name并传出参数

CREATE DEFINER=`root`@`localhost` PROCEDURE `helloPROC`(IN id_in int,out name_out varchar(10))
BEGIN
select cat_name into name_out from cat where id = id_in;
END

dao层

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

mode=OUT:传出参数,就是cat.catName

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

    @Select("call helloPROC(#{id,mode=IN,jdbcType=INTEGER},#{catName,mode=OUT,jdbcType=VARCHAR})")
@Options(statementType = StatementType.CALLABLE)
void call(Cat cat);

service层

    public void call() {
Cat cat = new Cat();
cat.setId(2);
myBatisDao.call(cat);
System.out.print(cat.getCatName());
}

调用方法 返回tom.

Spring Boot (9) mybatis全注解化的更多相关文章

  1. spring boot(7)-mybatis全注解化

    关于配置数据库可以参考上一篇文章,这里只讲mybatis pom.xml <!-- 引入mybatis --> <dependency> <groupId>org. ...

  2. Spring Boot 实战 —— MyBatis(注解版)使用方法

    原文链接: Spring Boot 实战 -- MyBatis(注解版)使用方法 简介 MyBatis 官网 是这么介绍它自己的: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过 ...

  3. Spring Boot整合MyBatis(非注解版)

    Spring Boot整合MyBatis(非注解版),开发时采用的时IDEA,JDK1.8 直接上图: 文件夹不存在,创建一个新的路径文件夹 创建完成目录结构如下: 本人第一步习惯先把需要的包结构创建 ...

  4. 详解spring boot mybatis全注解化

    本文重点介绍spring boot mybatis 注解化的实例代码 1.pom.xml //引入mybatis <dependency> <groupId>org.mybat ...

  5. Spring Boot 整合 Mybatis Annotation 注解的完整 Web 案例

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 公司需要人.产品.业务和方向,方向又要人.产品.业务和方向,方向… 循环』 本文提纲一. ...

  6. spring boot项目mybatis配置注解+配置文件

    maven依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-ja ...

  7. spring boot整合mybatis基于注解开发以及动态sql的使用

    让我们回忆一下上篇博客中mybatis是怎样发挥它的作用的,主要是三类文件,第一mapper接口,第二xml文件,第三全局配置文件(application.properties),而今天我们就是来简化 ...

  8. 【spring boot】14.spring boot集成mybatis,注解方式OR映射文件方式AND pagehelper分页插件【Mybatis】pagehelper分页插件分页查询无效解决方法

    spring boot集成mybatis,集成使用mybatis拖沓了好久,今天终于可以补起来了. 本篇源码中,同时使用了Spring data JPA 和 Mybatis两种方式. 在使用的过程中一 ...

  9. Spring Boot的MyBatis注解:@MapperScan和@Mapper(十七)

    1.Spring Boot与MyBatis融合的矛盾问题: Spring家族的使命就是为了简化而生,但是随着Spring的发展壮大,有点事与愿违了.为了坚持初心,Spring家族祭出了一大杀器---S ...

随机推荐

  1. idea中配置xml不自动提示解决方案

    1.打开设置File-->Settings(或者Ctrl + Alt + S)--->Languages&Frameworks-->Schemas and DTDS 2.选择 ...

  2. Day 11 文件和异常

    文件和异常 在实际开发中,常常需要对程序中的数据进行持久化操作,而实现数据持久化最直接简单的方式就是将数据保存到文件中.说到“文件”这个词,可能需要先科普一下关于文件系统的知识,对于这个概念,维基百科 ...

  3. enote笔记语言(5)——其他

    章节:其他   ((主:单词))                               用来醒目地强调这个句子中哪个词语作主语 sentence:                         ...

  4. Django REST framework 自定义(认证、权限、访问频率)组件

    本篇随笔在 "Django REST framework 初识" 基础上扩展 一.认证组件 # models.py class Account(models.Model): &qu ...

  5. fork()调用使子进程先于父进程被调度

    由于内核使用写时复制机制,fork之后父子进程是共享页表描述符的,如果让父进程先执行,那么有很大几率父进程会修改共享页表指向的数据,那么内核此时必须给父进程分配并复制新的页表供父进程修改使用,那么如果 ...

  6. [数据结构]C#顺序表的实现

    在数据结构的学习当中,想必C++可能是大家接触最多的入门语言了 但是C#的数据结构却很少看到,今天我写了一个C#顺序表的顺序存储结构 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是 ...

  7. 【Codeforces 1B】Spreadsheets

    [链接] 我是链接,点我呀:) [题意] A~Z分别对应了1~26 AA是27依次类推 让你完成双向的转换 [题解] 转换方法说实话特别恶心>_< int转string 得像数位DP一样一 ...

  8. 【Mail.Ru Cup 2018 Round 2 B】 Alice and Hairdresser

    [链接] 我是链接,点我呀:) [题意] [题解] 因为只会增加. 所以. 一开始暴力算出来初始答案 每次改变一个点的话. 就只需要看看和他相邻的数字的值就好. 看看他们是不是大于l 分情况增加.减少 ...

  9. 【[Offer收割]编程练习赛14 D】剑刃风暴(半径为R的圆能够覆盖的平面上最多点数目模板)

    [题目链接]:http://hihocoder.com/problemset/problem/1508 [题意] [题解] 求一个半径为R的圆能够覆盖的平面上的n个点中最多的点数; O(N2log2N ...

  10. Java基础学习总结(24)——Java单元测试之JUnit4详解

    Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @BeforeClass 全局只会执行一次,而且是第一个运行 @Before  ...