Mybatis笔记

本文详细介绍了MyBatis的配置步骤,包括Maven依赖、核心配置文件mybatis-config.xml的编写,以及Mapper接口和实体类的创建。内容涵盖了数据库连接配置、类型别名、环境配置、映射文件的命名规则和内容。此外,还讲解了基础的增删改查操作,参数获取方式,以及不同返回值的查询。最后,提到了特殊SQL执行,如模糊查询、批量删除和动态设置表名。
摘要由CSDN通过智能技术生成

Part 1. Mybatis配置

1.1 Maven配置

pom.xml中引入依赖

<dependencies>
		<!-- Mybatis核心 -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.5.7</version>
		</dependency>
		<!-- junit测试 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
		<!-- MySQL驱动 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.3</version>
		</dependency>
</dependencies>

1.2 Mybatis 核心配置文件

  1. 习惯命名为mybatis-config.xml,将来整合Spring之后,这个配置文件可以省略
  2. 核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息
  3. 核心配置文件存放的位置是src/main/resources目录下
  4. 核心配置文件中的标签必须按照固定的顺序(有的标签可以不写,但顺序一定不能乱):
    properties、settings、typeAliases、typeHandlers、objectFactory、objectWrapperFactory、reflectorFactory、plugins、environments、databaseIdProvider、mappers
<?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文件,此时就可以${属性名}的方式访问属性值-->
    <properties resource="jdbc.properties"></properties>
    <settings>
        <!--将表中字段的下划线自动转换为驼峰-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--开启延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>
    <typeAliases>
        <!--
        typeAlias:设置某个具体的类型的别名
        属性:type:需要设置别名的类型的全类名
              alias:设置此类型的别名,且别名不区分大小写,若不设置此属性,该类型拥有默认的别名,即类名
              -->
              
        <!--<typeAlias type="com.atguigu.mybatis.bean.User"></typeAlias>   法1.该方法默认别名为类名不区分大小写-->
        <!--<typeAlias type="com.atguigu.mybatis.bean.User" alias="user"    法2.指定别名>
        </typeAlias>-->
        <!--以包为单位,设置改包下所有的类型都拥有默认的别名,即类名且不区分大小写-->
        <package name="com.atguigu.mybatis.bean"/>
    </typeAliases>
    <!--
    environments:设置多个连接数据库的环境
    属性:
	    default:设置默认使用的环境的id
    -->
    <environments default="mysql_test">
        <!--
        environment:设置具体的连接数据库的环境信息
        属性:
	        id:设置环境的唯一标识,可通过environments标签中的default设置某一个环境的id,表示默认使用的环境
        -->
        <environment id="mysql_test">
            <!--
            transactionManager:设置事务管理方式
            属性:
	            type:设置事务管理方式,type="JDBC|MANAGED"
	            type="JDBC":设置当前环境的事务管理都必须手动处理
	            type="MANAGED":设置事务被管理,例如spring中的AOP
            -->
            <transactionManager type="JDBC"/>
            <!--
            dataSource:设置数据源
            属性:
	            type:设置数据源的类型,type="POOLED|UNPOOLED|JNDI"
	            type="POOLED":使用数据库连接池,即会将创建的连接进行缓存,下次使用可以从缓存中直接获取,不需要重新创建
	            type="UNPOOLED":不使用数据库连接池,即每次使用连接都需要重新创建
	            type="JNDI":调用上下文中的数据源
            -->
            <dataSource type="POOLED">
                <!--设置驱动类的全类名-->
                <property name="driver" value="${jdbc.driver}"/>
                <!--设置连接数据库的连接地址-->
                <property name="url" value="${jdbc.url}"/>
                <!--设置连接数据库的用户名-->
                <property name="username" value="${jdbc.username}"/>
                <!--设置连接数据库的密码-->
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--引入映射文件-->
    <mappers>
        <!-- <mapper resource="UserMapper.xml"/> -->
        <!--
        以包为单位,将包下所有的映射文件引入核心配置文件
        注意:
			1. 此方式必须保证mapper接口和mapper映射文件必须在相同的包下
			2. mapper接口要和mapper映射文件的名字一致   创建包时用/
        -->
        <package name="com.atguigu.mybatis.mapper"/>
    </mappers>
