目標:
使用 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&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] ------------------------------------------------------------------------
自動生成以下代碼
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> { }
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; } }
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>
(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監控
相關代碼 地址