本篇文章比較適合初學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>
(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
(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); } }
(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; } }
(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; }
(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); }
(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); } }
(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>
(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); }
(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() {
}
}
(10)數據庫。
這里我就創建了一個表用於測試。
數據庫名:test。
數據庫賬號:root。
數據庫密碼:root。
表名:user。
這里我隨便存了11條數據,用來測試增刪改查功能以及分頁效果。
四、訪問方式
訪問方式為:http://localhost:端口號/類上注解@RequestMapping的value值/方法上注解@GetMapping的value值。如:http://localhost:8080/test/findListByid
持續更新!!!