MyBatis大杂烩
1. 集成到SpringBoot项目中
核心依赖是org.mybatis.spring.boot:mybatis-spring-boot-starter,当然还需要jdbc和数据库驱动
build.gradle
buildscript {
repositories {
mavenCentral()
jcenter()
}
dependencies {
classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.0.3.RELEASE'
}
}
plugins {
id 'io.franzbecker.gradle-lombok' version '1.14'
}
apply plugin: 'java'
apply plugin: 'application'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'io.franzbecker.gradle-lombok'
mainClassName = 'bj.App'
dependencies {
compile 'org.springframework.boot:spring-boot-starter'
compile 'org.springframework.boot:spring-boot-starter-jdbc'
compile 'org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2'
compile 'org.projectlombok:lombok'
compile 'mysql:mysql-connector-java'
testCompile 'org.springframework.boot:spring-boot-starter-test'
}
repositories {
mavenCentral()
}
2. 配置数据库连接
application.yml
spring:
datasource:
username: foo
password: foo
url: jdbc:mysql://localhost:3306/foo
3. 使用MyBatis
需要先创建好相应的数据表
App.java
package bj;
import lombok.Data;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import javax.annotation.Resource;
/**
* Created by BaiJiFeiLong@gmail.com at 2018/6/26 下午1:51
*/
@SpringBootApplication
public class App implements ApplicationListener<ApplicationReadyEvent> {
@Resource
private AnimalMapper animalMapper;
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
System.out.println("Ready.");
Animal animal = animalMapper.findAnimalById(1);
System.out.println(animal);
System.out.println(animal.getName());
}
}
@Mapper
interface AnimalMapper {
@Select("SELECT * FROM animal WHERE id = #{id}")
Animal findAnimalById(int id);
}
@Data
class Animal {
private Integer id;
private String name;
}
4. 使用XML格式的Mapper文件
AnimalMapper(可以放到App.java中)
@Mapper
interface AnimalMapper {
Animal findAnimalById(int id);
}
animalMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="bj.AnimalMapper">
<select id="findAnimalById" resultType="bj.Animal">
select *
from animal
where id = #{id}
</select>
</mapper>
注意:mapper.xml文件默认放在Mapper.java文件同一目录下。如果需要指定其他目录,可以在application.yml中进行配置(注意星号):
mybatis:
mapper-locations: classpath*:*Mapper.xml
具体示例:查询ID范围并带分页
<select id="getIdIn" resultType="bj.Person">
SELECT *
FROM person
<where>
<if test="ids != null and !ids.isEmpty()">
id IN
<foreach collection="ids" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
</where>
<if test="pageable != null">
LIMIT #{pageable.pageSize} OFFSET #{pageable.offset}
</if>
</select>
List<Person> getIdIn(@Param("ids") List<Integer> ids, @Param("pageable") Pageable pageable);
5. SQL Builder 的使用
interface PersonMapper {
@Data
class MyProvider {
private String allSql = new SQL() {{
SELECT("*");
FROM("person");
}}.toString();
}
@SelectProvider(type = MyProvider.class, method = "getAllSql")
List<Person> getAll();
}
6. 分页
6.1 自带RowBounds分页
MyBatis自带一个RowBounds分页,这是个假分页,在SQL查询出全部结果后,才从中进行分页截取,在实际业务上基本是废柴一个(分分钟卡爆数据库)。用法:Mapper中的查询函数添加一个RowBounds参数即可,例如:
List<Person> findAll(RowBounds rowBounds);
6.2 自己写个简单分页
interface PersonMapper {
@Data
class MyProvider {
private String allSql = new SQL() {{
SELECT("*");
FROM("person");
}}.toString() + " LIMIT #{limit} OFFSET #{offset}";
}
@SelectProvider(type = MyProvider.class, method = "getAllSql")
List<Person> getAll(MyLimit limit);
}
@Data
class MyLimit {
private int limit;
private int offset;
}
不能用现成的org.apache.ibatis.session.RowBounds类型,不是纯POJO,MyBatis读不了(至少目前是)
使用SpringDataCommons自带的分页类进行分页查询
package bj;
import lombok.Data;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
/**
* Created by BaiJiFeiLong@gmail.com at 2018/6/26 下午1:51
*/
@SpringBootApplication
@MapperScan(basePackageClasses = App.class)
public class App implements ApplicationListener<ApplicationReadyEvent> {
@Resource
private PersonMapper personMapper;
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
personMapper.findAll(PageRequest.of(0, 2)).forEach(System.out::println);
}
}
@Data
class Person {
private Integer id;
private String username;
private String firstName;
private Date createdAt;
private String remark;
}
interface PersonMapper {
@Select("SELECT * FROM person LIMIT #{pageable.pageSize} OFFSET #{pageable.offset}")
List<Person> findAll(@Param("pageable") Pageable pageable);
}
如果需要组装分页结果,可以使用:
// 组装分页结果 没有查询total,先设为-1,以免造成歧义
// Page: org.springframework.data.domain.Page
// PageImpl: org.springframework.data.domain.PageImpl
Page<Person> personPage = new PageImpl<>(people, pageable, -1);
SpringDataCommons是SpringDataJpa的依赖,可以通过添加spring-boot-starter-data-jpa添加此依赖
6.3 MyBatisPlus分页
先引入依赖
compile 'com.baomidou:mybatis-plus-boot-starter:2.2.0'
Mapper类中查询函数加入分页参数
interface PersonMapper {
@Select("SELECT * FROM person ")
List<Person> findAll(Pagination pagination);
}
直接调用即可
personMapper.findAll(new Pagination(2, 2)).forEach(System.out::println);
注意:MyBatisPlus的分页页数基数是1。查询完成后,对应的Pagination会更新总数、页数等(不更内容,需要手动更新),此时查询Pagination可获得记录总数
MyBatisPlus查询的结果是List不是分页(区别于PageHelper)
6.4 PageHelper分页(TkMyBatis)
首先,注入一个MyBatis拦截器。必须设置helperDialect参数,否则会报空指针(NullPointerException)。
@Bean
public PageInterceptor pageInterceptor() {
PageInterceptor pageInterceptor = new PageInterceptor();
pageInterceptor.setProperties(new Properties() {{
this.setProperty("helperDialect", "mysql");
}});
return pageInterceptor;
}
用法:
(1). 直接使用RowBounds(PageHelper做了处理)
interface PersonMapper {
@Select("SELECT * FROM person ")
List<Person> findAll(RowBounds rowBounds);
}
(2). 添加PageRowBounds参数(可以获取记录总数。RowBounds不支持)
(3). 使用PageHelper.startPage
PageHelper.startPage(2, 2);
Page<Person> people = personMapper.findAll();
注意:
- startPage会把分页参数放在当前线程(通过ThreadLocal),执行完查询后会自动清理。如果不保证MyBatis查询会被执行,可以通过PageHelper.clearPage()清除状态
- PageHelper分页查询返回的结果是实现了List接口的Page类型(非分页查询也返回Page类型),可以在Mapper类中直接将返回类型定义为Page类型,省去类型强转
- PageHelper的分页页数基数也是1
interface PersonMapper {
@Select("SELECT * FROM person ")
Page<Person> findAll();
}
小技巧与提示
- 使用@MapperScan注解,开启自动扫描,每个Mapper类都可以省去@Mapper注解,例
@MapperScan(basePackageClasses = App.class) mybatis.type-aliases-package可以省去XML文件中实体类的包前缀mybatis.configuration.map-underscore-to-camel-case:可以将数据库的下划线命名法映射为java的驼峰命名法auto-mapping-unknown-column-behavior设为'failing',可以保证数据库查询到的每一列都进行了映射
文章首发链接:https://baijifeilong.github.io/2018/06/27/mybatis/
MyBatis大杂烩的更多相关文章
- SSM(Spring,SpringMVC,Mybatis)框架整合项目
快速上手SSM(Spring,SpringMVC,Mybatis)框架整合项目 环境要求: IDEA MySQL 8.0.25 Tomcat 9 Maven 3.6 数据库环境: 创建一个存放书籍数据 ...
- 【分享】标准springMVC+mybatis项目maven搭建最精简教程
文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...
- Java MyBatis 插入数据库返回主键
最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记. 类似下面这段代码一样获取插入后的主键 User user = new User ...
- [原创]mybatis中整合ehcache缓存框架的使用
mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...
- 【SSM框架】Spring + Springmvc + Mybatis 基本框架搭建集成教程
本文将讲解SSM框架的基本搭建集成,并有一个简单demo案例 说明:1.本文暂未使用maven集成,jar包需要手动导入. 2.本文为基础教程,大神切勿见笑. 3.如果对您学习有帮助,欢迎各种转载,注 ...
- mybatis plugins实现项目【全局】读写分离
在之前的文章中讲述过数据库主从同步和通过注解来为部分方法切换数据源实现读写分离 注解实现读写分离: http://www.cnblogs.com/xiaochangwei/p/4961807.html ...
- MyBatis基础入门--知识点总结
对原生态jdbc程序的问题总结 下面是一个传统的jdbc连接oracle数据库的标准代码: public static void main(String[] args) throws Exceptio ...
- Mybatis XML配置
Mybatis常用带有禁用缓存的XML配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...
- MyBatis源码分析(一)开篇
源码学习的好处不用多说,Mybatis源码量少.逻辑简单,将写个系列文章来学习. SqlSession Mybatis的使用入口位于org.apache.ibatis.session包中的SqlSes ...
随机推荐
- 设计原则之依赖倒置js
依赖倒置 定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象.(百科全书) 这个定义什么意思,太专业 感觉不像人话.. 什么叫高层模块,什么叫底层模块,什么叫 ...
- 第一个用IDEA写的程序——“前言中不允许有内容”
"前言中不允许有内容" 这是用IDEA写的第一个程序-- 它出现了一些问题 让人很难过 希望有人可以帮助解答,谢谢 程序是这样子的 运行完是这样显示的
- Linux下搭建ftp服务
Linux下ftp服务可以通过搭建vsftpd服务来实现,以CentOS为例,首先查看系统中是否安装了vsftpd,可以通过执行命令 rpm -qa | grep vsftpd 来查看是否安装相应的包 ...
- mySQL配置文件、备份与恢复
mysql配置文件 mysql的配置文件为/etc/my.cnf 配置文件查找次序:若在多个配置文件中均有设定,则最后找到的最终生效 /etc/my.cnf --> /etc/mysql/my. ...
- 【Git】 GitLab配置优化及汉化
GitLab配置 1.修改GitLab绑定的域名 a.修改/etc/gitlab/gitlab.rb配置文件,修改成自己的域名 external_url 'http://gitlab.example. ...
- 【Selenium】【BugList3】firefox与Selenium版本不兼容,报: Message: Unsupported Marionette protocol version 2, required 3
环境信息:Windows7 64位 + python 3.6.5 + selenium 3.11.0 +pyCharm 1 #coding=utf-8 2 from selenium import w ...
- poj3304(是否存在一条直线与所有给出线段相交
题意:给出n条线段,问你是否存在一条直线让他与所有线段相交. 思路:枚举两条直线的起点和终点做一条直线,看他是否与所有线段相交. #include<cstdio> #include< ...
- 常见bat(批处理)命令的语法规则
最近由于在做cocos2d的项目,需要用到一些bat命令,在此做些记录. bat命令用txt文本编辑就行,编辑完之后将后缀名改为bat即可运行.先来一个最简单的例子: @echo off echo \ ...
- canvas 旋转
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- JavaScript ~~ECMAScript
一.JavaScript 简介 HTML:从语义的角度,描述页面结构 CSS:从审美的角度,描述样式(美化页面) JavaScript:从交互的角度,描述行为(提升用户体验) 2.JavaScript ...