一起学习框架SSM之MyBatis(二)
程序员文章站
2022-12-04 23:06:52
MyBatis==MyBatis工具类==1.封装工具类==ORM映射==MyBatis自动ORM失效1.解决方案一:列的别名2.解决方案二:结果映射ResultMap==MyBatis处理关联关系-多表连接==1.一对一2.一对多3. 多对多4.关系总结==动态SQL==MyBatis工具类1.封装工具类目的是为了封装这些Mybatis的api,因为每次调用业务逻辑的时候都需要重复使用 InputStream resourceAsStream = Resources.getResourceAsS...
MyBatis
MyBatis工具类
1.封装工具类
目的是为了封装这些Mybatis的api,因为每次调用业务逻辑的时候都需要重复使用
InputStream resourceAsStream = Resources.getResourceAsStream("Mybatis-config.xml");
// 2.创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 3.通过SqlSessionFactory创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.commit();
//
sqlSession.rollback();
- 写一个工具类封装
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory;
// 创建ThreadLocal绑定当前线程中的SqlSession对象
private static final ThreadLocal<SqlSession> t1=new ThreadLocal<SqlSession>();
// 加载配置文件加载一次就可以了,所以使用静态代码块
static {
try {
InputStream resourceAsStream = Resources.getResourceAsStream("Mybatis-config.xml");
sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream);
} catch (IOException e) {
e.printStackTrace();
}
}
// 创建SqlSession
public static SqlSession openSession(){
SqlSession sqlSession = t1.get();
if (sqlSession==null){
sqlSession = sqlSessionFactory.openSession();
t1.set(sqlSession);
}
return sqlSession;
}
// 事务提交
public static void commit(){
SqlSession sqlSession = openSession();
sqlSession.commit();
closeSession();
}
// 事务回滚
public static void rollback(){
SqlSession sqlSession = openSession();
sqlSession.rollback();
closeSession();
}
// 资源释放
public static void closeSession(){
SqlSession sqlSession = t1.get();
sqlSession.close();
}
// 通过SqlSession创建Dao接口的实现类对象
public static <T> T getMapper(Class<T> mapper){
SqlSession sqlSession = openSession();
return sqlSession.getMapper(mapper);
}
}
- SqlSession类似JDBC中的Connection,线程唯一,全局不唯一的特点,所以需要调用TreadLocal来绑定线程唯一
// 创建ThreadLocal绑定当前线程中的SqlSession对象
private static final ThreadLocal<SqlSession> t1=new ThreadLocal<SqlSession>();
// 创建SqlSession
public static SqlSession openSession(){
SqlSession sqlSession = t1.get();
if (sqlSession==null){
sqlSession = sqlSessionFactory.openSession();
t1.set(sqlSession);
}
return sqlSession;
}
ORM映射
MyBatis自动ORM失效
- MyBatis只能自动维护数据库列名与持久化类的属性名相同时一一对应关系,二者不同时,无法自动ORM
1.解决方案一:列的别名
通过as来更改列的别名
<select id="queryUserByNameById" resultType="User">
select id,username,password,gender,regist_time as registtime
from mybatis
where id=#{param1} and username=#{param2}
</select>
2.解决方案二:结果映射ResultMap
UserDao-Mapper.xml
<resultMap id="rm" type="User"><!--唯一标识rm,返回结果为User-->
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="gender" property="gender"/>
<result column="regist_time" property="regist_time"/>
</resultMap>
<!--定位dao方法 返回的类型 写入sql语句-->
<select id="queryUser" resultMap="rm">
select id,username,password,gender,regist_time
from mybatis
where id=#{arg0}<!--第一个参数的值-->
</select>
mybatistest
UserDao mapper = MyBatisUtils.getMapper(UserDao.class);
User user = mapper.queryUser(3);
System.out.println(user);
MyBatis处理关联关系-多表连接
1.一对一
- 建立表结构
CREATE TABLE `t_passengers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`sex` varchar(1) DEFAULT NULL,
`birthday` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1003 DEFAULT CHARSET=utf8;
CREATE TABLE `t_passports` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nationality` varchar(50) DEFAULT NULL,
`expire` date DEFAULT NULL,
`passenger_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `passenger_id` (`passenger_id`),
CONSTRAINT `t_passports_ibfk_1` FOREIGN KEY (`passenger_id`) REFERENCES `t_passengers` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=100003 DEFAULT CHARSET=utf8;
1.1单向查询
- 旅客实体类
public class Passenger {
private Integer id;
private String name;
private Boolean sex;
private Date birthday;
//存储旅客的护照信息 关联属性
private Passport passport;
public Passenger(){}
public Passenger(Integer id, String name, Boolean sex, Date birthday) {
this.id = id;
this.name = name;
this.sex = sex;
this.birthday = birthday;
}
public Passport getPassport() {
return passport;
}
public void setPassport(Passport passport) {
this.passport = passport;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getSex() {
return sex;
}
public void setSex(Boolean sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Passenger{" +
"id=" + id +
", name='" + name + '\'' +
", sex=" + sex +
", birthday=" + birthday +
", passport=" + passport +
'}';
}
}
- 护照实体类
public class Passport {
private Integer id;
private String nationality;
private Date expire;
private Integer passengers_id;
//存储旅客的信息
private Passenger passenger;
public Passport(){}
public Passport(Integer id, String nationality, Date expire, Integer passengers_id) {
this.id = id;
this.nationality = nationality;
this.expire = expire;
this.passengers_id = passengers_id;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNationality() {
return nationality;
}
public void setNationality(String nationality) {
this.nationality = nationality;
}
public Date getExpire() {
return expire;
}
public void setExpire(Date expire) {
this.expire = expire;
}
public Integer getPassengers_id() {
return passengers_id;
}
public void setPassengers_id(Integer passengers_id) {
this.passengers_id = passengers_id;
}
}
PassengerDao
public interface PassengerDao {
// 通过旅客的id,查询旅客信息以及护照信息 关联查询
Passenger queryPassengerById(@Param("id") Integer id);
}
PassengerDao-Mapper.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 namespace="cn.ozl.dao.PassengerDao">
<resultMap id="passengermap" type="Passenger">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="sex" property="sex"/>
<result column="birthday" property="birthday"/>
<!--描述passid,nationality,expire和passport映射规则-->
<association property="passport" javaType="Passport">
<id column="passid" property="id"/>
<result column="nationality" property="nationality"/>
<result column="expire" property="expire"/>
</association>
</resultMap>
<!--查询 旅客以及护照信息-->
<select id="queryPassengerById" resultMap="passengermap">
select t_passengers.id,t_passengers.name,t_passengers.sex,t_passengers.birthday,t_passports.id passid,t_passports.nationality,t_passports.expire
from t_passengers join t_passports on t_passengers.id = t_passports.passenger_id
where t_passengers.id=#{id}
</select>
<select id="queryPassengerByname" resultType="Passenger">
select id,name,sex,birthday
from t_passengers
where name=#{name}
</select>
</mapper>
- 测试
public class mybatistest {
public static void main(String[] args) throws IOException {
PassengerDao mapper = MyBatisUtils.getMapper(PassengerDao.class);
Passenger passenger = mapper.queryPassengerById(1001);
System.out.println(passenger);
System.out.println(passenger.getPassport());
}
1.2双向查询
在单向查询的基础上再加上以下代码
PassportDao
public interface PassportDao {
Passport queryPassportById(@Param("id") Integer id);
}
PassportDao-Mapper.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 namespace="cn.ozl.dao.PassportDao">
<resultMap id="passportmap" type="Passport">
<id column="id" property="id"/>
<result column="nationality" property="nationality"/>
<result column="expire" property="expire"/>
<result column="passenger_id" property="passenger_id"/>
<!--描述Passenger的映射规则-->
<association property="passenger" javaType="Passenger">
<id column="passengerid" property="id"/>
<result column="name" property="name"/>
<result column="sex" property="sex"/>
<result column="birthday" property="birthday"/>
</association>
</resultMap>
<!--查询 护照信息以及旅客-->
<select id="queryPassportById" resultMap="passportmap">
select t_passports.id,t_passports.nationality,t_passports.expire,t_passengers.id passengerid,t_passengers.name,t_passengers.sex,t_passengers.birthday
from t_passports join t_passengers on t_passengers.id = t_passports.passenger_id
where t_passports.id=#{id}
</select>
<!-- <select id="queryPassengerByname" resultType="Passenger">-->
<!-- select id,name,sex,birthday-->
<!-- from t_passengers-->
<!-- where name=#{name}-->
<!-- </select>-->
</mapper>
Passport
public class Passport {
private Integer id;
private String nationality;
private Date expire;
private Integer passengers_id;
//存储旅客的信息
private Passenger passenger;
public Passport(){}
public Passport(Integer id, String nationality, Date expire, Integer passengers_id) {
this.id = id;
this.nationality = nationality;
this.expire = expire;
this.passengers_id = passengers_id;
}
public Passenger getPassenger() {
return passenger;
}
public void setPassenger(Passenger passenger) {
this.passenger = passenger;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNationality() {
return nationality;
}
public void setNationality(String nationality) {
this.nationality = nationality;
}
public Date getExpire() {
return expire;
}
public void setExpire(Date expire) {
this.expire = expire;
}
public Integer getPassengers_id() {
return passengers_id;
}
public void setPassengers_id(Integer passengers_id) {
this.passengers_id = passengers_id;
}
@Override
public String toString() {
return "Passport{" +
"id=" + id +
", nationality='" + nationality + '\'' +
", expire=" + expire +
", passengers_id=" + passengers_id +
", passenger=" + passenger +
'}';
}
}
mybatistest
public class mybatistest {
public static void main(String[] args) throws IOException {
PassportDao mapper = MyBatisUtils.getMapper(PassportDao.class);
Passport passport = mapper.queryPassportById(1);
System.out.println(passport);
System.out.println(passport.getPassenger());
}
}
2.一对多
- 建立表结构
create table t_departments(
id int primary key auto_increment,
name varchar(50),
location varchar(100)
)default charset =utf8;
create table t_employees(
id int primary key auto_increment,
name varchar(50),
salary double,
dept_id int,
foreign key (dept_id) references t_departments(id)
)default charset =utf8;
insert into t_departments values(1,"教学部","北京"),(2,"研发部","上海");
insert into t_employees values (1,"ozl01",12000.5,1),(2,"ozl02",12888.8,1),(3,"李四",10000.9,1),(4,"张三",8000,2);
- 雇员实体类
public class Employee {
private Integer id;
private String name;
private double salary;
// 员工的部门信息
private Department department;
public Employee() {
}
public Employee(Integer id, String name, double salary) {
this.id = id;
this.name = name;
this.salary = salary;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", name='" + name + '\'' +
", salary=" + salary +
'}';
}
}
- 部门实体类
public class Department {
private Integer id;
private String name;
private String location;
// 部门的所有员工信息
private List<Employee> employees;
public Department(){}
public Department(Integer id, String name, String location) {
this.id = id;
this.name = name;
this.location = location;
}
public List<Employee> getEmployees() {
return employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
@Override
public String toString() {
return "Department{" +
"id=" + id +
", name='" + name + '\'' +
", location='" + location + '\'' +
", employees=" + employees +
'}';
}
}
DepartmentDao
public interface DepartmentDao {
Department queryDepartmentById(@Param("id") Integer id);
}
DepartmentDao-Mapper.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 namespace="cn.ozl.dao.DepartmentDao">
<resultMap id="dept_emp" type="Department">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="location" property="location"/>
<!-- 关系属性employee-->
<collection property="employees" ofType="Employee">
<id column="emp_id" property="id"/>
<result column="emp_name" property="name"/>
<result column="salary" property="salary"/>
</collection>
</resultMap>
<select id="queryDepartmentById" resultMap="dept_emp">
select t_departments.id,t_departments.name,t_departments.location,t_employees.id emp_id,t_employees.name emp_name,t_employees.salary
from t_departments join t_employees on t_departments.id = t_employees.dept_id
where t_departments.id=#{id}
</select>
</mapper>
测试类
public class mybatistest {
public static void main(String[] args) throws IOException {
DepartmentDao mapper = MyBatisUtils.getMapper(DepartmentDao.class);
Department department = mapper.queryDepartmentById(1);
System.out.println(department);
List<Employee> employees = department.getEmployees();
for (Employee employee : employees) {
System.out.println(employees);
}
}
结果
2.1 多对一
EmployeeDao
public interface EmployeeDao {
Employee queryEmployeeById(@Param("id") Integer id);
}
EmployeeDao-Mapper.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 namespace="cn.ozl.dao.EmployeeDao">
<resultMap id="emp_det" type="Employee">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="salary" property="salary"/>
<!-- 关系属性部门department-->
<association property="department" javaType="Department">
<id column="det_id" property="id"/>
<result column="det_name" property="name"/>
<result column="location" property="location"/>
</association>
</resultMap>
<select id="queryEmployeeById" resultMap="emp_det">
select t_employees.id,t_employees.name,t_employees.salary,t_departments.id det_id,t_departments.name det_name,t_departments.location
from t_employees join t_departments on t_employees.dept_id=t_departments.id
where t_employees.id=#{id}
</select>
</mapper>
注册Mapper
<mapper resource="cn/ozl/dao/EmployeeDao-Mapper.xml"/>
测试类
public static void main(String[] args) throws IOException {
// DepartmentDao mapper = MyBatisUtils.getMapper(DepartmentDao.class);
// Department department = mapper.queryDepartmentById(1);
// System.out.println(department);
// List<Employee> employees = department.getEmployees();
// for (Employee employee : employees) {
// System.out.println(employees);
// }
EmployeeDao mapper = MyBatisUtils.getMapper(EmployeeDao.class);
Employee employee = mapper.queryEmployeeById(2);
System.out.println(employee);
System.out.println(employee.getDepartment());
}
结果
3. 多对多``
- 建立表结构
create table t_students(
id int primary key auto_increment,
name varchar(50),
sex varchar(1)
)default charset =utf8;
create table t_subjects(
id int primary key auto_increment,
name varchar(50),
grade int
)default charset =utf8;
create table t_stu_sub(
student_id int,
subject_id int,
foreign key (student_id) references t_students(id),
foreign key (subject_id) references t_subjects(id),
primary key (student_id,subject_id)
)default charset =utf8;
insert into t_students values (1,"張三",'m'),(2,"李四",'f');
insert into t_subjects values (1001,"java",1),(1002,"php",2);
insert into t_stu_sub values (1,1001),(1,1002),(2,1001),(2,1002);
- Student和Subject实体类
public class Student2 {
private Integer id;
private String name;
private Boolean sex;
private List<Subject> subjects;
public Student2(){}
public Student2(Integer id, String name, Boolean sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getSex() {
return sex;
}
public void setSex(Boolean sex) {
this.sex = sex;
}
public List<Subject> getSubjects() {
return subjects;
}
public void setSubjects(List<Subject> subjects) {
this.subjects = subjects;
}
@Override
public String toString() {
return "Student2{" +
"id=" + id +
", name='" + name + '\'' +
", sex=" + sex +
'}';
}
}
public class Subject {
private Integer id;
private String name;
private Integer grade;
private List<Student2> student2s;
public Subject(){}
public Subject(Integer id, String name, Integer grade) {
this.id = id;
this.name = name;
this.grade = grade;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getGrade() {
return grade;
}
public void setGrade(Integer grade) {
this.grade = grade;
}
public List<Student2> getStudent2s() {
return student2s;
}
public void setStudent2s(List<Student2> student2s) {
this.student2s = student2s;
}
@Override
public String toString() {
return "Subject{" +
"id=" + id +
", name='" + name + '\'' +
", grade=" + grade +
'}';
}
}
- 实体类的Dao文件和映射文件
public interface Student2Dao {
Student2 queryStudent2ById(@Param("id") Integer id);
}
public interface SubjectDao {
Subject querySubjectById(@Param("id") Integer id);
}
在这里插入代码片<?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="cn.ozl.dao.Student2Dao"><!--定位哪个Dao的接口进行描述-->
<resultMap id="stu_sub" type="Student2">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="sex" property="sex"/>
<collection property="subjects" ofType="Subject">
<id column="sub_id" property="id"/>
<result column="sub_name" property="name"/>
<result column="grade" property="grade"/>
</collection>
</resultMap>
<select id="queryStudent2ById" resultMap="stu_sub">
select t_students.id,t_students.name,t_students.sex,t_subjects.id sub_id,t_subjects.name sub_name,t_subjects.grade
from t_students join t_stu_sub tss on t_students.id = tss.student_id
join t_subjects on tss.subject_id = t_subjects.id
where student_id=#{id}
</select>
</mapper>
```java
<?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="cn.ozl.dao.SubjectDao"><!--定位哪个Dao的接口进行描述-->
<resultMap id="sub_stu" type="Subject">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="grade" property="grade"/>
<collection property="student2s" ofType="Student2">
<id column="stu_id" property="id"/>
<result column="stu_name" property="name"/>
<result column="sex" property="sex"/>
</collection>
</resultMap>
<select id="querySubjectById" resultMap="sub_stu">
select t_subjects.id,t_subjects.name,t_subjects.grade,t_students.id stu_id,t_students.name stu_name,t_students.sex
from t_subjects join t_stu_sub tss on t_subjects.id = tss.subject_id
join t_students on t_students.id = tss.student_id
where subject_id=#{id}
</select>
</mapper>
- 注册映射文件
<mapper resource="cn/ozl/dao/SubjectDao-Mapper.xml"/>
<mapper resource="cn/ozl/dao/Student2Dao-Mapper.xml"/>
- 测试
SubjectDao mapper = MyBatisUtils.getMapper(SubjectDao.class);
Subject subject = mapper.querySubjectById(1001);
System.out.println(subject);
List<Student2> student2s = subject.getStudent2s();
for (Student2 student2 : student2s) {
System.out.println(student2);
}
Student2Dao mapper1 = MyBatisUtils.getMapper(Student2Dao.class);
Student2 student2 = mapper1.queryStudent2ById(1);
System.out.println(student2);
List<Subject> subjects = student2.getSubjects();
for (Subject subject1 : subjects) {
System.out.println(subject1);
}
- 结果
动态SQL
Mybatis支持映射文件中在基础Sql上添加一些逻辑操作,并动态拼接完成完整的sql之后在执行,以达到sql的复用,简化编程效果
1.sql标签
重复的sql语句可以用sql标签复用
// sql片段
<sql id="usersql">
// 复用sql代码
select id,username,password,gender,regist_time
from mybatis
</sql>
<!--定位dao方法 返回的类型 写入sql语句-->
<select id="queryUser" resultMap="rm">
<!--引用sql片段-->
<include refid="usersql"></include>
where id=#{arg0}<!--第一个参数的值-->
</select>
2.if标签
// sql片段
<sql id="usersql">
// 复用sql代码
select id,username,password,gender,regist_time
from mybatis
</sql>
<!--定位dao方法 返回的类型 写入sql语句-->
<select id="queryUser" resultMap="rm">
<!--引用sql片段-->
<include refid="usersql"></include>
where
<!--通过id或者username参数查询方法可以合并通过if标签-->
<if test="id!=null">
id=#{id}
</if>
<if test="username!=null">
username=#{username}
</if>
</select>
3.where标签
<select id="queryUser1" resultMap="rm">
<include refid="usersql"></include>
<!--where标签
1.补充where关键字
2.识别where子句中如果 以or,and开头,会将or,and去除
-->
<where>
<if test="username!=null">
username=#{username}
</if>
<if test="gender">
or gender=#{gender}
</if>
</where>
</select>
4.set标签
update mybatis
<!--set标签
1.补充set关键字
2.自动将set子句的最后逗号去除
-->
<set>
<if test="username!=null">
username=#{username}
</if>
<if test="password!=null">
paswword=#{password}
</if>
</set>
where id=#{id}
</update>
5.trim标签
trim可以替代set和where的作用
<!--prefix="where"补充where关键字
prefixOverrides="or|and"以or and开头会被覆盖
-->
<trim prefix="where" prefixOverrides="or|and">
<if test="username!=null">
username=#{username}
</if>
<if test="gender">
or gender=#{gender}
</if>
</trim>
<!--prefix="set"补充set关键字
suffixOverrides=","末尾以,结尾去除-->
<trim prefix="set" suffixOverrides=",">
<if test="username!=null">
username=#{username}
</if>
<if test="password!=null">
paswword=#{password}
</if>
</trim>
6.foreach标签
<delete id="deleteManyUser" parameterType="java.util.List">
<!--delete from mybatis where id in (x,x,x,x)-->
delete from mybatis where id in
<foreach collection="list" open="(" close=")" item="ids9" separator=",">
#{ids9}
</foreach>
</delete>
<insert id="insertManyUser" parameterType="java.util.List">
<!--insert into mybatis values (null,x,x),(null,x,x)-->
insert into mybatis values
<foreach collection="list" open="" close="" item="users9" separator=",">
(null,#{users9.username},#{users9.password})
</foreach>
</insert>
本文地址:https://blog.csdn.net/ozl520/article/details/108853254
上一篇: 澳大利亚:云计算采用首要障碍已非云安全
下一篇: Linux系统NBD驱动安装拓展篇