zoukankan      html  css  js  c++  java
  • springboot---->集成mybatis开发(一)

      这里面我们介绍一下springboot与mybatis的集成,主要完成了mybatis的真分页。一个成熟的人往往发觉可以责怪的人越来越少,人人都有他的难处。

    springboot简单集成mytbatis

    一、集成mybatis需要额外的依赖

    我们使用的是mysql数据库,需要mysql的驱动,这里就不列举springboot的基础依赖了。

    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.1</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>

    在application.yml中配置mybatis的一些属性。mybatis_config.xml是mybatis的配置,sql_*.xml是sql语句。

    mybatis:
      mapper-locations: classpath:config/mweb/sql_*.xml
      config-location: classpath:config/setting/mybatis_config.xml
      type-aliases-package: com.linux.huhx.learn.mybatis.bean

      这里面引入mybatis_config.xml文件,主要是为了添加分页的拦截器。这个后面再做详细介绍,至此mybatis的配置就告一段落。下面我们通过实例来体会一下项目中经常遇到的问题。

    springboot配置mybatis的分页

    一、mybatis的拦截器实现真分页

      mybatis内置实现的分页是逻辑分页,并没有做到真正的分页。现在我们在springboot中集成一下mybatis的真分页功能。首先添加依赖pagehelper。

    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>${pagehelper-version}</version>
    </dependency>

      在mybatis的配置文件中,添加plugin。主体修改文件是上面的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>  
        <plugins>
            <plugin interceptor="com.github.pagehelper.PageInterceptor">
                <property name="helperDialect" value="mysql"/>
            </plugin>
        </plugins>
    </configuration>

      我们的实体Bean类User,位于com.linux.huhx.learn.mybatis.bean包内,也就是上述配置的type-aliases-package,这样在涉及到实体类写sql语句的时候,可以不用写包名。

    public class User implements Serializable {
        private String userId;
        private String username;
        private String password;
        private int sex;
        private String phoneNumber;
        private String address;
        private Date birthday
    }

      User类与数据库的puser表字段是对应开来的,这里面省略了bean类的get和set方法。后续的实体bean都会省略这些set和get的方法。

    @RestController
    @RequestMapping("/pageHelper")
    public class PageHelperAction {
    
        @Resource
        private SqlSession sqlSession;
    
        @RequestMapping("/getUser")
        public ResponseBean<List<User>> getUsersByPage() {
            PageHelper.startPage(2, 3);
            List<User> pagelist = this.sqlSession.selectList("user.queryAllUserInfo");
            return ResultUtil.success(pagelist);
        }
    }

    我们的user.queryAllUserInfo对应的sql语句如下:

    <!-- 分页查询所有的用户 -->
    <select id="queryAllUserInfo" resultType="User">
        SELECT
            userId,
            username,
            password,
            address,
            phoneNumber,
            birthday,
            sex
        FROM
            puser
        ORDER BY
            userId DESC
    </select>

    通过请求下面的controller,get的url为:http://localhost:9998/pageHelper/getUser。通过下面的日志,我们知道实现的是真的分页。

    22:00:35.032 [http-nio-9998-exec-1] DEBUG user.queryAllUserInfo_COUNT - ==>  Preparing: SELECT count(0) FROM puser 
    22:00:35.057 [http-nio-9998-exec-1] DEBUG user.queryAllUserInfo_COUNT - ==> Parameters: 
    22:00:35.071 [http-nio-9998-exec-1] DEBUG user.queryAllUserInfo_COUNT - <==      Total: 1
    22:00:35.074 [http-nio-9998-exec-1] DEBUG user.queryAllUserInfo - ==>  Preparing: SELECT userId, username, password, address, phoneNumber, birthday, sex FROM puser ORDER BY userId DESC LIMIT ?, ? 
    22:00:35.074 [http-nio-9998-exec-1] DEBUG user.queryAllUserInfo - ==> Parameters: 3(Integer), 3(Integer)
    22:00:35.078 [http-nio-9998-exec-1] DEBUG user.queryAllUserInfo - <==      Total: 3

    需要注意的是在查询数目的总数的时候,没有加上order by userId desc。这样的处理确认挺好的,没有额外的查询开销。

    二、使用Mapper的接口编程方式

      网上用mybatis的大多都是使用mapper的接口方式,这里面我们对这种方式做一个了解。至于我为什么没有使用这种方式,由于使用了动态代理,性能是没有上述直接sqlSession.selectList等那么好,可能这个是主要的原因(使用mapper的方式确实可以避免很多问题,比如namespace的冲突、方法返回类型等问题)。

    首先定义一个mapper的接口:

    package com.linux.huhx.learn.mybatis.mapper;
    
    import com.linux.huhx.learn.mybatis.bean.User;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Param;
    import org.apache.ibatis.annotations.Select;
    
    @Mapper
    public interface UserMapper {
    
        @Select("select * from puser where userId = #{userId}")
        User queryUserById(@Param("userId") String userId);
    }

    在我们测试控制器中,我们测试一下Mapper的效果:

    @RestController
    @RequestMapping("/mapper")
    public class UserMapperAction {
    
        @Resource
        private UserMapper userMapper;
    
        @GetMapping("user")
        public ResponseBean<User> getUserById(@RequestParam("userId") String userId) {
            User user = userMapper.queryUserById(userId);
            return ResultUtil.success(user);
        }
    }

    通过get请求:http://localhost:9998/mapper/user?userId=1。我们得到以下的返回数据:

    {
        "returnCode": 0,
        "returnMessage": "成功",
        "response": {
            "userId": "1",
            "username": "huhx1",
            "password": "1241",
            "sex": 1,
            "phoneNumber": null,
            "address": "1513427390537",
            "birthday": null
        }
    }

      这种方式确实写起来比较舒服,不用额外的去维护一个写sql的xml文件。而且一个Mapper的接口就完成了整个Dao的代码。当然也可以不用类似于@Select注解,sql语句也可以定义在xml里面。

    @GetMapping("user2")
    public ResponseBean<User> getUserById2(@RequestParam("userId") String userId) {
        User user = userMapper.queryUserByXMlId(userId);
        return ResultUtil.success(user);
    }

     在上述的userMapper类里面添加方法queryUserByXMlId:

    User queryUserByXMlId(String userId);

    添加的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.linux.huhx.learn.mybatis.mapper.UserMapper">
        <select id="queryUserByXMlId" resultType="User" parameterType="string">
            SELECT
              *
            FROM
              puser
            WHERE
              userId = #{userId}
        </select>
    </mapper>

    友情链接

  • 相关阅读:
    LintCode Python 简单级题目 488.快乐数
    LintCode Python 简单级题目 100.删除排序数组中的重复数字 101.删除排序数组中的重复数字II
    LintCode Python 简单级题目 373.奇偶分割数组
    LintCode Python 简单级题目 39.恢复旋转排序数组
    LintCode Python 简单级题目 35.翻转链表
    LintCode Python 简单级题目 451.两两交换链表中的节点
    LintCode Python 简单级题目 174.删除链表中倒数第n个节点
    aws查看官方centos镜像imageid
    linux shell脚本查找重复行/查找非重复行/去除重复行/重复行统计
    php配置优化-生产环境应用版
  • 原文地址:https://www.cnblogs.com/huhx/p/baseusespringbootmybatis1.html
Copyright © 2011-2022 走看看