Spring boot后台搭建一使用MyBatis集成Mapper和PageHelper


目標:

  使用 Spring  boot+MyBatis+mysql 集成 Mapper 和 PageHelper,實現基本的增刪改查

先建一個基本的 Spring Boot 項目開啟 Spring Boot  參考

使用的 spring boot 版本為 2.1.6.RELEASE

1.集成MyBatis

  引入mybatis-spring-boot-starter和數據庫連接驅動

  修改pom.xml

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.0.1</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

2.Druid數據源

Druid是一個關系型數據庫連接池

阿里巴巴數據庫事業部出品,為監控而生的數據庫連接池。https://github.com/alibaba/druid

  (1)引入依賴

    修改pom.xml

<!-- druid數據源驅動 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.16</version>
</dependency>

  (2)配置

  在 src/main/resources/application.properties 里添加

# 數據庫訪問配置, 使用druid數據源
spring.datasource.druid.db-type=mysql
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.url = jdbc:mysql://127.0.0.1:3306/bms?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&zeroDateTimeBehavior=convertToNull
spring.datasource.druid.username=root
spring.datasource.druid.password=root
# 連接池配置
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-active=20
# 配置獲取連接等待超時的時間
spring.datasource.druid.max-wait=30000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒
spring.datasource.druid.time-between-eviction-runs-millis=60000
# 配置一個連接在池中最小生存的時間,單位是毫秒
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.validation-query= select '1' from dual
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
# 打開PSCache,並且指定每個連接上PSCache的大小
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-open-prepared-statements=20
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
# 配置監控統計攔截的filters,去掉后監控界面sql無法統計,'wall'用於防火牆
spring.datasource.druid.filters=stat,wall

# WebStatFilter配置
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
spring.datasource.druid.web-stat-filter.exclusions='*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'

#是否啟用StatFilter默認值true
spring.datasource.druid.stat-view-servlet.enabled=true
# 訪問路徑為/druid時,跳轉到StatViewServlet
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*

#druid監控管理界面登錄帳號
spring.datasource.druid.stat-view-servlet.login-username=admin
#druid監控管理界面登錄密碼
spring.datasource.druid.stat-view-servlet.login-password=123456
spring.datasource.druid.stat-view-servlet.allow=127.0.0.1
#是否開啟重置功能
druid.monitor.resetEnable=false

# 配置StatFilter
spring.datasource.druid.filter.stat.log-slow-sql=true

  配置了Druid作為連接池,並開啟了Druid的監控功能

  (3)運行項目

  瀏覽器打開http://localhost:8080/druid/login.html

 

  輸入配置的用戶名admin和密碼123456登錄后

3.集成通用Mapper和PageHelper分頁插件

可以簡化工作:

  通用Mapper可以簡化對單表的CRUD操作

  PageHelper分頁插件可以自動拼接分頁SQL

  可以使用MyBatis Geneator來自動生成實體類,Mapper接口和Mapper xml代碼

  (1)引入依賴

    修改pom.xml

    <1>通用Mapper和PageHelper

<!-- 通用mapper -->
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>2.1.5</version>
</dependency>
<!-- pagehelper 分頁插件 -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.10</version>
</dependency>

    <2>MyBatis Geneator

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.7</version>
            <dependencies>
                <dependency>
                     <groupId>mysql</groupId>
                     <artifactId>mysql-connector-java</artifactId>
                     <version>${mysql.version}</version>
                </dependency>
                <dependency>
                     <groupId>tk.mybatis</groupId>
                     <artifactId>mapper</artifactId>
                     <version>4.1.5</version>
                </dependency>
            </dependencies>
            <executions>
                <execution>
                    <id>Generate MyBatis Artifacts</id>
                    <phase>package</phase>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <!--允許移動生成的文件 -->
                <verbose>true</verbose>
                <!-- 是否覆蓋 -->
                <overwrite>true</overwrite>
                <!-- 自動生成的配置 -->
                <configurationFile>src/main/resources/mybatis-generator.xml</configurationFile>
            </configuration>
        </plugin>
   </plugins>
</build>

  (2)配置

    <1>配置MyBatis

    修改src/main/resources/application.properties

