
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 搜索的结果
*/
list search1(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("男");
list userlist = 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("男");
list userlist = 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查询对应的用户列表
*/list search2(queryvo vo); 在映射文件userdao.xml里配置statement
功能测试
@test
public void testsearch2(){
queryvo vo = new queryvo();
vo.setids(new integer[]{41,42,43,44,45});
list userlist = 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值,根据这些值进行搜索
*/
list search3(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);
list userlist = userdao.search3(vo);
userlist.foreach(system.out::println);
}
garde丶mafille