3、Spring Boot 2.x整合Mybatis並且實現單表的增刪除改查
上一篇建立了一個最簡單的Spring Boot 2.x專案,算是有了一個初步的認識。
這一篇我們在上一篇專案的基礎上,實現以下目標:
1、專案中整合Mybatis Generator進行mapper相關檔案的自動生成;
2、整合Mybatis連線資料庫並且實現單表的增刪改查;
3、並且使用Sping Boot 2.x預設的HikariCP作為資料庫連線池;
一、引入相關依賴
在pom.xml中新增如下依賴項:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency>
並且排除tomcat的預設jdbc;在spring-boot-starter-web依賴進行修改,如下
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!--排除預設的tomcat-jdbc--> <exclusion> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jdbc</artifactId> </exclusion> </exclusions> </dependency>
只需要匯入spring-boot-starter-jdbc依賴springboot就預設使用Hikari作為資料庫連線池了
二、建立資料庫表
資料庫名稱:bgms
使用者名稱:bgms
密碼:bgms
我們建立的表的結構如下:
CREATE TABLE `tb_user_info` ( `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID號,自動增長', `USER_NAME` varchar(32) DEFAULT NULL COMMENT '使用者名稱', `PASSWORD` varchar(64) DEFAULT NULL COMMENT '密碼', `AGE` int(11) DEFAULT NULL COMMENT '年齡', `EMAIL` varchar(128) DEFAULT NULL COMMENT '郵箱', `CREATE_TIME` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間', PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
三、整合mybatis-generator並生成mybatis相關檔案(實體類,對映檔案等)
為了使實體類,對映檔案以及資料庫操作相關的類自動生成,我們使用mybatis-generator進行生成,這裡我們對其進行整合
1、準備工作
在com.aicode.bgms下分別建立mapper、model目錄;
在resources下分別建立mapping/generator目錄;
將generatorConfig.xml檔案複製到generator目錄下:
generatorConfig.xml程式碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 資料庫驅動:選擇你的本地硬碟上面的資料庫驅動包-->
<classPathEntry location="C:\mybatisGenerator\mysql-connector-java-5.1.26-bin.jar"/>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressDate" value="true"/>
<!-- 是否去除自動生成的註釋 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--資料庫連結URL,使用者名稱、密碼 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1/bgms" userId="bgms" password="bgms">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成模型的包名和位置-->
<javaModelGenerator targetPackage="com.aicode.bgms.model" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成對映檔案的包名和位置-->
<sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成DAO的包名和位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.aicode.bgms.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 要生成的表 tableName是資料庫中的表名或檢視名 domainObjectName是實體類名-->
<table tableName="tb_user_info" domainObjectName="UserInfo" enableCountByExample="true" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="true"></table>
</context>
</generatorConfiguration>
修改mysql連線池使用的jar包地址為你自己本地的地址,修改classPathEntry中的location;
修改其他相關內容,包括model路徑,mapping路徑,dao檔案路徑以及資料庫表名和對應要生成的類名。
2、在pom.xml中的<build><plugins>下新增mybatis-generator外掛;
<!-- mybatis generator 自動生成程式碼外掛 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
</plugin>
3、在application.properties中新增如下配置內容
spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp
server.port=8080
# datasource start
#資料庫連線相關配置
spring.datasource.url=jdbc:mysql://localhost:3306/bgms?zeroDateTimeBehavior=convertToNull&autoReconnect=true&autoReconnectForPools=true&useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=bgms
spring.datasource.password=bgms
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# Hikari will use the above plus the following to setup connection pooling
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.max-lifetime=1765000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1
# datasource end
# mybatis start
# mybatis日誌配置
logging.level.com.battcn=DEBUG
#注意:一定要對應mapper對映xml檔案的所在路徑
mybatis.mapper-locations=classpath:mapping/*.xml
mybatis.type-aliases-package=com.aicode.bgms.model
# 駝峰命名規範 如:資料庫欄位role_code,實體欄位要寫成 roleCode
mybatis.configuration.map-underscore-to-camel-case=true
# mybatis end
註冊上面的mysql驅動類已經變為com.mysql.cj.jdbc.Driver,而不是原來的com.mysql.jdbc.Driver,因為我們引入mysql的jar包依賴時沒有標註版本號,檢視spring boot的使用版本為,如下圖:
另外上面配置中,我們採用spring boot推薦的HiKariCP進行資料庫連線。HiKariCP起源於BoneCP。號稱效能最好,可以完美地PK掉其他連線池。參考地址:
網上對HiKariCP更是好評如潮。
英文不太好的同學也可以參考網友的博文:
且不論HiKariCP是否是真的有說的那麼優秀吧,這裡我們也為了簡單,暫且使用它。
4、Intellij Idea 中mybatis-generator啟動配置
在Idea中點選依次點選,選單Run——〉Edit Configurations...
進入如下Run/Debug Run Configurations介面,然後點選左上角的"+",然後選擇maven
如上圖所示,Name輸入generator,Command line輸入:
mybatis-generator:generate -e
然後點選"ok"按鈕;
5、生成實體類及對映檔案
執行上一步配置的generator,此時會生成mybatis相關的實體類及對映檔案,生成後,如下圖所示:
可以看到新生成的四個檔案:UserInfoMapper.java、UserInfoExample.java、UserInfo.java、UserInfoMapper.xml;
此四個檔案為自動生成,這裡不再貼出,浪費篇幅;
另外,有時我們可能需要自己寫一些操作資料庫的mapper方法,這裡為了不修改自動生成的程式碼,我們把自行編寫的dao方法放在extra目錄下xxxxExtraMapper.java中,如下圖:
UserInfoExtraMapper.java
package com.aicode.bgms.mapper.extra;
import com.aicode.bgms.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface UserInfoExtraMapper {
UserInfo findUserInfoByUserName(@Param("userName") String userName);
}
UserInfoExtraMapper.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="com.aicode.bgms.mapper.extra.UserInfoExtraMapper" >
<resultMap id="BaseResultMap" type="com.aicode.bgms.model.UserInfo" >
<id column="ID" property="id" jdbcType="INTEGER" />
<result column="USER_NAME" property="userName" jdbcType="VARCHAR" />
<result column="PASSWORD" property="password" jdbcType="VARCHAR" />
<result column="AGE" property="age" jdbcType="INTEGER" />
<result column="EMAIL" property="email" jdbcType="VARCHAR" />
<result column="CREATE_TIME" property="createTime" jdbcType="TIMESTAMP" />
</resultMap>
<sql id="Base_Column_List" >
ID, USER_NAME, PASSWORD, AGE, EMAIL, CREATE_TIME
</sql>
<!-- 根據使用者名稱查詢使用者資訊 -->
<select id="findUserInfoByUserName" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from tb_user_info
where USER_NAME = #{userName,jdbcType=VARCHAR}
</select>
</mapper>
如果有自定義的pojo類,可以放在model目錄下的extra目錄下,命名方式參考其他擴充套件檔案。
四、建立Service相關類
1、建立Service介面類
在com.aicode.bgms下建立service包,然後建立UserInfoSerevice.java介面類,如下:
package com.aicode.bgms.service;
import com.aicode.bgms.model.UserInfo;
import com.aicode.bgms.model.UserInfoExample;
import java.util.List;
public interface UserInfoService {
List<UserInfo> findUserListByExample(UserInfoExample example);
List<UserInfo> findAll();
UserInfo findUserInfoByUserName(String userName);
UserInfo getUserInfoById(Integer id);
int addUserInfo(UserInfo userInfo);
int updateUserInfo(UserInfo userInfo);
int removeUserInfoById(Integer id);
}
2、建立Service實現類
在com.aicode.bgms.service包下建立impl包,然後建立UserInfoServiceImpl.java類
package com.aicode.bgms.service;
import com.aicode.bgms.mapper.UserInfoMapper;
import com.aicode.bgms.mapper.extra.UserInfoExtraMapper;
import com.aicode.bgms.model.UserInfo;
import com.aicode.bgms.model.UserInfoExample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserInfoServiceImpl implements UserInfoService {
@Autowired
private UserInfoMapper userInfoMapper;
@Autowired
private UserInfoExtraMapper userInfoExtraMapper;
@Override
public List<UserInfo> findUserListByExample(UserInfoExample example) {
return userInfoMapper.selectByExample(example);
}
@Override
public List<UserInfo> findAll() {
return userInfoMapper.selectByExample(new UserInfoExample());
}
@Override
public UserInfo findUserInfoByUserName(String userName) {
return userInfoExtraMapper.findUserInfoByUserName(userName);
}
@Override
public UserInfo getUserInfoById(Integer id) {
return userInfoMapper.selectByPrimaryKey(id);
}
@Override
public int addUserInfo(UserInfo userInfo) {
return userInfoMapper.insertSelective(userInfo);
}
@Override
public int updateUserInfo(UserInfo userInfo) {
return userInfoMapper.updateByPrimaryKeySelective(userInfo);
}
@Override
public int removeUserInfoById(Integer id) {
return userInfoMapper.deleteByPrimaryKey(id);
}
}
這個時候,在程式碼中自動裝配UserInfoMapper和UserInfoExtraMapper時,Idea會報紅,但不影響正常執行,如果您想去掉,可以進行如下設定,依次進行如下操作:
File—〉Settings—〉Inspections—〉右側找到Spinrg—〉Spring Core —〉Code—〉Autowiring for Bean Class,將右部的Severity設定為Warning即可。
五、編輯控制層類
在com.aicode.bgms.controller包下建立UserInfoController.java類
package com.aicode.bgms.controller;
import com.aicode.bgms.model.UserInfo;
import com.aicode.bgms.service.UserInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
public class UserInfoController {
@Autowired
private UserInfoService userInfoService;
@GetMapping("/list")
public List<UserInfo> list(){
return userInfoService.findAll();
}
@PostMapping("/add")
public int add(UserInfo userInfo){
return userInfoService.addUserInfo(userInfo);
}
@GetMapping("/get/{id}")
public UserInfo get(@PathVariable("id") Integer id){
return userInfoService.getUserInfoById(id);
}
@PutMapping("/edit")
public UserInfo modify(UserInfo userInfo) {
Integer id = userInfo.getId();
userInfoService.updateUserInfo(userInfo);
UserInfo userInfoTmp = userInfoService.getUserInfoById(id);
return userInfoTmp;
}
@DeleteMapping("/del/{id}")
public int del(@PathVariable("id") Integer id){
return userInfoService.removeUserInfoById(id);
}
}
程式碼比較簡單,沒有新增多餘的註釋。
這裡為了測試介面方便採用了註解@RestController。後面要返回頁面時,我們再修改為@Controller
關於@RestController與@Controller的區別如下:
@RestController註解相當於@ResponseBody + @Controller合在一起的作用
1) 、如果只是使用@RestController註解Controller,則Controller中的方法無法返回jsp頁面,或者html,配置的檢視解析器 InternalResourceViewResolver不起作用,返回的內容就是Return 裡的內容。
2) 、如果需要返回到指定頁面,則需要用 @Controller配合檢視解析器InternalResourceViewResolver才行。
如果需要返回JSON,XML或自定義mediaType內容到頁面,則需要在對應的方法上加上@ResponseBody註解。
以上程式碼是按照RESTful的方式進行構建的。
相關注解說明:
- @GetMapping,處理 Get 請求
- @PostMapping,處理 Post 請求
- @PutMapping,用於更新資源
- @DeleteMapping,處理刪除請求
- @PatchMapping,用於更新部分資源
檔案中程式碼如下:
@GetMapping(value="/xxx")
等價於
@RequestMapping(value = "/xxx",method = RequestMethod.GET)
@PostMapping(value="/xxx")
等價於
@RequestMapping(value = "/xxx",method = RequestMethod.POST)
@PutMapping(value="/xxx")
等價於
@RequestMapping(value = "/xxx",method = RequestMethod.PUT)
@DeleteMapping(value="/xxx")
等價於
@RequestMapping(value = "/xxx",method = RequestMethod.DELETE)
@PatchMapping(value="/xxx")
等價於
@RequestMapping(value = "/xxx",method = RequestMethod.PATCH)
請求 地址 說明
get /list 獲取所有使用者資訊
post /add 建立一個使用者資訊
put /edit 修改使用者資訊
get /get/{id} 根據 ID 獲取使用者資訊
delete /del/{id} 根據 ID 刪除使用者資訊
好了,剩下的程式碼可以自己分析了,這裡只是為了方便進行RESTful測試,沒有對程式碼進行詳細編寫。
測試
啟動類配置
需要在啟動類中新增如下註解:
@MapperScan(basePackages = "com.aicode.bgms.mapper")
方可正常啟動。