为什么需要使用动态sql?
在实际项目的开发中,开发人员在使用JDBC或其他持久层框架进行开发时,经常需要根据不同的条件拼接SQL语句,拼接SQL语句时还要确保不能遗漏必要的空格、标点符号等,这种编程方式给开发人员带来了非常大的不便,而MyBatis提供的SQL语句动态组装功能,恰能很好地解决这一问题。
动态SQL中的元素
通过一个具体的案例演示单条件判断下
1.引入依赖
pom.xml
4.0.0
org.example
_20230410
1.0-SNAPSHOT
8
8
UTF-8
org.springframework
spring-context
5.2.3.RELEASE
org.springframework
spring-beans
5.2.3.RELEASE
org.mybatis
mybatis
3.5.2
mysql
mysql-connector-java
8.0.11
junit
junit
4.12
test
2.数据库建表
3.根据数据库字段创建实体类Customer
package cn.hdc.pojo;
public class Customer {
private int id;
private String username;
private String jobs;
private String phone;
@Override
public String toString() {
return "Customer{" +
"id=" + id +
", username='" + username + '\'' +
", jobs='" + jobs + '\'' +
", phone='" + phone + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getJobs() {
return jobs;
}
public void setJobs(String jobs) {
this.jobs = jobs;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
4.创建CustomerMapper接口,申明要实现的方法 findCustomerByUsernameAndJobs
package cn.hdc.mapper;
import cn.hdc.pojo.Customer;
import java.util.List;
public interface CustomerMapper {
public List findCustomerByUsernameAndJobs(Customer customer);
}
5.根据接口alt+insert快速创建CustomerMapper.xml(映射文件)
6.创建db.properties,配置数据库连接属性
driver.driver=com.mysql.cj.jdbc.Driver
driver.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
driver.username=root
driver.password=666666
7.配置mybatis-config.xml
8.根据CustomerMapper接口,alt+insert 快速创建测试类:
package cn.hdc.mapper;
import cn.hdc.pojo.Customer;
import cn.hdc.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
import static org.junit.Assert.*;
public class CustomerMapperTest {
private SqlSession session;
@Before
public void setUp() throws Exception {
session = MybatisUtils.getSession();
}
@After
public void tearDown() throws Exception {
session.close();
}
@Test
public void findCustomerByUsernameAndJobs() {
Customer customer = new Customer();
//customer.setUsername("jack");
customer.setJobs("teacher");
List customers = session.selectList("cn.hdc.mapper.CustomerMapper.findCustomerByUsernameAndJobs", customer);
for (Customer c : customers) {
System.out.println(c);
}
}
}
运行结果:
项目结构:
在使用
代码结构不变,只是在上一个例子中CustomerMapper.xml添加如下代码:
在接口中申明方法:
添加测试方法:
运行结果:
上述代码配置中,
上述配置代码中,
更新操作
在Hibernate框架中,如果想要更新某一个对象,就需要发送所有的字段给持久化对象,然而在实际应用中,大多数情况下都是更新某一个或几个字段。如果更新的每一条数据都要将其所有的属性都更新一遍,那么执行效率是非常差的。为了解决更新数据的效率问题,MyBatis提供了
代码示例:
CustomerMapper.xml中添加以下代码:
update t_customer
username=#{username},
jobs=#{jobs},
phone=#{phone},
where id = #{id}
接口中声明此方法:
创建测试方法:
运行结果:
第二种方法使用
update t_customer
username=#{username},
jobs=#{jobs},
phone=#{phone},
where id = #{id}
复杂查询操作
在遍历参数时,
例如,要从数据表t_customer中查询出id为1、2、3的客户信息,就可以利用数组作为参数,存储id的属性值1、2、3,并通过
CustomerMapper.xml
CustomerMapper接口:
测试方法:
运行结果:
CustomerMapper.xml
CustomerMapper接口:
创建测试方法:
运行结果:
CustomerMapper.xml
CustomerMapper接口:
创建测试方法:
运行结果: