环境:
jdk1.8;spring boot2.0.2;Maven3.3
摘要说明:
Mybatis:作为一款优秀的持久层框架,mybatis以简单易学、灵活、解耦等特点已逐步占领市场;
HikariCP:spring boot2开始将HikariCP作为默认的数据库连接池;作为后起之秀其拥有代码量少、速度快、稳定、可靠积攒了非常好的口碑;
本篇文章就基于spring boot2+mybatis+HikariCP来形成对数据库持久层的操作;
由于mybatis配置具有多样性如连接池的不同,实现方式的不同,个数的不同所以在这里会在第一章的基础上分多个项目进行demo编写;
步骤:
1.依赖
首先我们需要引入对mybatis的依赖包mybatis-spring-boot-starter;由于mybatis-spring-boot-starter已经包含spring-boot-starter-jdbc故不需要重复引入;
其次我们还要引入对mysql数据库的依赖包mysql-connector-java;
<!-- 引入mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 引入mysql数据库连接 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
2.数据库连接池(HikariCP)配置
数据库连接池主要配置连接数大小、生命周期,超时时间等;更多可参考:https://github.com/brettwooldridge/HikariCP
#数据库连接
spring.datasource.url=jdbc:mysql://localhost:3306/testspringboot
spring.datasource.username=root
spring.datasource.password=xxxxxx
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#-------------Hikari 连接池配置 --------------------------
#-----更多配置可访问:https://github.com/brettwooldridge/HikariCP
## 最小空闲连接数量
spring.datasource.hikari.minimum-idle=5
## 空闲连接存活最大时间,默认600000(10分钟)
spring.datasource.hikari.idle-timeout=180000
## 连接池最大连接数,默认是10
spring.datasource.hikari.maximum-pool-size=10
## 此属性控制从池返回的连接的默认自动提交行为,默认值:true
spring.datasource.hikari.auto-commit=true
## 连接池名字
spring.datasource.hikari.pool-name=MyHikariCP
## 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
spring.datasource.hikari.max-lifetime=1800000
## 数据库连接超时时间,默认30秒,即30000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1
#--------- ---mybatis扫描配置--------------------------
mybatis.config-locations=classpath:config/mybatis_config.xml
3.mybatis配置
通过配置mybatis相关配置来优化数据库操作;配置文件为mybatis_config.xml:
<?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>
<!-- 更多可参考:http://www.mybatis.org/mybatis-3/configuration.html -->
<settings>
<!-- default:false;在null时也调用 setter,适应于返回Map,3.2版本以上可用; -->
<setting name="callSettersOnNulls" value="true" />
<!-- default:true;配置使全局的映射器启用或禁用缓存。 -->
<setting name="cacheEnabled" value="true" />
<!-- default:false;全局启用或禁用延迟加载。启用后,所有关系都将被延迟加载。通过在其上使用fetchType属性,可以为特定关系取代此值。true使用延迟加载,false禁用延迟加载。 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- default:false (true in ≤3.4.1);true启用时,当延迟加载开启时访问对象中一个懒对象属性时,将完全加载这个对象的所有懒对象属性。false,当延迟加载时,按需加载对象属性(即访问对象中一个懒对象属性,不会加载对象中其他的懒对象属性)。 -->
<setting name="aggressiveLazyLoading" value="true" />
<!-- default:true;允许或不允许多种结果集从一个单独的语句中返回(需要适合的驱动)。 -->
<setting name="multipleResultSetsEnabled" value="true" />
<!-- default:true;使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动。 -->
<setting name="useColumnLabel" value="true" />
<!-- default:false;允许JDBC支持生成的键。需要适合的驱动。如果设置为true则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如Derby)。 -->
<setting name="useGeneratedKeys" value="false" />
<!-- default:PARTIAL;只会自动映射没有定义嵌套结果集映射的结果集。这句话有点拗口,意思就是映射文件中,对于resultMap标签,如果没有显式定义result标签,mybatis不会帮你把结果映射到model(pojo)上. -->
<setting name="autoMappingBehavior" value="PARTIAL" />
<!-- default:SIMPLE;配置默认的执行器 (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH:
执行器可以重复执行语句和批量更新) -->
<setting name="defaultExecutorType" value="SIMPLE" />
<!-- default:false;设为true表示开启驼峰转换 -->
<setting name="mapUnderscoreToCamelCase" value="true" />
<!-- defalut:session;设置本地缓存范围 session:就会有数据的共享 statement:语句范围 (这样就不会有数据的共享 -->
<setting name="localCacheScope" value="SESSION" />
<!-- default:OTHER;设置但JDBC类型为空时,某些驱动程序 要指定值,OTHER插入空值时不需要指定类型 -->
<setting name="jdbcTypeForNull" value="NULL" />
<!-- logImpl 可选的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING -->
<setting name="logImpl" value="LOG4J2" />
</settings>
<typeAliases>
<typeAlias alias="Integer" type="java.lang.Integer" />
<typeAlias alias="Long" type="java.lang.Long" />
<typeAlias alias="HashMap" type="java.util.HashMap" />
<typeAlias alias="LinkedHashMap"
type="java.util.LinkedHashMap" />
<typeAlias alias="ArrayList" type="java.util.ArrayList" />
<typeAlias alias="LinkedList" type="java.util.LinkedList" />
</typeAliases>
</configuration>
4.mapper具体实现
通过注解@Mapper来标注持久层;本章通过使用注解来实现接口;
package com.example.demo.test1.dao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.example.demo.test1.pojo.User;
@Mapper
public interface UserMapper {
@Select("SELECT * FROM USER WHERE NAME = #{name}")
User findByName(@Param("name") String name);
@Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})")
int insert(@Param("name") String name, @Param("age") Long age);
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})")
int insertByMap(Map<String, Object> map);
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})")
int insertByBean(User user);
@Select("SELECT * FROM user")
List<User> findAll();
}
表创建sql:
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`age` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4.测试
通过junit测试:
package com.example.demo;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.test.context.junit4.SpringRunner;
import com.example.demo.taf.log.TAFLog;
import com.example.demo.test1.dao.UserMapper;
import com.example.demo.test1.pojo.User;
@RunWith(SpringRunner.class)
// 引入SpringBootTest并生成随机接口
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class MybatisTest {
@Autowired
UserMapper userMapper;
@Test
public void test() {
try {
userMapper.insert("cc", (long) 18);
User user = new User();
user.setName("ccc");
user.setAge(18);
userMapper.insertByBean(user);
System.out.println("反写id为:" + user.getId());
Map < String, Object > map = new HashMap < String, Object >();
map.put("name", "cccc");
map.put("age", 18);
userMapper.insertByMap(map);
System.out.println("反写id为:" + map.get("id"));
System.out.println("查询用户数量:" + userMapper.findAll().size());
}
catch (Exception e) {
System.out.println(e);
}
}
}
测试结果如下:
反写id为:63
反写id为:64
查询用户数量:64