文章内容
MyBatis Github上代码地址:https://github.com/mybatis/mybatis-spring-boot
关于在Spring Boot中集成MyBatis,可以选用基于注解的方式,也可以选择xml文件配置的方式。通过对两者进行实际的使用,还是建议使用XML的方式(官方也建议使用XML)。
一、通过xml配置文件方式
1、添加pom依赖
1 2 3 4 5 6 | < dependency > < groupId >org.mybatis.spring.boot</ groupId > < artifactId >mybatis-spring-boot-starter</ artifactId > <!-- 请不要使用1.0.0版本,因为还不支持拦截器插件,使用最新版本即可 --> < version >3.4.5</ version > </ dependency > |
2、创建接口Mapper和对应的Mapper.xml文件
定义相关方法,注意方法名称要和Mapper.xml文件中的id一致,这样会自动对应上
StudentMapper.java:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 | package com.ntan520.sample.mapper; import java.util.List; import com.ntan520.sample.entity.Student; /** * StudentMapper,映射SQL语句的接口,无逻辑实现 */ public interface StudentMapper extends MyMapper<Student> { List<Student> likeName(String name); Student getById( int id); String getNameById( int id); } |
MyMapper.java:
01 02 03 04 05 06 07 08 09 10 11 | ackage com.ntan520.sample.config.mybatis; import tk.mybatis.mapper.common.Mapper; import tk.mybatis.mapper.common.MySqlMapper; /** * 被继承的Mapper,一般业务Mapper继承它 */ public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> { //TODO //FIXME 特别注意,该接口不能被扫描到,否则会出错 } |
StudentMapper.xml:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <? xml version = "1.0" encoding = "UTF-8" ?> <! DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" < mapper namespace = "com.ntan520.sample.mapper.StudentMapper" > <!-- type为实体类Student,包名已经配置,可以直接写类名 --> < resultMap type = "Student" id = "stuMap" > < id property = "id" column = "id" /> < result property = "name" column = "name" /> < result property = "sumScore" column = "score_sum" /> < result property = "avgScore" column = "score_avg" /> < result property = "age" column = "age" /> </ resultMap > < select id = "getById" resultMap = "stuMap" resultType = "Student" > SELECT * FROM STUDENT WHERE ID = #{id} </ select > < select id = "likeName" resultMap = "stuMap" parameterType = "string" resultType = "list" > SELECT * FROM STUDENT WHERE NAME LIKE CONCAT('%',#{name},'%') </ select > < select id = "getNameById" resultType = "string" > SELECT NAME FROM STUDENT WHERE ID = #{id} </ select > </ mapper > |
3、实体类
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 | package com.ntan520.sample.entity; import java.io.Serializable; /** * 学生实体 */ public class Student implements Serializable { private static final long serialVersionUID = 2120869894112984147L; private int id; private String name; private String sumScore; private String avgScore; private int age; // get set 方法省略 } |
4、修改application.properties 配置文件
1 2 | mybatis.mapper-locations=classpath*:com/ntan520/sample/mapper/sql/mysql/*Mapper.xml mybatis.type-aliases-package=com.ntan520.sample.entity |
5、在Controller或Service调用方法测试
1 2 3 4 5 6 7 | @Autowired private StudentMapper stuMapper; @RequestMapping("/likeName") public List<Student> likeName(@RequestParam String name){ return stuMapper.likeName(name); } |
二、使用注解方式
1、启动类中添加@MapperScan注解
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 | @SpringBootApplication @MapperScan ( "com.ntan520.mapper" ) public class SampleMybatisApplication implements CommandLineRunner { @Autowired private CityMapper cityMapper; public static void main(String[] args) { SpringApplication.run(SampleMybatisApplication. class , args); } @Override public void run(String... args) throws Exception { System.out.println( this .cityMapper.findByState( "CA" )); } } |
2、在接口上使用注解定义CRUD语句
01 02 03 04 05 06 07 08 09 10 11 12 13 14 | package com.ntan520.mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import com.ntan520.domain.City; /** * @author Eddú Meléndez */ public interface CityMapper { @Select ( "SELECT * FROM CITY WHERE state = #{state}" ) City findByState( @Param ( "state" ) String state); } |
其中City就是一个普通Java类。
三、集成分页插件
这里与其说集成分页插件,不如说是介绍如何集成一个plugin。MyBatis提供了拦截器接口,可以实现自己的拦截器,将其作为一个plugin装入到SqlSessionFactory中。
Github上有位开发者写了一个分页插件,使用起来还可以,挺方便的。
Github项目地址: https://github.com/pagehelper/Mybatis-PageHelper
Spring在依赖注入bean的时候,会把所有实现MyBatis中Interceptor接口的所有类都注入到SqlSessionFactory中,作为plugin存在。既然如此,集成一个plugin便很简单了,只需要使用@Bean创建PageHelper对象即可。
使用方法:
1、添加pom依赖
1 2 3 4 5 | < dependency > < groupId >com.github.pagehelper</ groupId > < artifactId >pagehelper</ artifactId > < version >4.1.0</ version > </ dependency > |
2、新增MyBatisConfiguration.java
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package com.ntan520.sample.config; import java.util.Properties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.github.pagehelper.PageHelper; /** * MyBatis 配置 */ @Configuration public class MyBatisConfiguration { private static final Logger logger = LoggerFactory.getLogger(MyBatisConfiguration. class ); @Bean public PageHelper pageHelper() { logger.info( "注册MyBatis分页插件PageHelper" ); PageHelper pageHelper = new PageHelper(); Properties p = new Properties(); p.setProperty( "offsetAsPageNum" , "true" ); p.setProperty( "rowBoundsWithCount" , "true" ); p.setProperty( "reasonable" , "true" ); pageHelper.setProperties(p); return pageHelper; } } |
3、分页查询测试
1 2 3 4 5 | @RequestMapping ( "/likeName" ) public List<Student> likeName( @RequestParam String name){ PageHelper.startPage( 1 , 1 ); return stuMapper.likeName(name); } |
更多参数使用方法,详见PageHelper说明文档
四、HikariCP
SpringBoot默认使用org.apache.tomcat.jdbc.pool.DataSource,还有个HikariCP的JDBC连接池组件,据说其性能比常用的 c3p0、tomcat、bone、vibur这些要高很多。
把工程中的DataSource变更为HirakiDataSource,做法很简单:
首先在application.properties配置文件中指定dataSourceType
1 | spring.datasource.type=com.zaxxer.hikari.HikariDataSource |
然后在pom中添加Hikari的依赖
1 2 3 4 5 | < dependency > < groupId >com.zaxxer</ groupId > < artifactId >HikariCP</ artifactId > <!-- 版本号可以不用指定,Spring Boot会选用合适的版本 --> </ dependency > |