# type-aliases掃描路徑
mybatis.type-aliases-package=com.sfn.bms.system.model
# mapper xml實現掃描路徑
mybatis.mapper-locations=classpath:mapper/*xml

    <2>配置通用Mapper

    修改src/main/resources/application.properties

mapper.mappers=com.sfn.bms.common.config.MyMapper
mapper.not-empty=false
mapper.identity=MYSQL

    定義MyMapper接口 

package com.sfn.bms.common.config;

import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
    
}

  注:

    該接口不能被掃描到,自己定義的Mapper都需要繼承這個接口

    <3>配置PageHelper

    修改src/main/resources/application.properties

pagehelper.helper-dialect=mysql
pagehelper.reasonable=true
pagehelper.support-methods-arguments=true
pagehelper.params=count=countsql

    <4>配置Geneator

     在src/main/resources 下新建 mybatis-generator.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>
    <context id="testTables" targetRuntime="MyBatis3Simple" defaultModelType="flat">

        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
            <!-- 該配置會使生產的Mapper自動繼承MyMapper -->
            <property name="mappers" value="com.sfn.bms.common.config.MyMapper" />
            <!-- caseSensitive默認false,當數據庫表名區分大小寫時,可以將該屬性設置為true -->
            <property name="caseSensitive" value="false"/>
        </plugin>

        <!-- 阻止生成自動注釋 -->
        <commentGenerator>
            <property name="javaFileEncoding" value="UTF-8"/>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!-- 數據庫鏈接地址賬號密碼 -->
        <jdbcConnection
                driverClass="com.mysql.cj.jdbc.Driver"
                connectionURL="jdbc:mysql://localhost:3306/bms?serverTimezone=Asia/Shanghai&amp;nullCatalogMeansCurrent=true"
                userId="root"
                password="root">
        </jdbcConnection>

        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 生成Model類存放位置 -->
        <javaModelGenerator targetPackage="com.sfn.bms.system.model" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- 生成映射文件存放位置 -->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

        <!-- 生成Dao類存放位置 -->
        <!-- 客戶端代碼,生成易於使用的針對Model對象和XML配置文件的代碼
            type="ANNOTATEDMAPPER",生成Java Model 和基於注解的Mapper對象
            type="XMLMAPPER",生成SQLMap XML文件和獨立的Mapper接口 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.sfn.bms.system.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <!-- 配置需要生成的表 -->
        <table tableName="T_USER" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
            <generatedKey column="id" sqlStatement="mysql" identity="true"/>
        </table>
    </context>
</generatorConfiguration>

  (3)代碼生成

    run—》edit configurations

    command  line:mybatis-generator:generate -e

    執行后輸出

"C:\Program Files\Java\jdk1.8.0_151\bin\java" -Dmaven.multiModuleProjectDirectory=E:\java\project\newbms "-Dmaven.home=D:\Program Files\JetBrains\IntelliJ IDEA 2017.3.5\plugins\maven\lib\maven3" "-Dclassworlds.conf=D:\Program Files\JetBrains\IntelliJ IDEA 2017.3.5\plugins\maven\lib\maven3\bin\m2.conf" "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2017.3.5\lib\idea_rt.jar=8709:D:\Program Files\JetBrains\IntelliJ IDEA 2017.3.5\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\JetBrains\IntelliJ IDEA 2017.3.5\plugins\maven\lib\maven3\boot\plexus-classworlds-2.5.2.jar" org.codehaus.classworlds.Launcher -Didea.version=2017.3.5 mybatis-generator:generate -e
[INFO] Error stacktraces are turned on.
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building bms 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- mybatis-generator-maven-plugin:1.3.7:generate (default-cli) @ bms ---
[INFO] Connecting to the Database
[INFO] Introspecting table USER
[INFO] Generating Record class for table user
[INFO] Generating Mapper Interface for table user
[INFO] Generating SQL Map for table user
[INFO] Saving file UserMapper.xml
[INFO] Saving file User.java
[INFO] Saving file UserMapper.java
[WARNING] Existing file E:\java\project\newbms\src\main\java\com\sfn\bms\system\model\User.java was overwritten
[WARNING] Existing file E:\java\project\newbms\src\main\java\com\sfn\bms\system\mapper\UserMapper.java was overwritten
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.720 s
[INFO] Finished at: 2019-06-21T12:43:01+08:00
[INFO] Final Memory: 27M/398M
[INFO] ------------------------------------------------------------------------
View Code

    自動生成以下代碼

  

  UserMapper

package com.sfn.bms.system.mapper;

import com.sfn.bms.common.config.MyMapper;
import com.sfn.bms.system.model.User;

public interface UserMapper extends MyMapper<User> {
}
View Code

  User 

package com.sfn.bms.system.model;

import javax.persistence.*;

public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Short id;

    /**
     * 賬號
     */
    private String account;

    /**
     * 密碼
     */
    private String password;

    /**
     * 郵箱
     */
    private String email;

    /**
     * 狀態 1-正常,0-禁用,-1-刪除
     */
    private Boolean status;

    /**
     * 添加時間
     */
    @Column(name = "create_time")
    private Integer createTime;

    /**
     * 上次登陸時間
     */
    @Column(name = "last_login_time")
    private Integer lastLoginTime;

    /**
     * 上次登錄IP
     */
    @Column(name = "last_login_ip")
    private String lastLoginIp;

    /**
     * 登陸次數
     */
    @Column(name = "login_count")
    private Integer loginCount;

    /**
     * @return id
     */
    public Short getId() {
        return id;
    }

    /**
     * @param id
     */
    public void setId(Short id) {
        this.id = id;
    }

    /**
     * 獲取賬號
     *
     * @return account - 賬號
     */
    public String getAccount() {
        return account;
    }

    /**
     * 設置賬號
     *
     * @param account 賬號
     */
    public void setAccount(String account) {
        this.account = account == null ? null : account.trim();
    }

    /**
     * 獲取密碼
     *
     * @return password - 密碼
     */
    public String getPassword() {
        return password;
    }

    /**
     * 設置密碼
     *
     * @param password 密碼
     */
    public void setPassword(String password) {
        this.password = password == null ? null : password.trim();
    }

    /**
     * 獲取郵箱
     *
     * @return email - 郵箱
     */
    public String getEmail() {
        return email;
    }

    /**
     * 設置郵箱
     *
     * @param email 郵箱
     */
    public void setEmail(String email) {
        this.email = email == null ? null : email.trim();
    }

    /**
     * 獲取狀態 1-正常,0-禁用,-1-刪除
     *
     * @return status - 狀態 1-正常,0-禁用,-1-刪除
     */
    public Boolean getStatus() {
        return status;
    }

    /**
     * 設置狀態 1-正常,0-禁用,-1-刪除
     *
     * @param status 狀態 1-正常,0-禁用,-1-刪除
     */
    public void setStatus(Boolean status) {
        this.status = status;
    }

    /**
     * 獲取添加時間
     *
     * @return create_time - 添加時間
     */
    public Integer getCreateTime() {
        return createTime;
    }

    /**
     * 設置添加時間
     *
     * @param createTime 添加時間
     */
    public void setCreateTime(Integer createTime) {
        this.createTime = createTime;
    }

    /**
     * 獲取上次登陸時間
     *
     * @return last_login_time - 上次登陸時間
     */
    public Integer getLastLoginTime() {
        return lastLoginTime;
    }

    /**
     * 設置上次登陸時間
     *
     * @param lastLoginTime 上次登陸時間
     */
    public void setLastLoginTime(Integer lastLoginTime) {
        this.lastLoginTime = lastLoginTime;
    }

    /**
     * 獲取上次登錄IP
     *
     * @return last_login_ip - 上次登錄IP
     */
    public String getLastLoginIp() {
        return lastLoginIp;
    }

    /**
     * 設置上次登錄IP
     *
     * @param lastLoginIp 上次登錄IP
     */
    public void setLastLoginIp(String lastLoginIp) {
        this.lastLoginIp = lastLoginIp == null ? null : lastLoginIp.trim();
    }

    /**
     * 獲取登陸次數
     *
     * @return login_count - 登陸次數
     */
    public Integer getLoginCount() {
        return loginCount;
    }

    /**
     * 設置登陸次數
     *
     * @param loginCount 登陸次數
     */
    public void setLoginCount(Integer loginCount) {
        this.loginCount = loginCount;
    }
}
View Code

  UserMapper.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.sfn.bms.system.mapper.UserMapper">
  <resultMap id="BaseResultMap" type="com.sfn.bms.system.model.User">
    <!--
      WARNING - @mbg.generated
    -->
    <id column="id" jdbcType="SMALLINT" property="id" />
    <result column="account" jdbcType="VARCHAR" property="account" />
    <result column="password" jdbcType="CHAR" property="password" />
    <result column="email" jdbcType="VARCHAR" property="email" />
    <result column="status" jdbcType="BIT" property="status" />
    <result column="create_time" jdbcType="INTEGER" property="createTime" />
    <result column="last_login_time" jdbcType="INTEGER" property="lastLoginTime" />
    <result column="last_login_ip" jdbcType="VARCHAR" property="lastLoginIp" />
    <result column="login_count" jdbcType="INTEGER" property="loginCount" />
  </resultMap>
