Springboot整合mysql和mybatis實例代碼 附github demo下載直接運行

前幾天分享瞭如何在docker上部署mysql,今天我們把它運用起來,通過springboot對mysql和mybatis進行整合

相關文章

1、docker上部署mysql

2、CentOS 7 安裝mysql 8.0 圖文教程

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章