标签<set>、<foreach>案例
一、搭建mybatis环境
1.创建数据表
2.创建项目工程
3.引入依赖 (junit、mybatis、mysql、log4j、lombok)
4.导入相关资源包
4.1创建核心配置文件所使用的db.properties文件
mysql.driver=com.mysql.cj.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
mysql.username=root
mysql.password=root
4.2创建核心配置文件 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>
<!-- 环境配置 -->
<!-- 加载类路径下的属性文件 -->
<properties resource="db.properties"/>
<typeAliases>
<package name="com.biem.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 数据库连接相关配置 ,db.properties文件中的内容-->
<dataSource type="POOLED">
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
<!-- mapping文件路径配置 -->
<mappers>
<package name="com.biem.mapper"/>
</mappers>
</configuration>
4.3创建log4j.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n"/>
</layout>
</appender>
<logger name="java.sql">
<level value="debug"/>
</logger>
<logger name="org.apache.ibatis">
<level value="info"/>
</logger>
<root>
<level value="debug"/>
<appender-ref ref="STDOUT"/>
</root>
</log4j:configuration>
5.创建用户配置文件
5.1创建pojo实体类
package com.biem.pojo;
import lombok.*;
@Setter
@Getter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Customer {
public Integer id;
public String username;
public String jobs;
public String phone;
}
5.2创建mapper接口类
package com.biem.mapper;
public interface CustomerMapper {
}
5.3创建util工具类
package com.biem.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
/**
* ClassName: MybatisUtil
* Package: com.biem.utils
* Description:
*
* @Create 2023/4/5 22:23
* @Version 1.0
*/
public class MybatisUtil {
//利用static(静态)属于类不属于对象,且全局唯一
private static SqlSessionFactory sqlSessionFactory = null;
//利用静态块在初始化类时实例化sqlSessionFactory
static {
InputStream is = null;
try {
is = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
throw new ExceptionInInitializerError(e);
}
}
/**
* openSession 创建一个新的SqlSession对象
*
* @return SqlSession对象
*/
public static SqlSession openSession(boolean autoCommit) {
return sqlSessionFactory.openSession(autoCommit);
}
public static SqlSession openSession() {
return sqlSessionFactory.openSession();
}
/**
* 释放一个有效的SqlSession对象
*
* @param session 准备释放SqlSession对象
*/
public static void closeSession(SqlSession session) {
if (session != null) {
session.close();
}
}
}
5.4在resources下创建com/biem/mapper文件夹并创建xxxMapper.xml映射文件
<?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为映射的根节点-->
<!-- mapper为映射的根节点,namespace指定Dao接口的完整类名
mybatis会依据这个接口动态创建一个实现类去实现这个接口,
而这个实现类是一个Mapper对象-->
<mapper namespace="com.biem.mapper.CustomerMapper">
<!--id ="接口中的方法名"
parameterType="传入的参数类型"
resultType = "返回实体类对象,使用包.类名"-->
</mapper>
6.创建测试类文件
二、使用set标签更新记录
1. com.biem.mapper.CustomerMapper.class中添加方法
public int updateCustomerBySet(Customer customer);
2. com/biem/mapper/CustomerMapper.xml中添加sql语句
<!--public int updateCustomerBySet(Customer customer);-->
<update id="updateCustomerBySet" parameterType="customer">
update t_customer
<set>
<if test="username != null and username != ''">
username=#{username}
</if>
<if test="jobs != null and jobs != ''">
jobs=#{jobs}
</if>
<if test="phone != null and phone != ''">
phone=#{phone}
</if>
</set>
where id = #{id}
</update>
3.在com.biem.test.TestMybatis.java添加测试方法
@Test
public void testUpdateCustomerBySet(){
// 通过工具类获取SqlSession对象
SqlSession session = MybatisUtil.openSession(true);
// 创建Customer对象,封装需要组合查询的条件
Customer customer = new Customer();
customer.setId(3);
customer.setPhone("15111001100");
CustomerMapper mapper = session.getMapper(CustomerMapper.class);
int rows = mapper.updateCustomerBySet(customer);
if(rows>0){
System.out.println("您成功的更新了"+rows+"条记录");
}else{
System.out.println("更新失败");
}
// 关闭SqlSession
session.close();
}
4.测试结果
三、<foreach>标签
<foreach> 标签用于循环语句,它很好的支持了数据和 List、set 接口的集合,并对此提供遍历的功能。
属性 | 作用 |
item | 表示集合中每一个元素进行迭代时的别名 |
index | 指定一个名字,表示在迭代过程中每次迭代到的位置 |
open | 表示该语句以什么开始(既然是 in 条件语句,所以必然以’('开始) |
separator | 表示在每次进行迭代之间以什么符号作为分隔符(既然是 in 条件语句,所以必然以‘,’作为分隔符)。 |
collection | 该属性是必选的,但在不同情况下该属性的值是不一样的,主要有以下 3 种情况: (1)如果传入的是单参数且参数类型是一个 List,collection 属性值为 list (2)如果传入的是单参数且参数类型是一个 array 数组,collection 的属性值为 array (3)如果传入的参数是多个,需要把它们封装成一个 Map,当然单参数也可以封装成 Map。Map 的 key 是参数名,collection 属性值是传入的 List 或 array 对象在自己封装的 Map 中的 key。 |
close | 表示该语句以什么结束(既然是 in 条件语句,所以必然以’)'结束。 |
(1)foreach元素迭代数组
1. com.biem.mapper.CustomerMapper.class中添加方法
public List<Customer> findCustomerByArray(int [] ids);
2. com/biem/mapper/CustomerMapper.xml中添加sql语句
<!--public List<Customer> findCustomerByArray(int [] arrays);-->
<select id="findCustomerByArray" parameterType="java.util.Arrays" resultType="customer">
select * from t_customer where id in
<foreach item = "id" index = "index" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</select>
3.在com.biem.test.TestMybatis.java添加测试方法
@Test
public void testFindCustomerByArray(){
// 通过工具类获取SqlSession对象
SqlSession session = MybatisUtil.openSession();
int[] ids={1,3};
CustomerMapper mapper = session.getMapper(CustomerMapper.class);
List<Customer> customers = mapper.findCustomerByArray(ids);
System.out.println("customers = " + customers);
// 关闭SqlSession
session.close();
}
4.测试结果
(2)foreach元素迭代List
1. com.biem.mapper.CustomerMapper.class中添加方法
public List<Customer> findCustomerByList(List<Integer> ids);
2. com/biem/mapper/CustomerMapper.xml中添加sql语句
<!--public List<Customer> findCustomerByList(List<Integer> ids);-->
<select id="findCustomerByList" parameterType="java.util.List" resultType="customer">
select * from t_customer where id in
<foreach item = "id" index = "index" collection="list" open="(" separator="," close=")">
#{id}
</foreach>
</select>
3.在com.biem.test.TestMybatis.java添加测试方法
@Test
public void testFindCustomerByList(){
// 通过工具类获取SqlSession对象
SqlSession session = MybatisUtil.openSession();
List<Integer> ids = new ArrayList<>();
ids.add(1);
ids.add(2);
CustomerMapper mapper = session.getMapper(CustomerMapper.class);
List<Customer> customers = mapper.findCustomerByList(ids);
System.out.println("customers = " + customers);
// 关闭SqlSession
session.close();
}
4.测试结果
(3)foreach元素迭代Map
1. com.biem.mapper.CustomerMapper.class中添加方法
public List<Customer> findCustomerByMap(Map<String, Object> map);
2. com/biem/mapper/CustomerMapper.xml中添加sql语句
<!--public List<Customer> findCustomerByMap(Map<String, Object> map);-->
<select id="findCustomerByMap" parameterType="java.util.Map" resultType="customer">
select * from t_customer where jobs=#{jobs} and id in
<foreach item = "ids" index = "index" collection="id" open="(" separator="," close=")">
#{ids}
</foreach>
</select>
3.在com.biem.test.TestMybatis.java添加测试方法
@Test
public void testFindCustomerByMap(){
// 通过工具类获取SqlSession对象
SqlSession session = MybatisUtil.openSession();
List<Integer> ids = new ArrayList<>();
ids.add(1);
ids.add(2);
ids.add(3);
Map<String, Object> maps = new HashMap<>();
maps.put("id", ids);
maps.put("jobs","teacher");
CustomerMapper mapper = session.getMapper(CustomerMapper.class);
List<Customer> customers = mapper.findCustomerByMap(maps);
System.out.println("customers = " + customers);
// 关闭SqlSession
session.close();
}
4.测试结果