SpringBoot的整合(三、整合mybatis)


本篇文章比較適合初學mybatis的同學,沒有登陸頁面,沒有使用自動生成代碼的插件,大家可以手動自己創建對應的文件,體會一下代碼的執行流程,整個項目結構比較簡單,具體代碼以后會上傳到github上,以后會一直更新項目,整合各種框架並總結一些技術的使用方法。大神勿噴,歡迎大家來討論和糾錯。

網盤地址:鏈接:https://pan.baidu.com/s/1xxJhC4pVzkeVFNz-ILb_LQ  提取碼:f2d9

主要內容如下:

1. springboot對mybatis進行的整合。

2. 總結了一些常用的增刪改查的寫法。

3. 總結了分頁查詢的寫法。

4. 存儲過程的調用。

環境:

jdk1.8

maven-3.6.1

mysql-8.0.16(5.6以上版本應該都沒問題)

IDEA.

話不多說,直接上干貨!!

一、Springboot項目的創建

打開開發工具,點擊file--new--project--spring Initializr--next--修改group、Artifact--next--勾選上Lombok、Spring Web、JDBC API、MyBatis Framework、MySQL Driver--輸入Project name--Finish.

這里勾選上一些我們需要生成的依賴,不勾選也可以,可以在生成項目的pom.xml文件中自行添加。

這里輸入項目的名稱

創建之后的工程目錄大概是這樣

二、對項目進行改造

首先,點開file--settings配置窗口,搜索maven,修改右側的User settings file和Local repository地址(會隨着User settings file的變化自動變化),這個地址我填寫的是本地倉庫的地址,默認是c盤下,建議修改。之后重新引入依賴。

這個框每次修改pom.xml文件里的內容就會自動彈出。這個過程會稍微慢一些。

之后繼續在settings配置窗口里找到Plugins(插件),搜索Lombok插件並下載,下載完成后,需要重啟Idea工具,才會生效。這個插件配合着我們剛才在pom.xml文件中的lombok依賴,在我們的實體類上寫上@Data注解,就可以省略setter、getter、toString方法了。

之后修改一下pom.xml文件的內容,可以根據自己的編程習慣添加,由於版本的不同,可能生成的文件中里面的內容有出入,如果不成功,可以復制我的,具體代碼會貼在文章最下面。這里我采用了alibaba的druid數據庫連接池和pagehelper分頁。這里還要注意一下,自動生成的parent標簽中的version版本過高,有可能會報錯,可以手動調低一些,這里我使用的是2.0.1。具體以我下面的代碼為主,我會在里面添加一些其它的依賴用於開發。

之后修改application.properties文件,改為application.yml格式,不修改也是可以,看個人習慣。要注意修改里面的mysql連接的賬號和密碼、數據庫名稱並確認本地的mysql服務開啟。這里還要注意一點,我們在開發的時候,是希望將執行的sql打印出來的,這個只需要在application.yml文件中配置一下就可以了。

之后檢查一下目錄中自動生成的測試用的test文件夾下的TmApplicationTests文件,這里我的由於缺少包,所以我重新引用了org.junit.Test下的。其實如果在開發中不經常使用test進行測試開發的話,可以直接刪除或者屏蔽掉這里報錯的代碼。

之后我們開始完善目錄,在目錄里創建對應開發需要的一些層級文件。里面的內容我會放在下面,參考如下:

之后我們打開springboot項目的入口(main方法所在類),我的是TmApplication,名稱不固定,跟創建的時候自己起的名字有關。在里面我們加上@MapperScan("com.flyinghome.tm.dao")注解。

三、項目的主要代碼

(1)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.0.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.flyinghome</groupId>
    <artifactId>tm</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>tm</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.jupiter</groupId>
                    <artifactId>junit-jupiter-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- alibaba的druid數據庫連接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.9</version>
        </dependency>

        <!--lombok:引用了之后,實體類就不需要寫getter、setter、toString方法了-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
        </dependency>
        <!--pagehelper分頁-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.5</version>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
View Code

(2)application.yml

server:
  port: 8080


