欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

一起学习框架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工具类

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();
  • 写一个工具类封装

一起学习框架SSM之MyBatis(二)

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;

一起学习框架SSM之MyBatis(二)

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());

    }
}

一起学习框架SSM之MyBatis(二)

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);

一起学习框架SSM之MyBatis(二)

  • 雇员实体类
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);
        }


    }

结果
一起学习框架SSM之MyBatis(二)

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());

    }

结果
一起学习框架SSM之MyBatis(二)

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);

一起学习框架SSM之MyBatis(二)

  • 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);
        }
  • 结果
    一起学习框架SSM之MyBatis(二)

动态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