</mapper>
View Code

    (4)通用Service

    通用的Service,IService定義一些通用的方法

package com.sfn.bms.common.service;

import org.springframework.stereotype.Service;

import java.util.List;

@Service
public interface IService<T> {

    List<T> selectAll();

    T selectByKey(Object key);

    int save(T entity);

    int delete(Object key);

    int batchDelete(List<String> list, String property, Class<T> clazz);

    int updateAll(T entity);

    int updateNotNull(T entity);

    List<T> selectByExample(Object example);
}

    其實現類BaseService

package com.sfn.bms.common.service.impl;

import com.sfn.bms.common.service.IService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.entity.Example;

import java.util.List;

@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public abstract class BaseService<T> implements IService<T> {

    @Autowired
    protected Mapper<T> mapper;

    public Mapper<T> getMapper() {
        return mapper;
    }

    @Override
    public List<T> selectAll() {
        return mapper.selectAll();
    }

    @Override
    public T selectByKey(Object key) {
        return mapper.selectByPrimaryKey(key);
    }

    @Override
    @Transactional
    public int save(T entity) {
        return mapper.insert(entity);
    }

    @Override
    @Transactional
    public int delete(Object key) {
        return mapper.deleteByPrimaryKey(key);
    }

    @Override
    @Transactional
    public int batchDelete(List<String> list, String property, Class<T> clazz) {
        Example example = new Example(clazz);
        example.createCriteria().andIn(property, list);
        return this.mapper.deleteByExample(example);
    }

    @Override
    @Transactional
    public int updateAll(T entity) {
        return mapper.updateByPrimaryKey(entity);
    }

    @Override
    @Transactional
    public int updateNotNull(T entity) {
        return mapper.updateByPrimaryKeySelective(entity);
    }

    @Override
    public List<T> selectByExample(Object example) {
        return mapper.selectByExample(example);
    }
}

    (5)在UserService中使用BaseService中的通用方法

    讓UserService接口繼承IService接口

