zoukankan      html  css  js  c++  java
  • 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

    持续更新!!!

  • 相关阅读:
    NGUI的HUD Text的扩展插件学习--(HUDText)的使用
    C#设计模式:外观模式(Facade Pattern)
    NGUI的HUD Text的扩展插件学习--(UIFollowTarget)的使用
    NGUI的怎么在一个Gameobject(游戏物体)中调用另一个Gameobject(游戏物体)的脚本(C#)
    C#设计模式:组合模式(Composite Pattern)
    C#Contains方法的错误理解
    C#.NET动态页面静态化生成
    C++ primer plus读书笔记——第1章 预备知识
    如何判断一个数是2的幂
    C++将数值转换为string
  • 原文地址:https://www.cnblogs.com/flyinghome/p/12904293.html
Copyright © 2011-2022 走看看