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>

 

友情鏈接

 


免責聲明!

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



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