• 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>

    友情链接

  • 相关阅读:
    前端开发中一些好用的软件包。
    LeetCode 26 删除排序数组中的重复项
    算法 主定理
    算法学习计划继续三四个月
    Web Api
    DOM viewport
    CSS OM
    DOM Range Api
    DOM 操作 2
    DOM Event
  • 原文地址:https://www.cnblogs.com/huhx/p/baseusespringbootmybatis1.html
Copyright © 2020-2023  润新知