Spring Boot配置DataSource並整合Mybatis
阿新 • • 發佈:2019-01-22
1.引入POM依賴
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-commons</artifactId> </dependency> <!--Mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.8</version> </dependency> <!-- 資料來源 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- druid 連線池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.18</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
2.資料庫配置application.properties
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mysql spring.datasource.username=使用者名稱 spring.datasource.password=密碼 # 資料庫驅動 spring.datasource.driver-class-name=com.mysql.jdbc.Driver # 初始化大小,最小,最大 spring.datasource.initialSize=5 spring.datasource.minIdle=5 spring.datasource.maxActive=20 # 連線等待超時時間 spring.datasource.maxWait=60000 # 配置隔多久進行一次檢測(檢測可以關閉的空閒連線) spring.datasource.timeBetweenEvictionRunsMillis=60000 # 配置連線在池中的最小生存時間 spring.datasource.minEvictableIdleTimeMillis=300000 # SQL查詢,用來驗證從連線池取出的連線,在將連線返回給呼叫者之前.如果指定,則查詢必須是一個SQL SELECT並且必須返回至少一行記錄 spring.datasource.validationQuery=SELECT 1 FROM DUAL # 指明連線是否被空閒連接回收器(如果有)進行檢驗.如果檢測失敗,則連線將被從池中去除.注意: 設定為true後如果要生效,validationQuery引數必須設定為非空字串 spring.datasource.testWhileIdle=true # 指明是否在從池中取出連線前進行檢驗,如果檢驗失敗,則從池中去除連線並嘗試取出另一個.注意: 設定為true後如果要生效,validationQuery引數必須設定為非空字串 spring.datasource.testOnBorrow=false # 指明是否在歸還到池中前進行檢驗注意: 設定為true後如果要生效,validationQuery引數必須設定為非空字串 spring.datasource.testOnReturn=false # 開啟PSCache,並且指定每個連線上PSCache的大小 開啟池的prepared statement 池功能 spring.datasource.testOnReturn=false # 開啟PSCache,並且指定每個連線上PSCache的大小 spring.datasource.poolPreparedStatements=true spring.datasource.maxPoolPreparedStatementPerConnectionSize=20 # 配置監控統計攔截的filters,去掉後監控介面sql無法統計,'wall'用於防火牆 spring.datasource.filters=stat,wall,log4j spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
3.SessionFactory 配置
package com.example.demo; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; @Configuration //開啟事務支援後,然後在訪問資料庫的Service方法上添加註解 @Transactional 便可。 @EnableTransactionManagement //指定要掃描的Mapper類的包的路徑 @MapperScan(basePackages = "com.example.demo.**.repository") public class MybatisConfig { @Value("${spring.datasource.type}") private Class<? extends DataSource> dataSourceType; //DataSource配置 @Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource(){ return DataSourceBuilder.create().type(dataSourceType).build(); } @Bean public SqlSessionFactory sqlSessionFactoryBean()throws Exception{ SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource()); PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:mapper/*.xml")); return sqlSessionFactoryBean.getObject(); } @Bean(name = "transactionManager") @Primary public PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource()); } }
4.配置RepositoryBean
package com.example.demo.repository;
import com.example.demo.entity.BaseEntity;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.Repository;
import java.io.Serializable;
//@NoRepositoryBean:一般用作父類的repository,有這個註解,spring不會去例項化該repository。
@NoRepositoryBean
public interface RepositoryBean<T extends BaseEntity<ID>,ID extends Serializable> extends Repository<T,ID> {
int insert(T entity);
int insertSelective(T entity);
T selectByPrimaryKey(ID id);
int updateByPrimaryKey(T entity);
int updateByPrimaryKeySelective(T entity);
int deleteByPrimaryKey(ID id);
}
5.公共Entity編寫
package com.example.demo.entity;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@Getter
@Setter
public class BaseEntity<ID> implements Serializable {
private static final long serialVersionUID = 572652475525526409L;
private ID id;
private Integer version;
}
6.在resources下建立放xml的資料夾(對映檔案要放在resources下,放在main下不會編譯),編寫對映檔案
<?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="com.example.demo.repository.UserRepository">
<insert id="insert" parameterType="com.example.demo.entity.User">
INSERT INTO user_info(name,age)values(#{name},#{age})
</insert>
</mapper>
7.編寫測試實體及測試Repository
package com.example.demo.entity;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@Getter
@Setter
public class User extends BaseEntity<String> implements Serializable{
private String name;
private Integer age;
}
package com.example.demo.repository;
import com.example.demo.entity.User;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends RepositoryBean<User,String> {
}
8.編寫測試類
package com.example.demo;
import com.example.demo.entity.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestMain {
@Autowired
private UserRepository userRepository;
@RequestMapping("/addUser")
public void insetUser(){
User user = new User();
user.setName("zhangsan");
user.setAge(30);
userRepository.insert(user);
}
}
訪問127.0.0.1:8989/addUser就能插入一條資料
以下完整Pom及建表語句:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>datasource</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>DataSource</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.14.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
</dependency>
<!--Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<!-- 資料來源 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- druid 連線池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.18</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
CREATE TABLE `user_info` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`age` tinyint(3) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
專案結構: