MyBatis的 SQL 语句构建、分页、日志

2024/1/12 MyBatis框架

# 1、SQL 语句构建

在 Java 代码中动态生成 SQL 代码,是很头疼的一件事。比如如下:

String sql = "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME, "
"P.LAST_NAME,P.CREATED_ON, P.UPDATED_ON " +
"FROM PERSON P, ACCOUNT A " +
"INNER JOIN DEPARTMENT D on D.ID = P.DEPARTMENT_ID " +
"INNER JOIN COMPANY C on D.COMPANY_ID = C.ID " +
"WHERE (P.ID = A.ID AND P.FIRST_NAME like ?) " +
"OR (P.LAST_NAME like ?) " +
"GROUP BY P.ID " +
"HAVING (P.LAST_NAME like ?) " +
"OR (P.FIRST_NAME like ?) " +
"ORDER BY P.ID, P.FULL_NAME";
1
2
3
4
5
6
7
8
9
10
11

对于可读性和维护性上来说都是很差的。

MyBatis 提供了条件构造器,可以简化 SQL 代码的动态编写。

@Test
public void testSQL(){
    String sqlStr = new SQL().SELECT("username,sex").FROM("user").WHERE("id=#{id}").toString();
    log.info("sqlStr ==> "+sqlStr);
}

// 输出结果:SELECT username,sex FROM user WHERE (id=#{id})
1
2
3
4
5
6
7

所有方法可参考:SQL 语句构建器 (opens new window),当然在开发中我们会更常用MyBatisPlus中的CRUD 接口条件构造器

# 2、分页插件

  • 新增分页依赖
<dependency>
  <groupId>com.github.pagehelper</groupId>
  <artifactId>pagehelper</artifactId>
  <version>5.2.0</version>
</dependency>
1
2
3
4
5
  • mybatis-config.xml中配置分页插件
<plugins>
  <plugin interceptor="com.github.pagehelper.PageInterceptor">
    <!--分页参数合理化,不可能达到一个不正确的页码,如-1,超过总页数,查询最后一页-->
    <property name="reasonable" value="true"/>
  </plugin>
</plugins>
1
2
3
4
5
6
  • 测试使用
//调用查询方法
@Test
public void testGetUserList(){
    //第一个参数传入:第几页,第二个参数传入:每页多少条数据
    PageHelper.startPage(1,5);

    List<UserPO> userList = userService.queryUserList();;

    //创建PageInfo对象,传进去结果,和每页多少条数据
    PageInfo info = new PageInfo(userList,5);

    // 通过调用info对象里面的方法 就能得到所有的分页信息,分页总页数,总记录数
    // info.getList();方法就是得到查询到的分页数据,返回一个list集合
    System.out.printf("用户信息: "+info.getList());
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 3、日志

使用log4j日志,方便我们查看sql语句。

  • 新增日志依赖
<!-- 添加slf4j日志api,该日志之前已经增加-->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.20</version>
</dependency>

<!-- log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
<!-- slf4j-log4j12 日志适配器 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.25</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  • resources下增加log4j.properties配置
log4j.rootLogger=DEBUG, stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n

log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
1
2
3
4
5
6
7
8
9
10

随便执行一个查询,看看日志。