前言
本节我们将学习一下SpringBoot整合Mybatis,首先说明一下,SpringBoot 整合Mybatis主流的由两种:基于注解形式的,基于配置形式的(推荐使用。)
基于注解的整合
我之前有些过一篇,请移步至:SpringBoot构建微服务实战 之 整合Mybatis(一)
基于配置的整合
首先SpringBoot 以配置的方式整合Mybatis 的先决条件:需要配置DataSource,因而本节将基于 SpringBoot构建微服务实战 之 DataSource(二) 来学习。
- Maven 构建新的SpringBoot项目
引入Mybatis及相关依赖
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <mybatis-spring-boot-starter.version>1.1.1</mybatis-spring-boot-starter.version> <mybatisplus-spring-boot-starter.version>1.0.4</mybatisplus-spring-boot-starter.version> <java.version>1.8</java.version> </properties> <dependencies> <!-- SpringBoot Web容器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- SpringBoot集成mybatis框架 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis-spring-boot-starter.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.8</version> </dependency> <!-- <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
编写逻辑
ExmapleController.java
@Controller @RequestMapping("/emxaple") public class ExmapleController { @Autowired private ExmapleSercive exmapleService; @RequestMapping("/addLock") @ResponseBody public int addLock() throws Exception{ int ret = -1; Lock lock = new Lock("123","456"); ret = exmapleService.insertLock(lock); return ret; } }
ExmapleDao.java
public interface ExmapleDao { public int insertLock(Lock lock); }
Lock.java
public class Lock implements Serializable { private String schedName; private String lockName; @Override public String toString() { return "Lock [schedName=" + schedName + ", lockName=" + lockName + "]"; } public String getSchedName() { return schedName; } public void setSchedName(String schedName) { this.schedName = schedName; } public String getLockName() { return lockName; } public void setLockName(String lockName) { this.lockName = lockName; } public Lock() { super(); } public Lock(String schedName, String lockName) { super(); this.schedName = schedName; this.lockName = lockName; } }
ExmapleSercive.java
public interface ExmapleSercive { public int insertLock(Lock lock); }
ExmapleServiceImpl.java
@Service("exmapleService") public class ExmapleServiceImpl implements ExmapleSercive { @Autowired private ExmapleDao exmapleDao; @Override public int insertLock(Lock lock) { int ret = -1; try { ret = exmapleDao.insertLock(lock); } catch (Exception e) { e.printStackTrace(); } return ret; } }
DruidExmapleApplication.java
@SpringBootApplication @MapperScan("com.example.demo.dao") public class DruidExmapleApplication { public static void main(String[] args) { SpringApplication.run(DruidExmapleApplication.class, args); } }
application.yml 全局设置
#dubbo配置 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.jdbc.Driver #url: jdbc:mysql://10.213.24.45:3306/demo2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull url: jdbc:mysql://localhost:3306/demo2?useUnicode=true&characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull username: root password: bai5331359 # 初始化大小,最小,最大 initialSize: 1 minIdle: 3 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 30000 validationQuery: select 'x' testWhileIdle: true testOnBorrow: false testOnReturn: false # 打开PSCache,并且指定每个连接上PSCache的大小 poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 filters: stat,wall,slf4j # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 合并多个DruidDataSource的监控数据 #useGlobalDataSourceStat: true #Mybatis Settings mybatis: #配置Mybatis typealias,Mapper XML 文件中将不再做繁琐的别名申明,一般扫描实体(包/类) type-aliases-package: com.example.demo.dao config-location: classpath:mybatis/mybatis-config.xml mapper-locations: classpath:mybatis/mapper/*.xml #Server server: port: 8080 tomcat: uri-encoding: utf-8 servlet: context-path: /impact
mybatis-config.xml Mybatyis设置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="cacheEnabled" value="true" /> <!-- 全局映射器启用缓存 ,即二级缓存--> <setting name="useGeneratedKeys" value="true" /> <!-- 允许 JDBC 支持自动生成主键 --> <setting name="defaultExecutorType" value="REUSE" /> <!-- 配置默认的执行器 --> <setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 开启驼峰名命名法 --> <setting name="logImpl" value="SLF4J" /> <!-- 指定 MyBatis 所用日志的具体实现 --> </settings> </configuration>
ExmapleDao.xml Mapper 文件
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.demo.dao.ExmapleDao"> <resultMap type="Lock" id="LockResult"> <result property="schedName" column="sched_name" /> <result property="lockName" column="lock_name" /> </resultMap> <insert id="insertLock" parameterType="Lock"> insert into qrtz_locks (sched_name,lock_name) values ( #{schedName},#{lockName} ) </insert> </mapper>
DB 表信息
CREATE TABLE `qrtz_locks` ( `sched_name` varchar(120) NOT NULL, `lock_name` varchar(40) NOT NULL, PRIMARY KEY (`sched_name`,`lock_name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
结果
小结
- SpringBoot整合Mybatis 一定要在启动类(DruidExmapleApplication.java)上添加 @MapperScan(“com.example.demo.dao”) 来扫描指定路径下的Mapper接口已将Dao层Bean注入到Spring IOC contianor中。
- 本节中对于Lock 别名的申明我们交由Spring Scan Bean的装配来完成的,进而不用再Mybatis配置文件中做繁琐的别名申明了,一般在Application的配置文件中配置:mybatis.type-aliases-package=com.example.demo.entity(实体类集中的包),即可在Mapper xml 文件中引用。