10.2 MyBatis动态SQL 10.2.0测试项目框架

10.2 MyBatis动态SQL

在实际项目开发中,经常需要根据不同条件拼接SQL语句,拼接时一定不能忘了必要的空格,有时候还要注意省略掉列名列表最后的逗号,等等。在使用JDBC或其他类似持久层框架操作数据库时,处理这种情况是非常麻烦的,甚至可以用痛苦来形容,而在MyBatis中利用动态SQL这一特性可以很简单地解决这个问题.
动态SQL元素和使用JSTL或其他类似基于XML的文本处理器相似,MyBatis采用功能强大的基于OGNL的表达式来完成动态SQLOGNL的表达式可以用在任意的SQL映射语句.
常用的动态SQL元素包括:

  • if
  • choose (when, otherwise)、
  • where
  • set
  • foreach
  • bind

下面我们就用一个简单示例来看看在MyBatis中怎么使用动态SQL.

创建测试项目

项目结构

展开/折叠
G:\workspace_web2\MyDynamicSQLTest
├─src\
│ ├─db.properties
│ ├─domain\
│ │ ├─Employee.java
│ │ └─tb_employee.sql
│ ├─fractory\
│ │ └─SqlSessionFratoryTools.java
│ ├─log4j.xml
│ ├─log4j2.xml
│ ├─mapper\
│ │ ├─EmployeeMapper.java
│ │ └─EmployeeMapper.xml
│ ├─mybatis-config.xml
│ ├─tb_employee.sql
│ └─test\
│   ├─BindTest.java
│   ├─ChooseTest.java
│   ├─DoubleIfTest.java
│   ├─ForEachTest.java
│   ├─OneIfTest.java
│   ├─SetTest.java
│   └─WhereTest.java
└─WebContent\
  ├─META-INF\
  │ └─MANIFEST.MF
  └─WEB-INF\
    └─lib\
      ├─ant-1.9.6.jar
      ├─ant-launcher-1.9.6.jar
      ├─asm-5.2.jar
      ├─cglib-3.2.5.jar
      ├─commons-logging-1.2.jar
      ├─javassist-3.22.0-CR2.jar
      ├─log4j-1.2.17.jar
      ├─log4j-api-2.3.jar
      ├─log4j-core-2.3.jar
      ├─mybatis-3.4.5.jar
      ├─mysql-connector-java-5.1.44-bin.jar
      ├─ognl-3.1.15.jar
      ├─slf4j-api-1.7.25.jar
      └─slf4j-log4j12-1.7.25.jar

创建数据库表

首先,给之前创建的mybatis数据库创建一个表tb_employee,并插入测试数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建数据表
DROP TABLE IF EXISTS `tb_employee`;
CREATE TABLE `tb_employee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`loginname` varchar(18) DEFAULT NULL,
`password` varchar(18) DEFAULT NULL,
`name` varchar(18) DEFAULT NULL,
`sex` char(2) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`phone` varchar(21) DEFAULT NULL,
`sal` double DEFAULT NULL,
`state` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
# 插入数据
INSERT INTO `tb_employee` VALUES ('1', 'xiaoming', 'xiaoming', '小明', '男', '19', '123456789123', '9800', 'active');
INSERT INTO `tb_employee` VALUES ('2', 'xiaowang', 'xiaowang', '小王', '男', '21', '123456789123', '6800', 'active');
INSERT INTO `tb_employee` VALUES ('3', 'xiaoli', 'xiaoli', '小丽', '女', '23', '123456789123', '7800', 'active');
INSERT INTO `tb_employee` VALUES ('4', 'xiaofang', 'xiaofang', '小芳', '女', '22', '123456789123', '8800', 'active');

创建持久化对象

接下来,创建一个Employee对象映射tb_emp1oyee表。

/DynamicSQLTest/src/org/fkit/domain/Employee.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package domain;
public class Employee {
private Integer id;
private String loginname;
private String password;
private String name;
private String sex;
private Integer age;
private String phone;
private double sal;
private String state;
// 构造方法
public Employee()
{
super();
}
// 此处省略getter和setter方法,请自己补上
@Override
public String toString()
{
return "Employee [id=" + id + ", loginname=" + loginname + ", password=" + password
+ ", name=" + name + ", sex=" + sex + ", age=" + age + ", phone=" + phone + ", sal="
+ sal + ", state=" + state + "]";
}
}

创建Mapper.xml映射文件

/DynamicSQLTest/src/org/fkit/mapper/EmployeeMapper.xml
1
2
3
4
5
<?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="mapper.EmployeeMapper">

</mapper>

这个是个空的映射文件,后面用到的标签再往里面添加.

创建mapper接口

/DynamicSQLTest/src/org/fkit/mapper/EmployeeMapper.java
1
2
3
package mapper;
public interface EmployeeMapper {
}

这个接口是个空接口,后面有用到的方法再往接口中添加.