spring:
  datasource:
    name: mysql_test
    type: com.alibaba.druid.pool.DruidDataSource
    #druid相關配置
    druid:
      #監控統計攔截的filters
      filters: stat
      driver-class-name: com.mysql.jdbc.Driver
      #基本屬性
      url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
      username: root
      password: root
      #配置初始化大小/最小/最大
      initial-size: 1
      min-idle: 1
      max-active: 20
      #獲取連接等待超時時間
      max-wait: 60000
      #間隔多久進行一次檢測,檢測需要關閉的空閑連接
      time-between-eviction-runs-millis: 60000
      #一個連接在池中最小生存的時間
      min-evictable-idle-time-millis: 300000
      validation-query: SELECT 'x'
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      #打開PSCache,並指定每個連接上PSCache的大小。oracle設為true,mysql設為false。分庫分表較多推薦設置為false
      pool-prepared-statements: false
      max-pool-prepared-statement-per-connection-size: 20

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.flyinghome.tm.model
  #此配置可以使得控制台打印出執行的sql
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl


#pagehelper
pagehelper:
  helperDialect: mysql
  reasonable: true
  supportMethodsArguments: true
  params: count=countSql
  returnPageInfo: check
View Code

(3)TmApplication.java

package com.flyinghome.tm;

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

@SpringBootApplication
@MapperScan("com.flyinghome.tm.dao")
public class TmApplication {

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

}
View Code

(4)UserController

package com.flyinghome.tm.controller;

import com.flyinghome.tm.model.User;
import com.flyinghome.tm.service.UserService;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping(value = "/test")
public class UserController {

    @Autowired
    private UserService userService;

    //-------------------------------------------------------------------------添加----------------------------------------------------------------------------

    /**
     * 單個添加
     * @return
     */
    @ResponseBody
    @GetMapping("/insert")
    public int test(){
        User user = new User();
        user.setId("1");
        user.setName("2");
        user.setPassword("3");
        int result = userService.insertUser(user);
        return result;
    }

    /**
     * 多個添加(List)
     * @return
     */
    @ResponseBody
    @GetMapping("/insertAllList")
    public int insertAllList(){
        User user = new User();
        List<User> list = new ArrayList<>();
        for(int i=0;i<3;i++){
            user.setId(String.valueOf(i));
            user.setName(String.valueOf(i));
            user.setPassword(String.valueOf(i));
            list.add(user);
        }

        int result = userService.insertAllList(list);
        return result;
    }

    /**
     * 多個添加(Array)
     * 特殊用法:foreach標簽的用法
     * @return
     */
    @ResponseBody
    @GetMapping("/insertAllArray")
    public int insertAllArray(){
        User user = new User();
        List<User> list = new ArrayList<>();
        for(int i=0;i<3;i++){
            user.setId(String.valueOf(i));
            user.setName(String.valueOf(i));
            user.setPassword(String.valueOf(i));
            list.add(user);
        }
        int i = 0;
        User[] userArray = new User[list.size()];
        for(User users : list){
            userArray[i++] = users;
        }

        int result = userService.insertAllArray(userArray);
        return result;
    }


    /**
     * 添加(Map)
     * @return
     */
    @ResponseBody
    @GetMapping("/insertAllMap")
    public int insertAllMap(){
        Map<String,Object> usermap = new HashMap();
        usermap.put("id",'7');
        usermap.put("name",'7');
        usermap.put("password",'7');
        int result = userService.insertAllMap(usermap);
        return result;
    }

    /**
     * 添加(調用存儲過程)
     * @return
     */
    @ResponseBody
    @GetMapping("/insertProcedure")
    public int insertProcedure(){
        User user = new User();
        user.setId("5");
        user.setName("6");
        user.setPassword("7");
        int result = userService.insertProcedure(user);
        return result;
    }

    //-------------------------------------------------------------------------查詢----------------------------------------------------------------------------

    /**
     * 查詢(單個參數)
     * 特殊用法:sql、include標簽的使用
     * @return
     */
    @ResponseBody
    @GetMapping("/findListByid")
    public List<User> findListByid(){
        String id = "2";
        List<User> list = userService.findListByid(id);
        return list;
    }

    /**
     * 查詢單個-參數為對象(若是結果為多個會報錯)
     * @return
     */
    @ResponseBody
    @GetMapping("/findListByUser")
    public Map<String,Object> findListByUser(){
        User user = new User();
        user.setId("2");
        Map<String,Object> map = userService.findListByUser(user);
        return map;
    }

    /**
     * 查詢多個-參數為對象
     * @return
     */
    @ResponseBody
    @GetMapping("/findListByUserList")
    public List<Map<String,Object>> findListByUserList(){
        User user = new User();
        user.setName("2");
        List<Map<String,Object>> list = userService.findListByUserList(user);
        return list;
    }