</configuration>

1.3 Mapper接口与实体类对象的创建

  • MyBatis中的mapper接口相当于以前的dao,但是区别在于,mapper仅仅是接口,我们不需要提供实现类
  • 实体类对象一般与数据库表对应

相关概念:ORM(Object Relationship Mapping)对象关系映射。
- 对象:Java的实体类对象
- 关系:关系型数据库
- 映射:二者之间的对应关系

Java概念数据库概念
属性字段/列
对象记录/行

1.4 创建MyBatis的映射文件

  • 映射文件的命名规则

    • 表所对应的实体类的类名+Mapper.xml( 例如:表t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml
    • 因此一个映射文件对应一个实体类,对应一张表的操作
    • MyBatis映射文件用于编写SQL访问以及操作表中的数据
    • MyBatis映射文件存放的位置是src/main/resources/mappers目录下(有时需要与mapper接口的路径对应)
  • MyBatis中可以面向接口操作数据,要保证两个一致

    • mapper接口的全类名和映射文件的命名空间(namespace)保持一致(namespqce)
    • mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致(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="com.atguigu.mybatis.mapper.UserMapper">  
	<!--int insertUser();-->  
	<insert id="insertUser">  
		insert into t_user values(null,'张三','123',23,'女')  
	</insert>  
</mapper>

1.5 创建Java与数据库的对话

  • SqlSession:Java程序和数据库之间的会话
  • SqlSessionFactory:是“生产”SqlSession的“工厂
  • 工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的相关代码封装到一个“工厂类”中,以后都使用这个工厂类来“生产”我们需要的对象
 public class SqlSessionUtils {

    public static SqlSession getSqlSession() {
        SqlSession sqlSession=null;
        try {
        	//读取MyBatis的核心配置文件
            InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
            //获取SqlSessionFactoryBuilder对象
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            //通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
            //获取sqlSession,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务
            sqlSession = sqlSessionFactory.openSession(true);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sqlSession;

    }
}
  • 需要手动提交事务,sqlSession.commit()
  • 如果要自动提交事务,则在获取sqlSession对象时,使用SqlSession sqlSession = sqlSessionFactory.openSession(true);,传入一个Boolean类型的参数,值为true,这样就可以自动提交

在需要的地方调用该静态方法

//调用方法获取会话
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
//调用getMapper()方法  通过代理模式创建xxxMapper接口的代理实现类对象
xxxMapper mapper = sqlSession.getMapper(xxxMapper.class);
mapper.方法();

1.6 IDEA创建Mybatis项目

Step1:新建Maven项目

在这里插入图片描述

Step2:添加依赖

向pom.xml文件添加依赖,见1.1

Step3: 配置Mybatis 核心文件
Step4:添加数据库

在这里插入图片描述
添加架构名称
在这里插入图片描述

Step5:使用SpringX生成对应(实体类,Mapper接口,Mapper.xml文件)

文件目录如下
在这里插入图片描述

Part 2. Mybatis的基础操作

2.1 基础增删改查(不带参数)

注意:只有select中需要填加resultType or resultMap

  1. 添加
	<!--int insertUser();-->
	<insert id="insertUser">
		insert into t_user values(null,'admin','123456',23,'男','12345@qq.com')
	</insert>
  1. 删除
	<!--int deleteUser();-->
    <delete id="deleteUser">
        delete from t_user where id = 6
    </delete>
  1. 修改
	<!--int updateUser();-->
    <update id="updateUser">
        update t_user set username = '张三' where id = 5
    </update>
  1. 查询 (返回一个实体类对象)
 <!--User getUserById();-->  
	<select id="getUserById" resultType="com.atguigu.mybatis.bean.User">  
		select * from t_user where id = 2  
	</select>
  1. 查询集合(返回集合:放集合的泛型的类型
	<!--List<User> getUserList();-->
	<select id="getUserList" resultType="com.atguigu.mybatis.bean.User">
		select * from t_user
	</select>
  1. 查实体类(实体类与数据库表的字段不一样,type写实体类的类名)
   <resultMap id="BaseMap" type="User">
   	<id properties="实体属性名" column="数据库字段名,此处为主键" jdbcType="数据库字段类型"/>
   	<result properties="实体属性名" column="数据库字段名,此处非主键" jdbcType="数据库字段类型"/>
   </resultMap>
   <!--User getUserById();-->  
   <select id="getUserById" resultMap="BaseMap">  
   	select * from t_user where id = 2  
   </select>
  • 注意:
    1. 查询的标签select必须设置属性resultType或resultMap,定义返回的类型,用于设置实体类和数据库表的映射关系
    - resultType:自动映射,用于属性名和表中字段名一致的情况
    - resultMap:自定义映射,用于一对多多对一字段名和属性名不一致的情况
    2. 当查询的数据为多条时,不能使用实体类作为返回值,只能使用集合,否则会抛出异常TooManyResultsException;但是若查询的数据只有一条,可以使用实体类或集合作为返回值

2.2 MyBatis获取参数值的两种方式(带参查询)

  • ${}的本质就是字符串拼接#{}的本质就是占位符赋值
  • ${}需要手动加单引号#{}会自动为字符串类型或日期类型添加单引号
  • 非特殊情况:推荐使用#{}

2.3 MyBatis带参增删改查

分为:

  1. 单个参数:可以使用${}和#{}以任意的名称(最好见名识意)获取参数的值
  2. 多个参数(此时MyBatis会自动将这些参数放在一个map集合):以**arg0,arg1…为键,以参数为值;以param1,param2…**为键,以参数为值;
  3. map集合类型为参数:将这些数据放在map中只需要通过${}和#{}访问map集合的键就可以获取相对应的值
  4. 实体类对象为参数:时此时可以使用${}和#{},通过访问实体类对象的属性名获取属性值

需要掌握的
@Param标识参数:此时,会将这些参数放在map集合中
1. 以@Param注解的value属性值为键,以参数为值;
2. 以param1,param2…为键,以参数为值;
只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号

<!--User CheckLoginByParam(@Param("username") String username, @Param("password") String password);-->
    <select id="CheckLoginByParam" resultType="User">
        select * from t_user where username = #{username} and password = #{password}
    </select>

总结

参数获取不是根据名字获取,也不是根据位置,而是以Map形式传输,传输过去通过Param或者args获取值,当指定了Map可通过Map键取值

  • 建议分成两种情况进行处理

    1. 实体类类型的参数,实体类也可以使用@Param 但是在${}和#{}中以对象.属性
    2. 使用@Param标识参数
  • 当为实体类时,以实体类get/set方法后面的名字获取参数

  • 当为其他值时,以键值对获取,这时用@Param(“name”)指定键

2.4 不同返回值的查询

  1. 如果查询出的数据只有一条
    1. 实体类对象接收
    2. List集合接收
    3. Map集合接收,结果{password=123456, sex=男, id=1, age=23, username=admin}
  2. 如果查询出的数据有多条
    1. 实体类类型的LIst集合接收
    2. Map类型的LIst集合接收
    3. 在mapper接口的方法上添加@MapKey注解
      一定不能用实体类对象接收,会抛异常TooManyResultsException

2.5 特殊SQL执行

模糊查询、批量删除、动态设置表名 最好使用${}

<!--List<User> getUserByLike(@Param("username") String username);-->
<select id="getUserByLike" resultType="User">
	<!--select * from t_user where username like "%"#{mohu}"%"-->  
	<!--select * from t_user where username like concat('%',#{mohu},'%')-->  
	select * from t_user where username like '%${mohu}%'
</select>

<!--int deleteMore(@Param("ids") String ids);-->
<delete id="deleteMore">
	delete from t_user where id in (${ids})
</delete>

<!--List<User> getUserByTable(@Param("tableName") String tableName);-->
<select id="getUserByTable" resultType="User">
	select * from ${tableName}
</select>

添加功能获取自增的主键:

  • 在mapper.xml中设置两个属性
  • useGeneratedKeys:设置使用自增的主键
  • keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参数user对象的某个属性中
<!--void insertUser(User user);-->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
	insert into t_user values (null,#{username},#{password},#{age},#{sex},#{email})
</insert>

2.6 自定义映射resultMap

  • resultMap:设置自定义映射
    属性:

     **id**:表示**自定义映射的唯一标识**,不能重复
     **type**:查询的数据**要映射的实体类**的类型  
    
    • 子标签:
      • id:设置主键的映射关系
      • result:设置普通字段的映射关系
      • 子标签属性:
        • property:设置映射关系中实体类中的属性名
        • column:设置映射关系中表中的字段名
  • 若字段名和实体类中的属性名不一致,则可以通过resultMap设置自定义映射,即使字段名和属性名一致的属性也要映射,也就是全部属性都要列出来

<resultMap id="empResultMap" type="Emp">
	<id property="eid" column="eid"></id>
	<result property="empName" column="emp_name"></result>
	<result property="age" column="age"></result>
	<result property="sex" column="sex"></result>
	<result property="email" column="email"></result>
</resultMap>
<!--List<Emp> getAllEmp();-->
<select id="getAllEmp" resultMap="empResultMap">
	select * from t_emp
</select>

Part 3 多表操作

3.1 多对一映射处理

查询员工信息以及员工所对应的部门信息(多对一,引入一所对应的对象
public class Emp {  
	private Integer eid;  
	private String empName;  
	private Integer age;  
	private String sex;  
	private String email;  
	private Dept dept;  
	//...构造器、get、set方法等
}
法一:级联方式处理映射关系一
<resultMap id="empAndDeptResultMapOne" type="Emp">
	<id property="eid" column="eid"></id>
	<result property="empName" column="emp_name"></result>
	<result property="age" column="age"></result>
	<result property="sex" column="sex"></result>
	<result property="email" column="email"></result>
	<result property="dept.did" column="did"></result>
	<result property="dept.deptName" column="dept_name"></result>
</resultMap>
<!--Emp getEmpAndDept(@Param("eid")Integer eid);-->
<select id="getEmpAndDept" resultMap="empAndDeptResultMapOne">
	select * from t_emp left join t_dept on t_emp.eid = t_dept.did where t_emp.eid = #{eid}
</select>
法二:级联方式处理映射关系二——使用association处理映射关系
  • association:处理多对一的映射关系
    • property:需要处理多对的映射关系的属性名
    • javaType:该属性的类型
<resultMap id="empAndDeptResultMapTwo" type="Emp">
	<id property="eid" column="eid"></id>
	<result property="empName" column="emp_name"></result>
	<result property="age" column="age"></result>
	<result property="sex" column="sex"></result>
	<result property="email" column="email"></result>
	<association property="dept" javaType="Dept">
		<id property="did" column="did"></id>
		<result property="deptName" column="dept_name"></result>
	</association>
</resultMap>
<!--Emp getEmpAndDept(@Param("eid")Integer eid);-->
<select id="getEmpAndDept" resultMap="empAndDeptResultMapTwo">
	select * from t_emp left join t_dept on t_emp.eid = t_dept.did where t_emp.eid = #{eid}
</select>
法三:分步查询(掌握)

Part 1. 查询员工信息

  • select:设置分布查询的sql的唯一标识(namespace.SQLId或mapper接口的全类名.方法名)
  • column:设置分步查询的条件
<!--EmpMapper.xml中-->
<resultMap id="empAndDeptByStepResultMap" type="Emp">
	<id property="eid" column="eid"></id>
	<result property="empName" column="emp_name"></result>
	<result property="age" column="age"></result>
	<result property="sex" column="sex"></result>
	<result property="email" column="email"></result>
	<association property="dept"
				 select="com.atguigu.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
				 column="did"></association>
</resultMap>
<!--Emp getEmpAndDeptByStepOne(@Param("eid") Integer eid);-->
<select id="getEmpAndDeptByStepOne" resultMap="empAndDeptByStepResultMap">
	select * from t_emp where eid = #{eid}
</select>

Part 2. 查询部门信息

<!--DeptMapper里的方法-->
<!--此处的resultMap仅是处理字段和属性的映射关系-->
<resultMap id="EmpAndDeptByStepTwoResultMap" type="Dept">
	<id property="did" column="did"></id>
	<result property="deptName" column="dept_name"></result>
</resultMap>
<!--Dept getEmpAndDeptByStepTwo(@Param("did") Integer did);-->
<select id="getEmpAndDeptByStepTwo" resultMap="EmpAndDeptByStepTwoResultMap">
	select * from t_dept where did = #{did}
</select>

3.2 一对多映射处理

查询部门信息以及部门员工信息(一对多,引入多所对应的对象链表
public class Dept {
    private Integer did;
    private String deptName;
    private List<Emp> emps;
	//...构造器、get、set方法等
}
法一:级联方式处理映射关系—— collection
  • collection:用来处理一对多的映射关系

    • property:需要处理多对的映射关系的属性名
    • ofType:表示该属性对饮的集合中存储的数据的类型
<resultMap id="DeptAndEmpResultMap" type="Dept">
	<id property="did" column="did"></id>
	<result property="deptName" column="dept_name"></result>
	<collection property="emps" ofType="Emp">
		<id property="eid" column="eid"></id>
		<result property="empName" column="emp_name"></result>
		<result property="age" column="age"></result>
		<result property="sex" column="sex"></result>
		<result property="email" column="email"></result>
	</collection>
</resultMap>
<!--Dept getDeptAndEmp(@Param("did") Integer did);-->
<select id="getDeptAndEmp" resultMap="DeptAndEmpResultMap">
	select * from t_dept left join t_emp on t_dept.did = t_emp.did where t_dept.did = #{did}
</select>
法二:分步查询(掌握)

Part 1. 查询部门信息

<!--分步查询第一步:查询部门信息-->
<resultMap id="DeptAndEmpByStepOneResultMap" type="Dept">
	<id property="did" column="did"></id>
	<result property="deptName" column="dept_name"></result>
	<collection property="emps"
				select="com.atguigu.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwo"
				column="did"></collection>
</resultMap>
<!--Dept getDeptAndEmpByStepOne(@Param("did") Integer did);-->
<select id="getDeptAndEmpByStepOne" resultMap="DeptAndEmpByStepOneResultMap">
	select * from t_dept where did = #{did}
</select>

Part 2. 查询部门信息 根据部门id查询部门中的所有员工

<!--List<Emp> getDeptAndEmpByStepTwo(@Param("did") Integer did);-->
<select id="getDeptAndEmpByStepTwo" resultType="Emp">
	select * from t_emp where did = #{did}
</select>

3.3 延迟加载(只执行对应的SQL)

  • 分步查询的优点:可以实现延迟加载,但是必须在核心配置文件中设置全局配置信息
    • lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载
    • aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。 否则,每个属性会按需加载
  • 此时就可以实现按需加载,获取的数据是什么,就只会执行相应的sql。此时可通过association和collection中的fetchType属性设置当前的分步查询是否使用延迟加载,fetchType=“lazy(延迟加载)|eager(立即加载)”
<settings>
	<!--开启延迟加载-->
	<setting name="lazyLoadingEnabled" value="true"/>
</settings>
  • fetchType:当开启了全局的延迟加载之后,可以通过该属性手动控制延迟加载的效果fetchType=“lazy(延迟加载)|eager(立即加载)”
<resultMap id="empAndDeptByStepResultMap" type="Emp">
		<id property="eid" column="eid"></id>
		<result property="empName" column="emp_name"></result>
		<result property="age" column="age"></result>
		<result property="sex" column="sex"></result>
		<result property="email" column="email"></result>
		<association property="dept"
					 select="com.atguigu.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
					 column="did"
					 fetchType="lazy"></association>
	</resultMap>

Part 4.动态SQL

  • Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题

4.1 if(多个拼接)

  • if标签通过test属性(即传递过来的数据)的表达式进行判断
  • where后面添加一个恒成立条件1=1
    • 这个恒成立条件并不会影响查询的结果
    • 这个1=1可以用来拼接and语句,例如:当empName为null时
      • 如果不加上恒成立条件,则SQL语句为select * from t_emp where and age = ? and sex = ? and email = ?,此时where会与and连用,SQL语句会报错
      • 如果加上一个恒成立条件,则SQL语句为select * from t_emp where 1= 1 and age = ? and sex = ? and email = ?,此时不报错
<!--List<Emp> getEmpByCondition(Emp emp);-->
<select id="getEmpByCondition" resultType="Emp">
	select * from t_emp where 1=1
	<if test="empName != null and empName !=''">
		and emp_name = #{empName}
	</if>
	<if test="age != null and age !=''">
		and age = #{age}
	</if>
	<if test="sex != null and sex !=''">
		and sex = #{sex}
	</if>
	<if test="email != null and email !=''">
		and email = #{email}
	</if>
</select>

4.2 where

  • where和if一般结合使用
    • 若where标签中的if条件都不满足,则where标签没有任何功能,即不会添加where关键字 (不满足时去where)
    • 若where标签中的if条件满足,会自动添加where关键字,并去掉最前方多余的and/or
    • 注意:where标签不能去掉条件后多余的and/or
<!--List<Emp> getEmpByCondition(Emp emp);-->
<select id="getEmpByCondition" resultType="Emp">
	select * from t_emp
	<where>
		<if test="empName != null and empName !=''">
			emp_name = #{empName}
		</if>
		<if test="age != null and age !=''">
			and age = #{age}
		</if>
		<if test="sex != null and sex !=''">
			and sex = #{sex}
		</if>
		<if test="email != null and email !=''">
			and email = #{email}
		</if>
	</where>
</select>

4.3 choose、when、otherwise(取单个)

  • choose、when、otherwise相当于if...else if..else
  • when至少要有一个,otherwise至多只有一个
<select id="getEmpByChoose" resultType="Emp">
	select * from t_emp
	<where>
		<choose>
			<when test="empName != null and empName != ''">
				emp_name = #{empName}
			</when>
			<when test="age != null and age != ''">
				age = #{age}
			</when>
			<when test="sex != null and sex != ''">
				sex = #{sex}
			</when>
			<when test="email != null and email != ''">
				email = #{email}
			</when>
			<otherwise>
				did = 1
			</otherwise>
		</choose>
	</where>
</select>

注意:前三个标签内都是test判断

4.4 trim

  • trim用于去掉或添加标签中的内容
  • 常用属性
    • prefix:在trim标签中的内容的前面添加某些内容
    • suffix:在trim标签中的内容的后面添加某些内容
    • prefixOverrides:在trim标签中的内容的前面去掉某些内容
    • suffixOverrides:在trim标签中的内容的后面去掉某些内容
  • 若trim中的标签都不满足条件,则trim标签没有任何效果,也就是只剩下select * from t_emp
<!--List<Emp> getEmpByCondition(Emp emp);-->
<select id="getEmpByCondition" resultType="Emp">
	select * from t_emp
	<trim prefix="where" suffixOverrides="and|or">
		<if test="empName != null and empName !=''">
			emp_name = #{empName} and
		</if>
		<if test="age != null and age !=''">
			age = #{age} and
		</if>
		<if test="sex != null and sex !=''">
			sex = #{sex} or
		</if>
		<if test="email != null and email !=''">
			email = #{email}
		</if>
	</trim>
</select>

4.5 foreach (用于循环)

  • 属性:
    • collection:设置要循环的数组或集合
    • item:表示集合或数组中的每一个数据
    • separator:设置循环体之间的分隔符,分隔符前后默认有一个空格,如,
    • open:设置foreach标签中的内容的开始符
    • close:设置foreach标签中的内容的结束符
  • 批量删除
    <!--int deleteMoreByArray(Integer[] eids);-->
    <delete id="deleteMoreByArray">
    	delete from t_emp where eid in
    	<foreach collection="eids" item="eid" separator="," open="(" close=")">
    		#{eid}
    	</foreach>
    </delete>
    
  • 批量插入
    <!--int insertMoreByList(@Param("emps") List<Emp> emps);-->
    <insert id="insertMoreByList">
    	insert into t_emp values
    	<foreach collection="emps" item="emp" separator=",">
    		(null,#{emp.empName},#{emp.age},#{emp.sex},#{emp.email},null)
    	</foreach>
    </insert>
    

4.6 SQL片段

  • sql片段,可以记录一段公共sql片段,在使用的地方通过include标签进行引入
  • 声明sql片段:<sql>标签
<sql id="empColumns">eid,emp_name,age,sex,email</sql>
  • 引用sql片段:<include>标签
<!--List<Emp> getEmpByCondition(Emp emp);-->
<select id="getEmpByCondition" resultType="Emp">
	select <include refid="empColumns"></include> from t_emp
</select>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值