php入门到就业线上直播课:进入学习
# 提供了一个功能:用户可以在页面上根据username、sex、address进行搜索 # 用户输入的搜索条件:可以是一个条件,也可能是两个、三个 # 只输入一个条件:姓名是"王" select * from user where username like '%王%' # 只输入一个条件:性别是“男” select * from user where sex = '男' # 输入两个条件:姓名“王”,性别“男” select * from user where username like '%王%' and sex = '男' # 输入三个条件:姓名“王”,性别“男”,地址“北京” select * from user where username like '%王%' and sex = '男' and address like '%北京%';
在mybatis中,sql语句是写在映射配置的xml文件中的。mybatis提供了一些xml的标签,用来实现动态sql的拼接。
常用的标签有:
:用来进行判断,相当于java里的if判断
:通常和if配合,用来代替sql语句中的where 1=1
:用来遍历一个集合,把集合里的内容拼接到sql语句中。例如拼接:in (value1, value2, ...)
:用于定义sql片段,达到重复使用的目的
讲解
1. 准备mybatis环境
创建java项目,导入jar包;准备javabean
创建映射器接口userdao
创建映射配置文件userdao.xml
创建全局配置文件sqlmapconfig.xml
创建日志配置文件log4j.properties
2.
标签:
语法介绍
sql语句内容, 如果判断为true,这里的sql语句就会进行拼接
使用示例
根据用户的名称和性别搜索用户信息。把搜索条件放到user对象里,传递给sql语句
映射器接口userdao上加方法
package com.demo.dao;import com.demo.domain.user;import java.util.list;public interface userdao { /** * 根据username和sex搜索用户 * @param user 封装了搜索条件的user对象 * @return 搜索的结果 */ listsearch1(user user);}
映射文件userdao.xml里配置statement
功能测试,在测试类里加测试方法
package com.demo;import com.demo.dao.userdao;import com.demo.domain.user;import org.apache.ibatis.io.resources;import org.apache.ibatis.session.sqlsession;import org.apache.ibatis.session.sqlsessionfactory;import org.apache.ibatis.session.sqlsessionfactorybuilder;import org.junit.after;import org.junit.before;import org.junit.test;import java.io.ioexception;import java.io.inputstream;import java.util.list;public class sqltest { private userdao userdao; private sqlsession session; private inputstream is; /** * 要求:根据username和sex搜索用户 * 搜索条件放到user对象里 */ @test public void testsearch(){ user user = new user(); // user.setusername("王"); // user.setsex("男"); listuserlist = userdao.search1(user); userlist.foreach(system.out::println); } @before public void init() throws ioexception { //1. 读取全局配置文件 is = resources.getresourceasstream("sqlmapconfig.xml"); //2. 得到一个sqlsession对象 sqlsessionfactory factory = new sqlsessionfactorybuilder().build(is); session = factory.opensession(); userdao = session.getmapper(userdao.class); } @after public void destroy() throws ioexception { session.close(); is.close(); }}
3.
标签
语法介绍
在刚刚的练习的sql语句中,我们写了where 1=1
。如果不写的话,sql语句会出现语法错误。mybatis提供了一种代替where 1=1
的技术:
标签。
代码示例
把上一章节的实现代码进行优化,使用
标签代替where 1=1
映射器userdao的search1方法:已有,不用修改
/** * 根据username和sex搜索用户 * @param user 封装了搜索条件的user对象 * @return 搜索的结果 */listsearch1(user user);
在映射文件userdao.xml里修改sql语句
在测试类里进行功能测试:测试方法不需要修改
@testpublic void testsearch(){ user user = new user(); // user.setusername("王"); // user.setsex("男"); listuserlist = userdao.search1(user); userlist.foreach(system.out::println);}
4.
标签
语法介绍
foreach标签,通常用于循环遍历一个集合,把集合的内容拼接到sql语句中。例如,我们要根据多个id查询用户信息,sql语句:
select * from user where id = 1 or id = 2 or id = 3;select * from user where id in (1, 2, 3);
假如我们传参了id的集合,那么在映射文件中,如何遍历集合拼接sql语句呢?可以使用foreach
标签实现。
#{id}
使用示例
有搜索条件类queryvo如下:
package com.itheima.domain;public class queryvo { private integer[] ids; public integer[] getids() { return ids; } public void setids(integer[] ids) { this.ids = ids; }}
在映射器userdao里加方法
/** * queryvo里有一个integer[] ids * 要求:根据ids查询对应的用户列表 */listsearch2(queryvo vo);
在映射文件userdao.xml里配置statement
功能测试
@test public void testsearch2(){ queryvo vo = new queryvo(); vo.setids(new integer[]{41,42,43,44,45}); listuserlist = userdao.search2(vo); userlist.foreach(system.out::println); }
5.
标签
在映射文件中,我们发现有很多sql片段是重复的,比如:select * from user
。mybatis提供了一个
标签,把重复的sql片段抽取出来,可以重复使用。
语法介绍
在映射文件中定义sql片段:
sql语句片段
在映射文件中引用sql片段:
使用示例
在查询用户的sql中,需要重复编写:select * from user
。把这部分sql提取成sql片段以重复使用
- 要求:queryvo里有ids,user对象。根据条件进行搜索
修改queryvo,增加成员变量user
package com.itheima.domain;/** * @author liuyp * @date 2021/09/07 */public class queryvo { private integer[] ids; private user user; //get/set方法……}
在映射器userdao里加方法
/** * 动态sql拼接的综合应用:if、where、foreach * 要求:queryvo里有ids、username、sex值,根据这些值进行搜索 */ listsearch3(queryvo vo);
在映射文件userdao.xml里配置statement
select * from user and username like "%"#{user.username}"%" and sex = #{user.sex}
在测试类里加测试方法
@test public void testsearch3(){ queryvo vo = new queryvo(); vo.setids(new integer[]{41,42,43,44,45}); // user user = new user(); // user.setusername("王"); // user.setsex("男"); // vo.setuser(user); listuserlist = userdao.search3(vo); userlist.foreach(system.out::println); }