    /**
     * 查詢多個-使用分頁插件pagehelper
     * 特殊用法:if、where標簽的使用
     * @return
     */
    @ResponseBody
    @GetMapping("/findListByPagehelper")
    public List<User> findListByPagehelper(){
        String pageno = "1";
        String pagesize = "10";
        User user = new User();
        user.setName("2");
        user.setPageno("1");
        user.setPagesize("10");
        List<User> list = userService.findListByPagehelper(user);
        return list;
    }

    //-------------------------------------------------------------------------刪除----------------------------------------------------------------------------

    /**
     * 刪除(單個參數)
     */
    @ResponseBody
    @GetMapping("/deleteOne")
    public int deleteOne(){
        String param = "1";
        int num = userService.deleteOne(param);
        return num;
    }

    /**
     * 刪除(多個參數)
     */
    @ResponseBody
    @GetMapping(value = "deleteMore")
    public int deleteMore(){
        User user = new User();
        user.setId("1");
        user.setName("1");
        int num = userService.deleteMore(user);
        return num;
    }

    //-------------------------------------------------------------------------修改----------------------------------------------------------------------------

    /**
     * 修改(單個參數)
     */
    @ResponseBody
    @GetMapping(value = "updateOne")
    public int updateOne(){
        String param = "1";
        int num = userService.updateOne(param);
        return num;
    }

    /**
     * 修改(多個參數)
     */
    @ResponseBody
    @GetMapping(value = "updateMore")
    public int updateMore(){
        User user = new User();
        user.setId("2");
        user.setName("33");
        int num = userService.updateMore(user);
        return num;
    }

}
View Code

(5)User

package com.flyinghome.tm.model;

import lombok.Data;

@Data
public class User {
    private String id;
    private String name;
    private String password;
    private String pageno;
    private String pagesize;
}
View Code

(6)UserService

package com.flyinghome.tm.service;

import com.flyinghome.tm.model.User;
import java.util.List;
import java.util.Map;

public interface UserService {

    //---------------------添加---------------------

    int insertUser(User user);

    int insertAllList(List<User> list);

    int insertAllArray(User[] userArray);

    int insertProcedure(User user);

    int insertAllMap(Map<String,Object> usermap);

    //---------------------查詢---------------------

    List<User> findListByid(String id);

    Map<String,Object> findListByUser(User user);

    List<Map<String,Object>> findListByUserList(User user);

    List<User>  findListByPagehelper(User user);

    //---------------------刪除---------------------

    int deleteOne(String param);

    int deleteMore(User user);

    //---------------------更新---------------------

    int updateOne(String param);

    int updateMore(User user);
    
}
View Code

(7)UserServiceImpl

package com.flyinghome.tm.service.impl;

import com.flyinghome.tm.dao.UserDao;
import com.flyinghome.tm.model.User;
import com.flyinghome.tm.service.UserService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

@Service(value="userService")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    //----------------------------------------------------添加---------------------------------------------------------

    @Override
    public int insertUser(User user) {
        int result = userDao.insertUser(user);
        return result;
    }

    @Override
    public int insertAllList(List<User> list) {
        int result = userDao.insertAllList(list);
        return result;
    }

    @Override
    public int insertAllArray(User[] userArray) {
        int result = userDao.insertAllArray(userArray);
        return result;
    }

    @Override
    public int insertProcedure(User user) {
        int result = userDao.insertProcedure(user);
        return result;
    }

    @Override
    public int insertAllMap(Map<String, Object> usermap) {
        int result = userDao.insertAllMap(usermap);
        return result;
    }

    //----------------------------------------------------查詢---------------------------------------------------------
    @Override
    public List<User> findListByid(String id){
        return userDao.findListByid(id);
    }

    @Override
    public Map<String,Object> findListByUser(User user) {
        return userDao.findListByUser(user);
    }

    @Override
    public List<Map<String,Object>> findListByUserList(User user) {
        return userDao.findListByUserList(user);
    }

    @Override
    public List<User> findListByPagehelper(User user) {
        PageHelper.startPage(Integer.parseInt(user.getPageno()),Integer.parseInt(user.getPagesize()));
        List<User> list = userDao.findListByPagehelper(user);
        PageInfo<User> pageInfo = new PageInfo(list);
        return list;
    }

    //----------------------------------------------------刪除---------------------------------------------------------

    @Override
    public int deleteOne(String param){
        return userDao.deleteOne(param);
    }

    @Override
    public int deleteMore(User user){
        return userDao.deleteMore(user);
    }

    //----------------------------------------------------修改---------------------------------------------------------

    @Override
    public int updateOne(String param){
        return userDao.updateOne(param);
    }

    @Override
    public int updateMore(User user){
        return userDao.updateMore(user);
    }
    
}
View Code

