前幾天分享瞭如何在docker上部署mysql,今天我們把它運用起來,通過springboot對mysql和mybatis進行整合
相關文章
GitHub地址
點擊進入→ Springboot整合mysql和mybatis Github Demo地址
準備階段
1、安裝好mysql後,新建一個庫,執行下面的初始化腳本
-- ----------------------------
-- Table structure for user_info 是否使用utf8mb4自己決定
-- ----------------------------
DROP TABLE IF EXISTS `user_info`;
CREATE TABLE `user_info` (
`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
`sex` int(1) NULL DEFAULT NULL COMMENT '性別',
`create_date` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '創建日期',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用戶信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user_info
-- ----------------------------
INSERT INTO `user_info` VALUES (1, '小王', 0, '2019-11-05 10:06:36');
INSERT INTO `user_info` VALUES (2, '小明', 0, '2019-11-05 10:06:36');
INSERT INTO `user_info` VALUES (4, '小紅', 1, '2019-11-05 10:06:36');
INSERT INTO `user_info` VALUES (8, '小孫', 0, '2019-11-05 10:02:20');
INSERT INTO `user_info` VALUES (9, '三葉', 1, '2019-11-05 10:06:36');
INSERT INTO `user_info` VALUES (10, '梨花', 1, '2019-11-05 10:47:52');
2、先展示項目的代碼整體結構,如下圖
3、新建springboot工程
4、配置pom文件和mysql參數
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.demo</groupId>
<artifactId>springboot-mysql-mybatis-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-mysql-mybatis-demo</name>
<description>Mysql And Mybatis Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mysql 驅動依賴 這裏我選用的是8.0.11 大家可以自己調整自己的版本 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
<scope>runtime</scope>
</dependency>
<!-- mybatis 依賴 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties
PS:如果mybatis.mapper-locations需要匹配多個路徑,可以用','分割,例如mybatis.mapper-locations=classpath:mybatis/mapper/*.xml,classpath:mybatis/mapper/**/*.xml 代表掃描mapper目錄下的xml文件和mapper下一級目錄下的xml文件,達到多級掃描效果
server.port=8066
#mysql相關
#如果使用的是mysql 5.X版本使用com.mysql.jdbc.Driver,6以後使用com.mysql.cj.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#MySQL6.X版本以上必須配置如果設定serverTimezone參數,在設定時區的時候,如果設定serverTimezone=UTC,會比中國時間早8個小時,如果在中國,可以選擇Asia/Shanghai或者Asia/Hongkong
spring.datasource.url:jdbc:mysql://你的數據庫IP:端口號/庫名稱?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username:你的數據庫賬號
spring.datasource.password:你的數據庫密碼
# hikari數據庫連接池相關 可以不配置
#數據源類型
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
#連接池名稱,默認HikariPool-1
spring.datasource.hikari.pool-name=TestHikariPool
#最大連接數,小於等於0會被重置爲默認值10;大於零小於1會被重置爲minimum-idle的值
spring.datasource.hikari.maximum-pool-size=20
#連接超時時間:毫秒,小於250毫秒,否則被重置爲默認值30秒
spring.datasource.hikari.connection-timeout=60000
#最小空閒連接,默認值10,小於0或大於maximum-pool-size,都會重置爲maximum-pool-size
spring.datasource.hikari.minimum-idle=5
#空閒連接超時時間,默認值600000(10分鐘),大於等於max-lifetime且max-lifetime>0,會被重置爲0;不等於0且小於10秒,會被重置爲10秒。
# 只有空閒連接數大於最大連接數且空閒時間超過該值,纔會被釋放
spring.datasource.hikari.idle-timeout=180000
#連接最大存活時間.不等於0且小於30秒,會被重置爲默認值30分鐘.設置應該比mysql設置的超時時間短
spring.datasource.hikari.max-lifetime=200000
#mybatis相關
mybatis.config-locations=classpath:mybatis/mybatis-config.xml
#如果需要匹配多個路徑,可以用','分割,例如mybatis.mapper-locations=classpath:mybatis/mapper/*.xml,classpath:mybatis/mapper/**/*.xml 代表掃描mapper目錄下的xml文件和mapper下一級目錄下的xml文件,達到多級掃描效果
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.type-aliases-package=com.example.demo.smm.mapper.entity
5、配置mapper.xml
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias="Integer" type="java.lang.Integer" />
<typeAlias alias="Long" type="java.lang.Long" />
<typeAlias alias="HashMap" type="java.util.HashMap" />
<typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
<typeAlias alias="ArrayList" type="java.util.ArrayList" />
<typeAlias alias="LinkedList" type="java.util.LinkedList" />
</typeAliases>
</configuration>
UserInfoMapper.xml sql管理文件
<?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.example.demo.smm.mapper.dao.UserInfoDao" >
<sql id="Base_Column_List" >
id, user_name, sex, create_date
</sql>
<resultMap id="BaseResultMap" type="com.example.demo.smm.mapper.entity.UserInfo">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="user_name" jdbcType="VARCHAR" property="userName" />
<result column="sex" jdbcType="INTEGER" property="sex" />
<result column="create_date" property="createDate" jdbcType="TIMESTAMP" />
</resultMap>
<select id="getUserInfoById" resultMap="BaseResultMap" parameterType="Long">
select <include refid="Base_Column_List"></include>
from user_info
where id = #{id}
</select>
<select id="getUserInfoList" resultMap="BaseResultMap" parameterType="java.util.HashMap">
select <include refid="Base_Column_List"></include>
from user_info
<where>
<if test="userName != null and userName != '' ">
and user_name like CONCAT('%',#{userName,jdbcType=VARCHAR},'%')
</if>
<if test="sex != null ">
and sex = #{sex,jdbcType=INTEGER}
</if>
</where>
</select>
<!-- 插入user_info 使用selectKey的方式返回自增長的主鍵的值-->
<insert id="insertUserInfo" parameterType="com.example.demo.smm.mapper.entity.UserInfo" >
insert into user_info(
user_name, sex, create_date
)
values(
#{userName, jdbcType=VARCHAR}, #{sex, jdbcType=INTEGER}, NOW()
)
<selectKey keyColumn="id" resultType="Long" keyProperty="id" order="AFTER">
select last_insert_id()
</selectKey>
</insert>
<!-- sql動態插入 useGeneratedKeys="true" keyProperty="id" 和 selectKey一樣都是返回插入數據的id -->
<insert id="insertUserInfoCondition" parameterType="com.example.demo.smm.mapper.entity.UserInfo" useGeneratedKeys="true" keyProperty="id">
insert into user_info(
<trim suffixOverrides=",">
<if test="userName != null and userName != ''">
user_name,
</if>
<if test="sex!=null">
sex,
</if>
</trim>
)
values(
<trim suffixOverrides=",">
<if test="userName != null and userName != ''">
#{userName, jdbcType=VARCHAR},
</if>
<if test="sex!=null">
#{sex, jdbcType=INTEGER},
</if>
</trim>
)
</insert>
</mapper>
6、創建user_info表的mapper和entity
UserInfo.java 用戶信息表entity
package com.example.demo.smm.mapper.entity;
import java.io.Serializable;
import java.util.Date;
/**
* 用戶信息表entity
*
* @author longzhang.wang
* @Date 2019年11月5日
*/
public class UserInfo implements Serializable {
/**
* id
*/
private Long id;
/**
* 名字
*/
private String userName;
/**
* 年齡
*/
private Integer sex;
/**
* 創建時間
*/
private Date createDate;
/**
* 創建時間字符串,用來做簡單的時間轉換測試,demo暫不新建其他vo
*/
private String createDateStr;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public String getCreateDateStr() {
return createDateStr;
}
public void setCreateDateStr(String createDateStr) {
this.createDateStr = createDateStr;
}
}
UserInfoDao.java 用戶信息mapper映射,此處建議準守阿里Java規約使用UserInfoDao.java作爲名稱
package com.example.demo.smm.mapper.dao;
import com.example.demo.smm.mapper.entity.UserInfo;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* 用戶信息mapper映射
*
* @author longzhang.wang
* @Date 2019年11月5日
*/
@Repository
public interface UserInfoDao {
UserInfo getUserInfoById(Long id);
List<UserInfo> getUserInfoList(UserInfo userInfo);
int insertUserInfo(UserInfo userInfo);
int insertUserInfoCondition(UserInfo userInfo);
}
7、創建業務處理層和控制層
UserInfoService.java 用戶信息接口
package com.example.demo.smm.service;
import com.example.demo.smm.mapper.entity.UserInfo;
import java.util.List;
/**
* 用戶信息接口
*
* @author longzhang.wang
* @Date 2019年11月5日
*/
public interface UserInfoService {
/**
* 根據id查詢用戶
* @param id
* @return
* @throws Exception
*/
UserInfo getUserInfoById(Long id) throws Exception;
/**
* 查詢用戶列表
* @param userInfo
* @return
*/
List<UserInfo> getUserInfoList(UserInfo userInfo);
/**
* 插入用戶信息
* @param userInfo
* @return
*/
Long insertUserInfo(UserInfo userInfo);
/**
* 動態插入用戶信息
* @param userInfo
* @return
*/
Long insertUserInfoCondition(UserInfo userInfo);
/**
* 插入用戶信息,異常回滾測試方法
* @param userInfo
* @return
*/
Long insertUserInfoExceptionRollBack(UserInfo userInfo);
/**
* 插入用戶信息,異常不回滾測試方法
* @param userInfo
* @return
*/
Long insertUserInfoExceptionNoRollBack(UserInfo userInfo);
}
UserInfoServiceImpl.java 用戶信息業務實現類
package com.example.demo.smm.service.impl;
import com.example.demo.smm.mapper.dao.UserInfoDao;
import com.example.demo.smm.mapper.entity.UserInfo;
import com.example.demo.smm.service.UserInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.List;
/**
* 用戶信息業務實現類
*
* @author longzhang.wang
* @Date 2019年11月5日
*/
@Service("userInfoService")
public class UserInfoServiceImpl implements UserInfoService {
@Autowired
private UserInfoDao userInfoDao;
@Override
public UserInfo getUserInfoById(Long id) throws Exception {
UserInfo userInfo = userInfoDao.getUserInfoById(id);
if(null == userInfo) {
throw new Exception("沒有查詢到數據");
}
//此處簡單做下轉換驗證時間格式是否正常
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
userInfo.setCreateDateStr(sdf.format(userInfo.getCreateDate()));
return userInfo;
}
@Override
public List<UserInfo> getUserInfoList(UserInfo userInfo) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List<UserInfo> list = userInfoDao.getUserInfoList(userInfo);
list.forEach(u -> u.setCreateDateStr(sdf.format(u.getCreateDate())));
return list;
}
@Transactional
@Override
public Long insertUserInfo(UserInfo userInfo){
int result = userInfoDao.insertUserInfo(userInfo);
if(result < 1) {
throw new RuntimeException("插入失敗");
}
return userInfo.getId();
}
@Transactional
@Override
public Long insertUserInfoCondition(UserInfo userInfo){
int result = userInfoDao.insertUserInfoCondition(userInfo);
if(result < 1) {
throw new RuntimeException("插入失敗");
}
return userInfo.getId();
}
@Transactional
@Override
public Long insertUserInfoExceptionRollBack(UserInfo userInfo){
int result = userInfoDao.insertUserInfo(userInfo);
throw new RuntimeException("強制拋出異常,insertUserInfoExceptionRollBack回滾");
}
@Override
public Long insertUserInfoExceptionNoRollBack(UserInfo userInfo){
int result = userInfoDao.insertUserInfo(userInfo);
throw new RuntimeException("強制拋出異常,insertUserInfoExceptionNoRollBack不回滾");
}
}
UserInfoController.java 用戶信息控制層
package com.example.demo.smm.controller;
import com.example.demo.smm.mapper.entity.UserInfo;
import com.example.demo.smm.service.UserInfoService;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.sql.DataSource;
import java.util.List;
/**
* 用戶信息控制層
*
* @author longzhang.wang
* @Date 2019年11月5日
*/
@RequestMapping("/user")
@RestController
public class UserInfoController {
@Autowired
private UserInfoService userInfoService;
/**
* 根據id查詢用戶
* @param id
* @return
* @throws Exception
*/
@RequestMapping("/getUserInfoById")
public UserInfo getUserInfoById(Long id) throws Exception {
return userInfoService.getUserInfoById(id);
}
/**
* 查詢用戶列表
* @param userInfo
* @return
*/
@RequestMapping("/getUserInfoList")
public List<UserInfo> getUserInfoById(UserInfo userInfo) {
return userInfoService.getUserInfoList(userInfo);
}
/**
* 插入用戶信息
* @param userInfo
* @return
*/
@RequestMapping("/insertUserInfo")
public Long insertUserInfo(UserInfo userInfo){
Long result = userInfoService.insertUserInfo(userInfo);
return result;
}
/**
* 動態插入用戶信息
* @param userInfo
* @return
*/
@RequestMapping("/insertUserInfoCondition")
public Long insertUserInfoCondition(UserInfo userInfo){
return userInfoService.insertUserInfoCondition(userInfo);
}
/**
* 插入用戶信息,異常回滾測試方法
* @param userInfo
* @return
*/
@RequestMapping("/insertUserInfoExceptionRollBack")
public Long insertUserInfoExceptionRollBack(UserInfo userInfo){
return userInfoService.insertUserInfoExceptionRollBack(userInfo);
}
/**
* 插入用戶信息,異常不回滾測試方法
* @param userInfo
* @return
*/
@RequestMapping("/insertUserInfoExceptionNoRollBack")
public Long insertUserInfoExceptionNoRollBack(UserInfo userInfo) {
return userInfoService.insertUserInfoExceptionNoRollBack(userInfo);
}
}
測試階段
1、啓動springboot,看是否有啓動正常。
2、在瀏覽器上輸入:http://localhost:8066/user/getUserInfoById?id=2 預期返回值爲:
{
"id":2,
"userName":"小明",
"sex":0,
"createDate":"2019-11-05T02:06:36.000+0000",
"createDateStr":"2019-11-05 10:06:36"
}
3、在瀏覽器上輸入:http://localhost:8066/user/getUserInfoList?userName=小&sex=0 預期返回值爲:
[
{
"id":1,
"userName":"小王",
"sex":0,
"createDate":"2019-11-05T02:06:36.000+0000",
"createDateStr":"2019-11-05 10:06:36"
},
{
"id":2,
"userName":"小明",
"sex":0,
"createDate":"2019-11-05T02:06:36.000+0000",
"createDateStr":"2019-11-05 10:06:36"
},
{
"id":8,
"userName":"小孫",
"sex":0,
"createDate":"2019-11-05T02:02:20.000+0000",
"createDateStr":"2019-11-05 10:02:20"
}
]
4、在瀏覽器上輸入:http://localhost:8066/user/insertUserInfo?userName=插入測試
33
#返回插入Id
5、根據自己的需求對數據進行修改和添加,看是否符合預期
以上爲springboot整合mysql和mybatis實例,希望可以幫助到大家,如果小夥伴們還需要整合druid,可以參考:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter