目錄結構
0.環境
1.創建maven項目
2.maven項目轉springboot項目
3.springboot整合mybatis實現簡單數據庫訪問
0.環境
windows+eclipse+jdk8+mysql/oracle/…+tomcat8.5(也可以使用eclipse內嵌,不過我後面會排除內嵌tomcat,所以最好自己弄一個)
1.創建maven項目
打開eclispe,創建一個項目,選擇創建類型爲maven.如圖:
其他步驟直接默認選項,到選擇Group ID頁面時輸入Group id和Artifact id,可以按照自己習慣選擇。兩個座標唯一確定項目,如下圖:
點擊finish,完成創建。
這是會在項目中src/main/java下的cn.zoulang.frame包下回生成一個app.java,可以運行該文件測試是否成功創建。
2.maven項目轉springboot項目
maven項目轉springboot項目基本只要修改下pom.xml文件,即可。然後修改App.java測試。
修改pom.xml
打開pom.xml,添加parent標籤,繼承springboot.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
</parent>
在標籤內添加web起步依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
稍後會貼出完整的pom.xml文件,但是完整的pom.xml文件中由於添加其他內容(如排除內嵌tomcat等,導致會和講解過程中的配置有些不一樣,讀者可以直接使用我配置好的完整的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>
修改App.java名稱爲Application.java,然後修改其中的代碼爲如下(修改名稱只是爲了表達已經轉爲springboot項目,因爲直接通過插件創建的springboot項目默認啓動類就叫Application.java):
Application.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class Application extends SpringBootServletInitializer{
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
運行Application.java類,查看控制檯,啓動成功後服務器一直運行着。到此,已經將maven項目轉爲springboot項目。
3.springboot項目整合mybatis
添加springboot測試起步依賴、jdbc驅動(oracle&mysql,可以只添加其中一個)、mybatis依賴,druid連接池依賴,log4j日誌管理依賴等。然後在標籤中配置資源文件編譯路徑爲src/main/resources(配置完成後需要右鍵工程項目,選擇maven->update project是配置資源路徑生效,刷新項目後就可以看到項目中已經添加了改路徑)。添加插件maven-compiler-plugin,這個爲必須,java1.3版本以上都必須配置這一步。(其他插件、依賴都有註釋,可以參考註釋查看)完整的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>cn.zoulang</groupId>
<artifactId>frame</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 依賴包 -->
<dependencies>
<!-- ########################### web base ########################### -->
<!-- 支持web的起步依賴。起步依賴:類似spring-boot-starter-xx的依賴爲起步依賴 -->
<!-- spring web application -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- 排除內嵌logging,避免與log4j衝突(如果沒有引入log4j則不需要排除) -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
<!-- 排除內嵌tomcat -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Srping Boot 測試 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- servlet api(主要提供聲明週期接口)-->
<!-- ########################### drivers ########################### -->
<!-- oracle jdbc -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc8</artifactId>
<version>12.2.0.1.0</version>
<!-- 依賴的範圍
compile:默認值,表示被依賴的maven項目會參與項目編譯、運行、測試、打包。是一個強依賴。
test:僅參與測試代碼的編譯和運行,如junit
runtime:被依賴項目在運行期間動態參與
provided:由服務器/servelet容器提供,非傳遞性,不會打包
system:需要顯示提供一個本地jar包路徑
-->
<scope>system</scope>
<systemPath>${basedir}/lib/ojdbc8.jar</systemPath>
</dependency>
<!-- mysql connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- ########################### database and cache things ########################### -->
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- druid 連接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
<!-- ########################### auth ########################### -->
<!-- spring security 權限控制 -->
<!-- ########################### tools ########################### -->
<!-- commons lang 3 -->
<!-- ########################### others ########################### -->
<!-- log4j2 日誌管理 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- log4j1 切換到 log4j2 的橋接包 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
<version>2.6.2</version>
</dependency>
</dependencies>
<build>
<!-- 資源文件配置 -->
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<!-- maven的核心插件compile插件默認只支持java1.3,需要使用java高版本,必須指定該插件 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerArguments>
<bootclasspath>${env.JAVA_HOME}/jre/lib/rt.jar;${env.JAVA_HOME}/jre/lib/jce.jar</bootclasspath>
<extdirs>${project.basedir}/src/main/webapp/WEB-INF/lib</extdirs>
</compilerArguments>
</configuration>
</plugin>
<!-- 支持springboot插件,打包成jar/war -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在src/main/resources下面新建一個文件,命名爲application.properties,如圖:
雙擊打開文件,添加數據源和durid連接池及mybatis配置信息,如下:
application.properties
# datasource 數據源驅動配置信息
# mysql
server.port=8899
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Drive
# oracle
#spring.datasource.url=jdbc:oracle:thin:@localhost:1521:ORCL
#spring.datasource.username=ggjt
#spring.datasource.password=123456
#spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
#spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# durid 連接池配置信息
# 連接池初始化大小
spring.datasource.initialSize=5
# 連接池最小連接數量
spring.datasource.minIdle=5
# 連接池中最大的連接數量
spring.datasource.maxActive=20
# 連接池最大空閒連接數量(已拋棄使用),無效配置
#spring.datasource.maxIdle=8
# 獲取連接最大等待時間,超時拋出異常。設置爲-1表示無限等待
spring.datasource.maxWait=60000
# 1.檢測連接有效時間間隔,刪除無效連接 2.設置testWhilIdle屬性爲true時需要依賴該配置
spring.datasource.timeBetweenEvictionRunsMillis=60000
# 配置最小生存時間,最後活躍時間和當前時間差值大於該值,則關閉連接
spring.datasource.minEvictableIdleTimeMillis=300000
# 查詢語句,如檢測連接有效性等會用到
spring.datasource.validationQuery=SELECT 1 FROM DUAL
# 申請連接時檢測連接可用性
spring.datasource.testWhileIdle=true
# 申請連接時執行validationQuery判斷連接的有效性
spring.datasource.testOnBorrow=false
# 歸還連接時執行validationQuery判斷連接的有效性,如果這個鏈接失效則刪除
spring.datasource.testOnReturn=false
# 打開PSCache,並且指定每個連接上PSCache的大小?
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# 配置監控統計攔截的filters,去掉後監控界面sql無法統計,'wall'用於防火牆
spring.datasource.filters=stat,wall
# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# mybatis
# 配置mybatis的SQLxml掃描路徑(全註解方式則不用配置)
mybatis.mapper-locations=classpath*:mappings/**/*.xml
# 打印SQL
#mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
上面使用的是mysql數據庫驅動,註釋掉了oracle的,如果使用oracle數據庫,需要打開oracle代碼部分,並註釋掉mysql部分。
創建類DruidDataSourceConfiguration配置數據源配置信息,如圖。
DruidDataSourceConfiguration.java
import java.sql.SQLException;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import com.alibaba.druid.pool.DruidDataSource;
@Configuration
@Primary //在同樣的DataSource中,首先使用被標註的DataSource
public class DruidDataSourceConfiguration extends DataSourceProperties{
@Value("${spring.datasource.url}")
private String dbUrl;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource.initialSize}")
private int initialSize;
@Value("${spring.datasource.minIdle}")
private int minIdle;
@Value("${spring.datasource.maxActive}")
private int maxActive;
@Value("${spring.datasource.maxWait}")
private int maxWait;
@Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
private int timeBetweenEvictionRunsMillis;
@Value("${spring.datasource.minEvictableIdleTimeMillis}")
private int minEvictableIdleTimeMillis;
@Value("${spring.datasource.validationQuery}")
private String validationQuery;
@Value("${spring.datasource.testWhileIdle}")
private boolean testWhileIdle;
@Value("${spring.datasource.testOnBorrow}")
private boolean testOnBorrow;
@Value("${spring.datasource.testOnReturn}")
private boolean testOnReturn;
@Value("${spring.datasource.poolPreparedStatements}")
private boolean poolPreparedStatements;
@Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")
private int maxPoolPreparedStatementPerConnectionSize;
@Value("${spring.datasource.filters}")
private String filters;
@Value("{spring.datasource.connectionProperties}")
private String connectionProperties;
@Bean //聲明其爲Bean實例
public DataSource dataSource(){
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(this.dbUrl);
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
//configuration
datasource.setInitialSize(initialSize);
datasource.setMinIdle(minIdle);
datasource.setMaxActive(maxActive);
datasource.setMaxWait(maxWait);
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setValidationQuery(validationQuery);
datasource.setTestWhileIdle(testWhileIdle);
datasource.setTestOnBorrow(testOnBorrow);
datasource.setTestOnReturn(testOnReturn);
datasource.setPoolPreparedStatements(poolPreparedStatements);
datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
try {
datasource.setFilters(filters);
} catch (SQLException e) {
System.out.println("druid configuration initialization filter");
}
datasource.setConnectionProperties(connectionProperties);
return datasource;
}
}
各個配置信息的作用在application.properties中已經有註釋,這裏不再贅述。
創建mysql連接,連接信息需要和application.properties裏面的連接信息一致,然後創建測試表:
CREATE TABLE `user` (
`id` int(13) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`name` varchar(33) DEFAULT NULL COMMENT '姓名',
`age` int(3) DEFAULT NULL COMMENT '年齡',
`money` double DEFAULT NULL COMMENT '賬戶餘額',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
創建測試類如圖:
SysUser.java
import java.io.Serializable;
public class SysUser implements Serializable{
private static final long serialVersionUID = 1L;
private int id;
private String name;
private int age;
private double money;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
}
SysUserMapper.java
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import cn.zoulang.frame.modules.test.model.SysUser;
@Mapper
public interface SysUserMapper {
// @Select(“SELECT * FROM user WHERE name = #{name}”)
// SysUser findUserByName(@Param(“name”) String name);
//
// @Select(“SELECT * FROM user”)
// List findAllUser();
//
// @Insert(“INSERT INTO user(name, age,money) VALUES(#{name}, #{age}, #{money})”)
// void insertUser(@Param(“name”) String name, @Param(“age”) Integer age, @Param(“money”) Double money);
//
// @Update(“UPDATE user SET name = #{name},age = #{age},money= #{money} WHERE id = #{id}”)
// void updateUser(@Param(“name”) String name, @Param(“age”) Integer age, @Param(“money”) Double money,
// @Param(“id”) int id);
//
// @Delete(“DELETE from user WHERE id = #{id}”)
// void deleteUser(@Param(“id”) int id);
SysUser findUserByName(@Param("name") String name);
List<SysUser> findAllUser();
void insertUser(@Param("name") String name, @Param("age") Integer age, @Param("money") Double money);
void updateUser(@Param("name") String name, @Param("age") Integer age, @Param("money") Double money,
@Param("id") int id);
void deleteUser(@Param("id") int id);
}
注意,註釋掉的部分是使用純註解方式訪問數據庫,改部分代碼直接從網上資源獲取,沒有做修改,這裏忘記是哪位大佬的了,無法貼出源出處。
SysUserService.java
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cn.zoulang.frame.modules.test.mapper.SysUserMapper;
import cn.zoulang.frame.modules.test.model.SysUser;
@Service
public class SysUserService {
@Autowired
private SysUserMapper sysUserMapper;
public SysUser selectUserByName(String name) {
return sysUserMapper.findUserByName(name);
}
public List<SysUser> selectAllUser() {
return sysUserMapper.findAllUser();
}
public void insertService() {
sysUserMapper.insertUser("SnailClimb", 22, 3000.0);
sysUserMapper.insertUser("Daisy", 19, 3000.0);
}
public void deleteService(int id) {
sysUserMapper.deleteUser(id);
}
/**
* 模擬事務。由於加上了 @Transactional註解,如果轉賬中途出了意外 SnailClimb 和 Daisy 的錢都不會改變。
*/
@Transactional
public void changemoney() {
sysUserMapper.updateUser("SnailClimb", 22, 2000.0, 3);
// 模擬轉賬過程中可能遇到的意外狀況
int temp = 1 / 0;
System.out.println(temp);
sysUserMapper.updateUser("Daisy", 19, 4000.0, 4);
}
}
SysUserController.java(該部分在apringboot整合mybatis過程中沒有起到左右,不過建議先寫好)
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import cn.zoulang.frame.modules.test.model.SysUser;
import cn.zoulang.frame.modules.test.service.SysUserService;
@Controller
@RequestMapping("/user")
public class SysUserController {
@Autowired
private SysUserService SysUserService;
@RequestMapping("/query")
public SysUser testQuery() {
return SysUserService.selectUserByName("Daisy");
}
@RequestMapping("/insert")
public List<SysUser> testInsert() {
SysUserService.insertService();
return SysUserService.selectAllUser();
}
@RequestMapping("/changemoney")
public List<SysUser> testchangemoney() {
SysUserService.changemoney();
return SysUserService.selectAllUser();
}
@RequestMapping("/delete")
public String testDelete() {
SysUserService.deleteService(3);
return "OK";
}
}
創建springboot測試類:
Main.java
import java.util.List;
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.test.context.junit4.SpringRunner;
import cn.zoulang.frame.modules.test.model.SysUser;
import cn.zoulang.frame.modules.test.service.SysUserService;
@RunWith(SpringRunner.class)
@SpringBootTest
public class Main {
@Autowired
SysUserService sysUserService;
@Test
public void test(){
// sysUserService.insertService();
List<SysUser> list = sysUserService.selectAllUser();
System.out.println("id \t name \t\t age \t money");
for( SysUser entity : list ){
System.out.println(entity.getId() + " \t" + entity.getName()
+ " \t\t" + entity.getAge() + " \t" + entity.getMoney());
}
try{
sysUserService.changemoney();
}catch(Exception e){
System.out.println("發生了事務回滾1111111111111111111111111111");
}
List<SysUser> list2 = sysUserService.selectAllUser();
for( SysUser entity : list2 ){
System.out.println(entity.getId() + " \t" + entity.getName()
+ " \t\t" + entity.getAge() + " \t" + entity.getMoney());
}
}
}
到這裏,可以將上面的SysUserMapper.java裏面的全註解註釋打開,並註釋掉下面部分代碼,測試使用權註解方式訪問數據庫。即完成上面全註解代碼打開並註釋掉下面部分代碼後,使用單元測試運行Main.java類的test方法,可以看到輸出結果(需要先運行sysuserService.insertService()添加數據,或者手動在數據庫添加測試數據)。
如果不適用全註解方式,需要配置xml文件。資源文件夾下新建文件夾及文件SysUserMapper.xml,如圖:
SysUserMapper.xml
<?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="cn.zoulang.frame.modules.test.mapper.SysUserMapper">
<resultMap id="SysUser" type="cn.zoulang.frame.modules.test.model.SysUser">
<result column="ID" property="id"/>
<result column="NAME" property="name"/>
<result column="AGE" property="age"/>
<result column="MONEY" property="money"/>
</resultMap>
<select id="findUserByName" parameterType="String" resultMap="SysUser">
SELECT * FROM user WHERE name = #{name}
</select>
<select id="findAllUser" parameterType="String" resultMap="SysUser">
SELECT * FROM user
</select>
<insert id="insertUser">
INSERT INTO user (
ID,
NAME,
AGE,
MONEY
)
VALUES (
#{id},
#{name},
#{age},
#{money}
)
</insert>
<update id="updateUser">
UPDATE user
SET
NAME = #{name},
AGE = #{age},
MONEY = #{money}
WHERE ID = #{id}
</update>
<delete id="deleteUser">
DELETE
FROM user
WHERE ID = #{id}
</delete>
</mapper>
此時可以註釋掉SysUserMapper.java中的全註解部分代碼,放開剩下部分代碼測試使用xml配置方式。運行Main.java裏面的代碼查看數據。