(8)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.flyinghome.tm.dao.UserDao" >

  <sql id="tablename">
    user
  </sql>

  <!--id:唯一標識,與dao接口方法的名稱一致  parameterType:傳入參數,可以是最基本的數據類型,也可以是實體類-->
  <insert id="insertUser" parameterType="com.flyinghome.tm.model.User">
    insert into User (id,name,password) values (#{id,jdbcType=VARCHAR},#{name,jdbcType=VARCHAR},#{password,jdbcType=VARCHAR})
  </insert>

  <!--collection:如果是循環list,這固定填寫list(固定寫法) item:list中每組對象的別名,可隨意自定義. index:索引值 -->
  <!--這里要注意yml配置文件中,要配置allowMultiQueries=true,即允許批量處理-->
  <insert id="insertAllList" parameterType="java.util.List">
    insert into User (id,name,password) values
    <foreach collection="list" item="item" index="index" separator=",">
      (#{item.id,jdbcType=VARCHAR},#{item.name,jdbcType=VARCHAR},#{item.password,jdbcType=VARCHAR})
    </foreach>
  </insert>

  <insert id="insertProcedure" parameterType="com.flyinghome.tm.model.User" statementType="CALLABLE">
    {call test(#{id,mode=IN},#{name,mode=IN},#{password,mode=IN})}
  </insert>

  <insert id="insertAllMap" parameterType="java.util.Map">
    insert into user (id,name,password) values (#{id},#{name},#{password})
  </insert>

  <insert id="insertAllArray" parameterType="java.util.List">
    insert into user (id,name,password) values
    <foreach collection="array" item="userArray" separator=",">
      (#{userArray.id}, #{userArray.name}, #{userArray.password})
    </foreach>
  </insert>

  <select id="findListByid" parameterType="string" resultType="com.flyinghome.tm.model.User">
    select id,name,password from
    <include refid="tablename"></include>
    where id = #{id}
  </select>

  <select id="findListByUser" parameterType="com.flyinghome.tm.model.User" resultType="map">
    select * from user where id = #{id}
  </select>

  <select id="findListByUserList" parameterType="com.flyinghome.tm.model.User" resultType="map">
    select id,name,password from user where name = #{name}
  </select>

  <select id="findListByPagehelper" parameterType="com.flyinghome.tm.model.User" resultType="map">
    select id,name,password from user
    <where>
      <if test="name != null and name != ''">
        name like '%' #{name} '%'
      </if>
    </where>
  </select>

  <delete id="deleteOne" parameterType="string">
    delete from user where id = #{value}
  </delete>

  <delete id="deleteMore" parameterType="com.flyinghome.tm.model.User">
    delete from user where id = #{id} and name = #{name}
  </delete>

  <update id="updateOne" parameterType="string">
    update user set name = 'zhangsan' where id = #{param}
  </update>

  <update id="updateMore" parameterType="com.flyinghome.tm.model.User">
    update user set name = #{name} where id = #{id}
  </update>

</mapper>
View Code

(9)UserDao

package com.flyinghome.tm.dao;

import com.flyinghome.tm.model.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface UserDao {

    //---------------------------添加-----------------------------
    int insertUser(User user);

    int insertAllList(List<User> list);

    int insertAllArray(User[] userArray);

    int insertProcedure(User user);

    int insertAllMap(Map<String,Object> usermap);

    //---------------------------查詢-----------------------------

    List<User> findListByid(String id);

    Map<String,Object> findListByUser(User user);

    List<Map<String,Object>> findListByUserList(User user);

    List<User> findListByPagehelper(User user);

    //---------------------------刪除-----------------------------

    int deleteOne(String param);

    int deleteMore(User user);

    //---------------------------更新-----------------------------

    int updateOne(String param);

    int updateMore(User user);
}
View Code

(10)TmApplicationTests

package com.flyinghome.tm;

import org.junit.Test;
//import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class TmApplicationTests {

    @Test
    void contextLoads() {
    }

}
View Code

(10)數據庫。

這里我就創建了一個表用於測試。

數據庫名:test。

數據庫賬號:root。

數據庫密碼:root。

表名:user。

這里我隨便存了11條數據,用來測試增刪改查功能以及分頁效果。

四、訪問方式

訪問方式為:http://localhost:端口號/類上注解@RequestMapping的value值/方法上注解@GetMapping的value值。如:http://localhost:8080/test/findListByid

 

持續更新!!!


免責聲明!

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



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