使用Mybatis如何实现多个控制条件查询
目录
- 实现多个控制条件查询
- 扩展知识
- 实现多个条件简单查询
- 数据库的字段名和实体类的属性名不一致时
- 实现多个条件复杂查询
- MyBatis条件查询总结
- 1.if条件语句
- 2.choose(whenotherwise)
- 4.in的用法
- 5.模糊查询
实现多个控制条件查询
扩展知识
1.给包起别名用<typeAliases>标签
< typeAliases> < typeAlias type=“MybatiesAnimal.Animal” alias=“animal”/> < !-- 指定实体类在哪个包里 --> < package name=“MybatiesAnimal”/> < /typeAliases>
2.在<mappers>中通过<package>标签引Mapper.xml
如果想用package直接引入所有mapper/xml, 那么要求接口和xml在一个包里
实现多个条件简单查询
操作步骤如下:
1.在Mapper.xml中输入要查询的SQL语句
2.接口文件中参数用@Param接
语句如下:
public List selAnimalBy(@Param(“NAME”) String a,@Param(“kind”) String b);
如果传的是2个java简单类型 那么需要用@Param(“name”) 指定参数名
3.text文档中输出
语句如下:
List< Animal> animal1=sqlsession.getMapper(AnimalMapper.class).selAnimalBy(“老虎”, “猫科”); System.out.println(animal1);
数据库的字段名和实体类的属性名不一致时
因为数据库命名多个单词之间用下划线连接,而Java命名规则为第二个字母大写,命名规则不同时,需要传值。
方法一:修改SQL语句
SELECT a_sid sid,kind,numbers,address,NAME FROM animal
给a_sid 取别名为sid
xml中语句修改如下:
方法二:通过配置resultMap标签
原查询语句:
< select id=“selAnimalBy” resultType=“animal” > SELECT * FROM animal WHERE NAME=#{NAME} AND kind=#{kind} < /select>
修改为:
实现多个条件复杂查询
例如:查询动物列表中猫科中包含虎字段的数据
SQL语句为:
SELECT * FROM animal WHERE 1=1 AND kind=“猫科” AND NAME LIKE ‘%虎%'
1.配置xml中的select标签
如下图:
2.添加接口中的执行语句
public List< Animal> selCon(Animal animal);
3.text文档检验结果
Animal animal1=new Animal(); animal1.setKind(“猫科”); animal1.setName(“虎”); List< Animal>animal2=sqlsession.getMapper(AnimalMapper.class).selCon(animal1); System.out.println(animal2);
输出结果如下:
MyBatis条件查询总结
1.if条件语句
<!-- if(判断参数) - 将实体类不为空的属性作为where条件 --> <select id="getStudentList_if" resultMap="resultMap_studentEntity" parameterType="liming.student.manager.data.model.StudentEntity"> SELECT ST.STUDENT_ID, ST.STUDENT_NAME, ST.STUDENT_SEX, ST.STUDENT_BIRTHDAY, ST.STUDENT_PHOTO, ST.CLASS_ID, ST.PLACE_ID FROM STUDENT_TBL ST WHERE <if test="studentName !=null "> ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName, jdbcType=VARCHAR}),'%') </if> <if test="studentSex != null and studentSex != '' "> AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER} </if> <if test="studentBirthday != null "> AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE} </if> <if test="classId != null and classId!= '' "> AND ST.CLASS_ID = #{classId, jdbcType=VARCHAR} </if> <if test="classEntity != null and classEntity.classId !=null and classEntity.classId !=' ' "> AND ST.CLASS_ID = #{classEntity.classId, jdbcType=VARCHAR} </if> <if test="placeId != null and placeId != '' "> AND ST.PLACE_ID = #{placeId, jdbcType=VARCHAR} </if> <if test="placeEntity != null and placeEntity.placeId != null and placeEntity.placeId != '' "> AND ST.PLACE_ID = #{placeEntity.placeId, jdbcType=VARCHAR} </if> <if test="studentId != null and studentId != '' "> AND ST.STUDENT_ID = #{studentId, jdbcType=VARCHAR} </if> </select>
2.choose (when otherwise)
<!-- choose(判断参数) - 按顺序将实体类 User 第一个不为空的属性作为:where条件 --> <select id="getUserList_choose" resultMap="resultMap_user" parameterType="com.yiibai.pojo.User"> SELECT * FROM User u <where> <choose> <when test="username !=null "> u.username LIKE CONCAT(CONCAT('%', #{username, jdbcType=VARCHAR}),'%') </when > <when test="sex != null and sex != '' "> AND u.sex = #{sex, jdbcType=INTEGER} </when > <when test="birthday != null "> AND u.birthday = #{birthday, jdbcType=DATE} </when > <otherwise> </otherwise> </choose> </where> </select>
<select id="dynamicChooseTest" parameterType="Blog" resultType="Blog"> select * from t_blog where 1 = 1 <choose> <when test="title != null"> and title = #{title} </when> <when test="content != null"> and content = #{content} </when> <otherwise> and owner = "owner1" </otherwise> </choose> </select>
4.in的用法
<select id="getNewListByLabelID" resultMap="BaseResultMap" parameterType="arraylist"> SELECT <include refid="Base_Column_List"/> FROM tb_problem WHERE id IN <foreach collection="ids" index="index" item="id" separator="," close=")" open="("> #{id} </foreach> </select>
还可以这样
<select id="queryAllOpenProduct" parameterType="com.tims.open.domain.OpenProductQueryCondition" resultType="com.tims.open.domain.OpenProduct"> SELECT * FROM product_db.product p WHERE p.isvalid = 1 <if test="list != null"> <foreach collection="list" index="index" item="item" separator="," open="AND p.id IN (" close=")"> #{item} </foreach> </if> </select> //查询condition类 Public OpenProductQueryCondition{ private Integer productId; private List<Integer> list; }
5.模糊查询
<!-- ******************** 模糊查询的常用的3种方式:********************* --> <select id="getUsersByFuzzyQuery" parameterType="User" resultType="User"> select <include refid="columns"/> from users <where> <!-- 方法一: 直接使用 % 拼接字符串 注意:此处不能写成 "%#{name}%" ,#{name}就成了字符串的一部分, 会发生这样一个异常: The error occurred while setting parameters, 应该写成: "%"#{name}"%",即#{name}是一个整体,前后加上% --> <if test="name != null"> name like "%"#{name}"%" </if> <!--方法二: 使用concat(str1,str2)函数将两个参数连接 --> <if test="phone != null"> and phone like concat(concat("%",#{phone}),"%") </if> <!--方法三: 使用 bind 标签,对字符串进行绑定,然后对绑定后的字符串使用 like 关键字进行模糊查询 --> <if test="email != null"> <bind name="pattern" value="'%'+email+'%'"/> and email like #{pattern} </if> </where> </select>
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
赞 (0)