springboot+mybatis(從零開始搭建maven轉springboot+mybatis項目)

目錄結構

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裏面的代碼查看數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章