package com.sfn.bms.system.service;

import com.sfn.bms.common.service.IService;
import com.sfn.bms.system.model.User;

public interface UserService extends IService<User> {

}

    實現類UserServiceImpl

package com.sfn.bms.system.service.impl;

import com.sfn.bms.common.service.impl.BaseService;
import com.sfn.bms.system.model.User;
import com.sfn.bms.system.service.UserService;
import org.springframework.stereotype.Repository;

@Repository("userService")
public class UserServiceImpl extends BaseService<User> implements UserService {

}

4.實現獲取User信息的api接口

  (1)讓Spring Boot掃描到Mapper接口

    在Spring Boot入口類中加入注解 @MapperScan("com.sfn.bms.system.mapper")

package com.sfn.bms;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import tk.mybatis.spring.annotation.MapperScan;

@SpringBootApplication
@MapperScan("com.sfn.bms.system.mapper")
public class BmsApplication {

    public static void main(String[] args) {
        SpringApplication.run(BmsApplication.class, args);
    }

}

  (2)新建UserController

package com.sfn.bms.system.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.sfn.bms.system.model.User;
import com.sfn.bms.system.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;

@Controller
public class UserController {
    @Autowired
    UserService userService;

    @GetMapping("/query")
    @ResponseBody
    public List<User> getUserList(){
        PageHelper.startPage(1,5);
        List<User> list = userService.selectAll();
        PageInfo<User> pageInfo = new PageInfo<User>(list);
        List<User> rs = pageInfo.getList();
        return rs;
    }
}

  運行項目

  訪問 http://localhost:8080/query

  Druid監控

 

相關代碼 地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM