springboot系列(一)整合mybatis
springboot在我的理解的話,就是可以使整合主流框架更簡單的一個集合框架,而且會使得部署,配置更為簡單,並且有內嵌的servlet容器,可以快速地開發一個簡單的應用,但是缺點的話也會有,因為高度集成了,所以一出bug,問題會比較難排查,這篇文章寫的相對詳細,可以看看https://blog.csdn.net/fly_zhyu/article/details/76407830。
然後開始編寫程式碼:
準備工具:idea,maven,jdk1.8。
file->new project,選擇Spring Initializr,然後一步步操作
然後我們這個是web專案,並且要整合mybatis和mysql,但後來會發現mysql的scope是runtime的,要把它去掉。記得要配置好本地的maven路徑,ctrl+alt+s進行設定,
pom.xml檔案如下
<?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.csdn</groupId> <artifactId>demospringboot</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>demospringboot</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.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.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.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> </project>
首先看他的結構,DemospringbootApplication是我們這個程式的主入口,並且static用來存放靜態資源,templates資料夾則用來存放模板檔案,application.properties則是專案的配置檔案,也可以用yml的格式來寫。這個配置檔案具體的配置可以看這篇文章,只需要編寫一個controller,然後啟動入口類,訪問相應路徑就可以看到效果了,注意要把mybatis的引入去掉,不然導致啟動失敗
然後現在要整合mybatis,開始配置,如果是主從配置即多資料來源可以參考這篇文章:
這時候的application.properties檔案內容如下:
server.port=8082
#mysql
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE
jdbc.username=root
jdbc.password=123456
#Mybatis
mapper_path=/mapper/**.xml
type_alias_package=com.csdn.demospringboot.entity
DataSourceConfiguration:
package com.csdn.demospringboot.config.dao;
import org.springframework.context.annotation.Configuration;
import java.beans.PropertyVetoException;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
* 配置datasource到ioc容器裡面
*
* @author xiangze
*
*/
@Configuration
// 配置mybatis mapper的掃描路徑
@MapperScan("com.csdn.demospringboot.dao")
public class DataSourceConfiguration {
@Value("${jdbc.driver}")
private String jdbcDriver;
@Value("${jdbc.url}")
private String jdbcUrl;
@Value("${jdbc.username}")
private String jdbcUsername;
@Value("${jdbc.password}")
private String jdbcPassword;
/**
* 生成與spring-dao.xml對應的bean dataSource
*
* @return
* @throws PropertyVetoException
*/
@Bean(name = "dataSource")
public ComboPooledDataSource createDataSource() throws PropertyVetoException {
// 生成datasource例項
ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 跟配置檔案一樣設定以下資訊
// 驅動
dataSource.setDriverClass(jdbcDriver);
// 資料庫連線URL
dataSource.setJdbcUrl(jdbcUrl);
// 設定使用者名稱
dataSource.setUser(jdbcUsername);
// 設定使用者密碼
dataSource.setPassword(jdbcPassword);
// 配置c3p0連線池的私有屬性
// 連線池最大執行緒數
dataSource.setMaxPoolSize(30);
// 連線池最小執行緒數
dataSource.setMinPoolSize(10);
// 關閉連線後不自動commit
dataSource.setAutoCommitOnClose(false);
// 連線超時時間
dataSource.setCheckoutTimeout(10000);
// 連線失敗重試次數
dataSource.setAcquireRetryAttempts(2);
//設定連線池存活時間,可以根據資料庫的配置進行更改。
dataSource.setMaxIdleTime(3600);
return dataSource;
}
}
@Value是用來讀取配置檔案的資訊,如果要注入的欄位是靜態的,就為該欄位生成一個靜態的setter方法,並且@Value放在這個setter方法上進行注入。@Bean就是說明這個類交由spring容器管理。
SessionFactoryConfiguration:
package com.csdn.demospringboot.config.dao;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import javax.sql.DataSource;
import java.io.IOException;
@Configuration
public class SessionFactoryConfiguration {
private static String mapperPath;
@Value("${mapper_path}")
public void setMapperPath(String mapperPath) {
SessionFactoryConfiguration.mapperPath = mapperPath;
}
@Value("${type_alias_package}")
private String typeAliasPackage;
@Autowired
//因為這裡有兩個dataSource,要指定我們配置好的那一個
@Qualifier("dataSource")
private DataSource dataSource;
@Bean(name="sqlSessionFactory")
public SqlSessionFactoryBean createSqlSessionFactoryBean() throws IOException {
//建立會話工廠
SqlSessionFactoryBean sqlSessionFactoryBean=new SqlSessionFactoryBean();
//配置mybatis,對應mybatis-config.xml
org.apache.ibatis.session.Configuration configuration=new org.apache.ibatis.session.Configuration();
//使用jdbc的getGeneratedKeys獲取資料庫自增主鍵值
configuration.setUseGeneratedKeys(true);
//使用列別名替換列名 select user as User
configuration.setUseColumnLabel(true);
//-自動使用駝峰命名屬性對映欄位 userId user_id
configuration.setMapUnderscoreToCamelCase(true);
sqlSessionFactoryBean.setConfiguration(configuration);
// 新增mapper 掃描路徑
//PathMatchingResourcePatternResolver可以用來解析資原始檔,主要是用來解析類路徑下的資原始檔
PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();
String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + mapperPath;
sqlSessionFactoryBean.setMapperLocations(pathMatchingResourcePatternResolver.getResources(packageSearchPath));
// 設定dataSource
sqlSessionFactoryBean.setDataSource(dataSource);
// 設定typeAlias 包掃描路徑
sqlSessionFactoryBean.setTypeAliasesPackage(typeAliasPackage);
return sqlSessionFactoryBean;
}
}
這下我們基本完成了dao層的配置,接下來我們可以在test資料夾新建一個測試類,
但先在資料庫建立一個user表
CREATE TABLE `tb_user` (
`user_id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_name` varchar(255) NOT NULL,
`user_password` varchar(255) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
然後建立相應的實體類User,寫好屬性後,可以按alt+insert生成get,set方法。
package com.csdn.demospringboot.entity;
public class User {
private Integer userId;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
private String userName;
private String userPassword;
}
然後我們在test目錄下新建一個測試類:
package com.csdn.demospringboot.dao;
import com.csdn.demospringboot.DemospringbootApplication;
import com.csdn.demospringboot.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.PropertySource;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import static org.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemospringbootApplication.class)
@EnableAutoConfiguration
public class UserDaoTest {
@Autowired
private UserDao userDao;
@Test
public void insertUser() throws Exception {
User user=new User();
user.setUserName("user1");
user.setUserPassword("pwd1");
assertEquals(1,userDao.insertUser(user));
}
@Test
public void deleteUser() throws Exception {
List<User> userList=userDao.queryAllUser();
assertEquals(1,userDao.deleteUser(userList.get(0).getUserId()));
}
@Test
public void queryAllUser() throws Exception {
}
@Test
public void queryUserById() throws Exception {
}
}
執行insertUser方法,可以看到資料庫裡面已有資料,然後我們再配置service層,web層,service層主要是一個事務管理的配置,注意配置類的,都要加@Configuration這個註解作為載入時的配置。
package com.csdn.demospringboot.config.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;
import javax.sql.DataSource;
@Configuration
@EnableTransactionManagement
public class TransactionManagementConfiguration implements TransactionManagementConfigurer {
@Autowired
@Qualifier("dataSource")
private DataSource dataSource;
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return new DataSourceTransactionManager(dataSource);
}
}
web層的配置,主要是用來定義檢視解析器,限制檔案上傳大小,配置攔截器等等
package com.csdn.demospringboot.config.web;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
public class MvcConfiguration implements WebMvcConfigurer,ApplicationContextAware {
// Spring容器
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/resources/");
}
/*
檔案上傳解析
*/
@Bean(name = "multipartResolver")
public CommonsMultipartResolver createMultipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setDefaultEncoding("utf-8");
// 1024 * 1024 * 20 = 20M
multipartResolver.setMaxUploadSize(20971520);
multipartResolver.setMaxInMemorySize(20971520);
return multipartResolver;
}
//檢視解析
@Bean(name = "viewResolver")
public ViewResolver createViewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
// 設定Spring 容器
viewResolver.setApplicationContext(this.applicationContext);
// 取消快取
viewResolver.setCache(false);
// 設定解析的字首
viewResolver.setPrefix("/WEB-INF/html/");
// 設定試圖解析的字尾
viewResolver.setSuffix(".html");
return viewResolver;
}
/*
@Autowired
攔截器
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(攔截器).addPathPatterns("路徑");
}*/
}
接下來就是正常的一個service,controller層的程式碼編寫,也可以簡單地用一下restful風格去編寫controller程式碼,至此整合完畢