黑马程序员JavaWeb开发教程
文章目录
借用之前的根据条件查询用户 五 5.演示根据条件查询
一、Mybatis-XML映射文件
1、XML映射文件
(1)规范
XML应和文件的形成与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下
- 在src.main.resources包右键 new Driectory,创建目录com.itheima.mapper,
注意:使用/的方式进行创建,不能使用.的方式进行创建
- 在新创建的目录上右键 new File,创建EmpMapper.xml(其中EmpMapper和mapper包下的接口同名)
- 在src.main.resources包右键 new Driectory,创建目录com.itheima.mapper,
XML映射文件的namespace属性为Mapper接口全限定名一致
- 在EmpMapper.xml中填写以下配置,其中namespace中填写的是EmpMapper接口的全限定名,按照下图即可copy到
- 在EmpMapper.xml中填写以下配置,其中namespace中填写的是EmpMapper接口的全限定名,按照下图即可copy到
<?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.itheima.mapper.EmpMapper">
</mapper>
- XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致
EmpMapper接口中的代码
public List<Emp> list(@Param("name") String name, @Param("gender") Short gender, @Param("begin") LocalDate begin, @Param("end") LocalDate end);
EmpMapper.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="com.itheima.mapper.EmpMapper">
<!-- resultType:单挑记录所封装的类型-->
<select id="list" resultType="com.itheima.pojo.Emp">
select * from emp where name like concat('%',#{name},'%') and gender=#{gender} and
entrydate between #{begin} and #{end} order by update_time desc
</select>
</mapper>
(2)MybatisX
- MybatisX是一款基于IDEA的快速开发Mybatis的插件,安装步骤如下,并且安装完成之后,会看到xml文件中有相应的图标。
- 使用Mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句
二、Mybatis-动态SQL-if
1、动态SQL
- 随着用户的输入或为外部条件的变化而变化的SQL语句,我们称为动态SQL
2、 标签<if><where>
<if>
:用于判断条件是否成立,使用test属性进行条件判断,如果条件为true,则拼接SQL<where>
:where元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句开头的and或者 or<set>
:动态的在行首插入SET关键字,并会删除掉额外的逗号(用在update语句中)
3、示例
- 将之前的select语句使用以上连个标签改写一下
<select id="list" resultType="com.itheima.pojo.Emp">
select * from emp
<where>
<if test="name!=null">
name like concat('%',#{name},'%')
</if>
<if test="gender !=null">
and gender=#{gender}
</if>
<if test="begin!=null and end!=null">
and entrydate between #{begin} and #{end}
</if>
</where>
order by update_time desc
</select>
三、Mybatis-动态SQL-foreach
根据 id 批量删除员工
1、SQL语句
delete from emp where id in(18,19,20);
2、接口方法
//根据id批量删除员工
public void deleteByIds(@Param("ids") List<Integer> ids);
3、EmpMapper.xml 映射文件
- foreach标签中的几个常用属性:
- collection:遍历的集合(和方法中传递的参数名一致即可)
- item:遍历出来的元素
- separator:分隔符
- open:遍历开始前拼接的SQL片段
- close:遍历节后后拼接的SQL片段
<!-- 根据ID量删除员工-->
<!-- collection:遍历的集合(和方法中传递的参数名一致即可)
item:遍历出来的元素
separator:分隔符
open:遍历开始前拼接的SQL片段
close:遍历节后后拼接的SQL片段
-->
<delete id="deleteByIds">
delete from emp where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
4、 测试
@Test
public void testDeleteByIds(){
List<Integer> ids= Arrays.asList(18,19);
empMapper.deleteByIds(ids);
}
四、Mybatis-动态SQL-sql&include
- 优势忽悠一些经常使用的SQL 代码片段,这是我们可以将这写代码片段进行抽取,使用
<sql>
标签,然后在相应的地方使用<include>
标签进行引用 <sql>
:定义可重用的SQL片段<include>
:通过属性refid,指定包含的sql片段
<sql id="commonSql">
select id,
username,
password,
name,
gender,
image,
job,
entrydate,
dept_id,
create_time,
update_time
from emp
</sql>
<!-- resultType:单条记录所封装的类型-->
<select id="list" resultType="com.itheima.pojo.Emp">
<include refid="commonSql"></include>
<where>
<if test="name!=null">
name like concat('%',#{name},'%')
</if>
<if test="gender !=null">
and gender=#{gender}
</if>
<if test="begin!=null and end!=null">
and entrydate between #{begin} and #{end}
</if>
</where>
order by update_time desc
</select>