mybatis条件语句的查询与注解的使用以及mybatis与servelet结合查询
1、mybatis条件语句的查询
首先创建对象,添加属性(再次之前需要config.xml文件连接数据库)
import lombok.Data;@Data//该注解会自动添加get、set方法
public class Emp {private Integer empNo;private String ename;private String job;private Integer mgr;private String hireDate;private Double sal;private Double comm;private Integer deptNo;public Integer state;
}
1)根据一个参数对数据进行查询
①建立接口,创建方法
public interface EmpMapper {List<Emp> find1(Emp emp);//一个参数进行查询
}
②xml文件书写SQL查询语句
<select id="find1" resultType="com.jiazhong.mybatis.m4.bean.Emp">select * from emp<if test="ename!=null">where ename like #{ename}</if></select>
③实现查询姓李的人的数据
private static void a(){InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);Emp emp = new Emp();emp.setEname("%李%");List<Emp> emps = empMapper.find1(emp);sqlSession.close();}
2) 根据两个参数对数据进行查询
2.1 SQL语句用<where>实现
①建立接口,创建方法
public interface EmpMapper {List<Emp> find2(Emp emp);//两个参数进行查询
}
②xml文件书写SQL查询语句
由于是两个条件,可能只需要实现其中一个,也可能两个条件都需满足,这时候拼接就不起效了,用where可以实现如果条件只要成立一个,会自动添加where语句并且忽略第一次出现的and或者or
<select id="find2" resultType="com.jiazhong.mybatis.m4.bean.Emp">select * from emp<!--where:如果条件只要成立一个,会自动添加where语句并且忽略第一次出现的and|or--><where><if test="ename!=null">and ename like #{ename}</if><if test="job!=null">and job=#{job}</if></where></select>
③实现查询姓李的(程序员的)数据
private static void b(){InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);Emp emp = new Emp();emp.setEname("%李%");//emp.setJob("程序员");List<Emp> emps = empMapper.find2(emp);sqlSession.close();}
2.2 SQL语句用<trim>实现
①建立接口,创建方法
public interface EmpMapper {List<Emp> find3(Emp emp);//两个参数进行查询
}
②xml文件书写SQL查询语句
同样,trim也有where一样的功能:如果条件只要成立一个,会自动添加where语句并且忽略第一次出现的and或or
<select id="find3" resultType="com.jiazhong.mybatis.m4.bean.Emp">select * from emp<!--trim:如果条件只要成立一个,会自动添加where语句并且忽略第一次出现的and|or--><trim prefix="where" prefixOverrides="and|or"><if test="ename!=null">and ename like #{ename}</if><if test="job!=null">and job=#{job}</if></trim></select>
③实现查询姓李的(程序员的)数据
private static void c(){InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);Emp emp = new Emp();emp.setEname("%李%");emp.setJob("程序员");List<Emp> emps = empMapper.find3(emp);sqlSession.close();}
3)更新一条数据
3.1 SQL语句用<set>实现
①建立接口,创建方法
public interface EmpMapper {int update1(Emp emp);//一条数据的更新,SQL语句用<set>
}
②xml文件书写SQL查询语句
由于有的数据没有给到程序,在SQL语句中使用<set>方法就可以实现只要条件成立一个,会自动添加一个set,并忽略最后一次出现的逗号
<update id="update1" parameterType="com.jiazhong.mybatis.m4.bean.Emp">update emp<!--set:只要条件成立一个,会自动添加一个set,并忽略最后一次出现的,--><set><if test="ename!=null">ename = #{ename},</if><if test="job!=null">job = #{job},</if><if test="mgr!=null">mgr = #{mgr},</if><if test="sal!=null">sal = #{sal},</if><if test="comm!=null">comm = #{comm},</if><if test="deptNo!=null">deptNo = #{deptNo},</if></set>where empNo=#{empNo}</update>
③实现数据更新
private static void d(){InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);Emp emp = new Emp();emp.setEname("你好");emp.setJob("程序员");emp.setSal(798.0);emp.setEmpNo(999999);empMapper.update1(emp);sqlSession.close();}
3.2 SQL语句用<trim>实现
①建立接口,创建方法
public interface EmpMapper {int update2(Emp emp);//一条数据的更新,SQL语句用<trim>
}
②xml文件书写SQL查询语句
<trim>方法跟<set>方法是一样的效果:只要条件成立一个,会自动添加一个set,并忽略最后一次出现的逗号
<update id="update2" parameterType="com.jiazhong.mybatis.m4.bean.Emp"><trim prefix="set" suffixOverrides=","><if test="ename!=null">ename = #{ename},</if><if test="job!=null">job = #{job},</if><if test="mgr!=null">mgr = #{mgr},</if><if test="sal!=null">sal = #{sal},</if><if test="comm!=null">comm = #{comm},</if><if test="deptNo!=null">deptNo = #{deptNo},</if></trim>where empNo=#{empNo}</update>
③实现数据更新
private static void d(){InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);Emp emp = new Emp();emp.setEname("你好");emp.setJob("程序员");emp.setSal(798.0);emp.setEmpNo(999999);empMapper.update2(emp);sqlSession.close();}
4)if else 条件语句
①建立接口,创建方法
public interface EmpMapper { List<Emp> find4(String job);//if else判断语句
}
②xml文件书写SQL查询语句
when相当于if,otherwise相当于else if
<是小于号,网页中小于号是一个特殊字符,所有不能用<表示小于号
<select id="find4" resultType="com.jiazhong.mybatis.m4.bean.Emp">select * from emp<where><choose><!--when相当于if,otherwise相当于else if--><when test="job=='程序员'">and sal>1000</when><when test="job=='歌手'">and deptNp=20</when><when test="job=='网页设计'">and hiredate>='2025-1-1' and hiredate <='2025-12-31'</when><otherwise>and ename like '%李%'</otherwise></choose></where></select>
③实现条件查询
传入的job值既不是程序员,也不是歌手和网页设计,所以输出姓李的员工信息
private static void e(){InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);empMapper.find4("1212");sqlSession.close();}
5)foreach
①建立接口,创建方法
public interface EmpMapper { List<Emp> find5(@Param("abcd")List<String> abcd);//foreach
}
②xml文件书写SQL查询语句
<select id="find5" resultType="com.jiazhong.mybatis.m4.bean.Emp">select * from emp<where><if test="abcd!=null">job in<foreach collection="abcd" item="e" separator="," open="(" close=")">#{e}</foreach></if></where></select>
③实现条件查询
查询job是程序员、网页设计、歌手、aaa的员工信息
private static void f(){InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();List<String> jobs = Arrays.asList("程序员","网页设计","歌手","aaa");EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);List<Emp> result = mapper.find5(jobs);sqlSession.close();}
6)bind
①建立接口,创建方法
public interface EmpMapper { List<Emp> find6(@Param("ename")String ename);//bind
}
②xml文件书写SQL查询语句
<select id="find6" resultType="com.jiazhong.mybatis.m4.bean.Emp"><!-- _parameter.ename:获取参数对象的 ename 属性值'%'+...+'%':在值的前后添加通配符 % --><bind name="abc" value="'%'+_parameter.ename+'%'"></bind>select * from emp where ename like #{abc}</select>
③实现条件查询
查询姓张的员工信息
private static void g(){InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);mapper.find6("张");sqlSession.close();}
2、mybatis注解的使用
注解的使用会让代码更加简洁
首先创建对象,添加属性(再次之前需要config.xml文件连接数据库)
@Data//该注解会自动生成get set方法
public class Emp {private Integer empNo;private String ename;private String job;private Integer mgr;private String hireDate;private Double sal;private Double comm;private Integer deptNo;public Integer state;
}
这里我将把增删查改写在一起,注释在代码中
①建立接口,创建方法
import com.jiazhong.mybatis.m5.bean.Emp;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;import java.util.List;public interface EmpMapper {//使用注解进行增删改查@Select("select * from emp where state=1")List<Emp> findAll();@Select("select * from emp where state=1 and empno=#{id}")Emp findById(Integer id);@Select("select * from emp where state=1 and ename like #{name}")List<Emp> findByName(String name);@Select("select * from emp where state=1 and ename like #{ename} and job=#{job}")//@Select("<script>select * from emp where state=1 and ename like #{ename} <if test='job!=null'>and job=#{job}</if></script>")//这里不使用mybatis的条件语句(if else)查询是因为它太长List<Emp> findByEnameAndJob(@Param("ename") String ename,@Param("job") String job1);@Insert("insert into emp values (null,#{ename},#{job},#{mgr},now(),#{sal},#{comm},#{deptNo},1)")int save(Emp emp);@Update("update emp set ename=#{ename},job=#{job},mgr=#{mgr},sal=#{sal},comm=#{comm},deptNo=#{deptNo} where empno=#{empNo}")int update(Emp emp);@Update("update emp set state=0 where empno=#{id} and state=1")int delete(int id);
}
注解已经帮我们完成了SQL语句的书写,所以我们不用再在xml文件中书写SQL查询语句
②实现增删改查
查所有数据
private static void a(){InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);List<Emp> emps = empMapper.findAll();for (Emp emp : emps){System.out.println(emp);}sqlSession.close();}
根据Id查数据
private static void b(){InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);Emp emp = empMapper.findById(7908);System.out.println(emp);sqlSession.close();}
根据姓名查数据
private static void c(){InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);List<Emp> emps = empMapper.findByName("%李%");for(Emp emp : emps){System.out.println(emp);}sqlSession.close();}
分页查询
分页查询需要在config.xml文件中添加插件,还需要添加依赖,在mybatis增删改查文章中有该方法
private static void d(){InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);//分页查询int page=1;PageHelper.startPage(page,10);List<Emp> emps = empMapper.findAll();for(Emp emp : emps){System.out.println(emp);}//将原始查询结果(emps)转换为分页对象(PageInfo),自动计算并封装分页信息PageInfo<Emp> pageInfo = new PageInfo<>(emps);System.out.println(pageInfo);sqlSession.close();}
根据名字和job进行分页查询
private static void e(){InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);int page=1;PageHelper.startPage(page,10);List<Emp> emps = empMapper.findByEnameAndJob("%张%","程序员");for (Emp emp : emps){System.out.println(emp);}PageInfo<Emp> pageInfo = new PageInfo<>(emps);System.out.println(pageInfo);sqlSession.close();}
添加一条数据
private static void f(){InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);Emp emp = new Emp();emp.setEname("xx");emp.setJob("程序员");emp.setMgr(8907);emp.setSal(9999.9);emp.setComm(null);emp.setDeptNo(30);empMapper.save(emp);//将emp对象保存到数据库sqlSession.commit();//提交事务sqlSession.close();}
更新一条数据
private static void g(){InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);Emp emp = new Emp();emp.setEname("小美");emp.setJob("歌手");emp.setMgr(7898);emp.setSal(99199.9);emp.setComm(10.9);emp.setDeptNo(40);emp.setEmpNo(8041);empMapper.update(emp);sqlSession.commit();sqlSession.close();}
删除一条数据(这里是逻辑删除)
private static void h(){InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);empMapper.delete(8040);sqlSession.commit();sqlSession.close();}
3、mybatis与servelet结合查询
①首先创建对象,添加属性(再次之前需要config.xml文件连接数据库)
@Data
public class Emp {private Integer empNo;private String ename;private String job;private Integer mgr;private String hireDate;private Double sal;private Double comm;private Integer deptNo;private Integer state;
}
②创建接口
import com.jiazhong.mybatis.m6.bean.Emp;
import org.apache.ibatis.annotations.Select;import java.util.List;public interface EmpMapper {@Select("select * from emp where state=1")List<Emp> findAll();
}
③创建Serlet响应类
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;// 接受用户的请求,对请求作出响应
@WebServlet("/emp")
public class EmpServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {//HttpServletRequest:客户端请求 HttpServletResponse:服务器响应//1.接受请求InputStream inputStream = EmpServlet.class.getClassLoader().getResourceAsStream("config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession(true);EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);List<Emp> list = empMapper.findAll();// 2.作出响应//req.getSession():获取当前用户的会话(若不存在则创建新会话)//setAttribute("list", list):将会话属性list设为指定的list对象。后续可通过session.getAttribute("list")获取该数据req.getSession().setAttribute("list", list);//将数据(list)存入用户的会话(Session)中,键名为 "list"//sendRedirect("index.jsp"):向客户端发送302状态码和新 URL。浏览器收到后会自动发起新请求访问index.jspresp.sendRedirect("index.jsp");//将客户端重定向到 index.jsp 页面}
}
④建立jsp界面显示
<%@ page import="com.jiazhong.mybatis.m6.bean.Emp" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>Title</title></head><body><%--从会话中获取员工列表数据并展示--%><%//getAttribute("list"):尝试获取会话中名为 "list"的属性返回值为Object类型,需强制转换为实际类型Object obj = session.getAttribute("list");if (obj == null){ //若obj为nullresponse.sendRedirect("emp");//重定向到emp路径(通常是 Servlet)return;//终止当前 JSP 页面的执行}List<Emp> list = (List<Emp>) obj;//将Object类型的obj强制转换为List<Emp>//out:用于向客户端输出内容 e+"<br/>":调用Emp类的toString()方法并添加换行标签//最终在页面上显示每个员工的信息for (Emp e : list){out.print(e + "<br/>");}%></body>
</html>