SpringBoot学习2.1-集成mybatis之HikariCP+注解

环境:

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=cc6688211
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

5.源码地址

https://github.com/cc6688211/demo_chapter2_mybatis1.git

猜你喜欢

转载自blog.csdn.net/u010904188/article/details/82896459