1. 程式人生 > >3、Spring Boot 2.x整合Mybatis並且實現單表的增刪除改查

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")

方可正常啟動。