MyBatis框架(三)动态SQL,分页,二进制存入数据库图片
一、动态sql语句,分页
1, <if>条件
<if test="key!=null">
拼接sql语句
</if>
2, <choose><when><otherwise>
注意:只能执行一个分支
<choose>
<when test="key=='value'">
拼接sql语句
</when>
<when test="key=='value'">
拼接sql语句
</when>
<otherwise>
前两者都不符合时执行
</otherwise>
</choose>
3, <where>
自动添加where关键字
如果where子句第一句中有 or 或者 and 则删除第一个
4, <trim>
功能与<where>类似, 并且提供了前缀, 后缀的添加, 更加灵活
5, <foreach>
用来遍历传入的集合参数
item(定义集合中每个对象的名字),
collection(集合的对象的名字),
open(定义开始的字符),
close(定义结束的字符),
separator(定义分割的字符)
index(定义元素的索引)
6, <set>
主要用于update
自动加上set关键字
自动剔除最后一个 ","
7, <sql>
经常用于一些常用或者固定的语句, 在外面定义一个语句, 在各种标签中引入
使用include, 相当于直接写在上面
8, <selectKey>
用于不支持自增长主键的数据库, 尽量避免写这个东西
符号:
< < 小于号
> > 大于号
& & 和
' ’ 单引号
" " 双引号
<![CDATA[]]>
例子:
model:
package model;
import java.util.Date;
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private Date hiredate;
private Integer sal;
private Integer comm;
private Integer deptno;
private Integer sex;
private Dept dept;
public Emp() {
super();
// TODO Auto-generated constructor stub
}
public Emp(Integer empno, String ename, String job, Integer mgr, Date hiredate, Integer sal, Integer comm, Integer deptno, Integer sex,
Dept dept) {
super();
this.empno = empno;
this.ename = ename;
this.job = job;
this.mgr = mgr;
this.hiredate = hiredate;
this.sal = sal;
this.comm = comm;
this.deptno = deptno;
this.sex = sex;
this.dept = dept;
}
public Integer getEmpno() {
return empno;
}
public void setEmpno(Integer empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public Integer getMgr() {
return mgr;
}
public void setMgr(Integer mgr) {
this.mgr = mgr;
}
public Date getHiredate() {
return hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
public Integer getSal() {
return sal;
}
public void setSal(Integer sal) {
this.sal = sal;
}
public Integer getComm() {
return comm;
}
public void setComm(Integer comm) {
this.comm = comm;
}
public Integer getDeptno() {
return deptno;
}
public void setDeptno(Integer deptno) {
this.deptno = deptno;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
@Override
public String toString() {
return "Emp [empno=" + empno + ", ename=" + ename + ", job=" + job + ", mgr=" + mgr + ", hiredate=" + hiredate
+ ", sal=" + sal + ", comm=" + comm + ", deptno=" + deptno + ", sex=" + sex + ", dept=" + dept + "]";
}
}
package model;
public class PageBean {
private int page;
private int rows;
private int firstRow;
private int maxRow;
public PageBean() {
this.page = 1;
this.rows = 10;
this.firstRow = (page-1)*rows;
this.maxRow = page*rows;
}
public PageBean(int page, int rows) {
this.page = page;
this.rows = rows;
this.firstRow = (page-1)*rows;
this.maxRow = page*rows;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
public int getFirstRow() {
return firstRow;
}
public void setFirstRow(int firstRow) {
this.firstRow = firstRow;
}
public int getMaxRow() {
return maxRow;
}
public void setMaxRow(int maxRow) {
this.maxRow = maxRow;
}
}
mapper:
package mapper;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.RowBounds;
import model.Emp;
import model.PageBean;
public interface EmpMapper {
List<Emp> selectEmpByMapParam(Map<String,Object> map);
List<Emp> selectEmpByChoose(Map<String ,Object> map);
List<Emp> selectEmpByWhere(Map<String ,Object> map);
List<Emp> selectEmpByTrim(Map<String ,Object> map);
List<Emp> selectEmpByForeachMap(Map<String ,Object> map);
List<Emp> selectEmpByForeachList(List<Integer> idlist);
List<Emp> selectEmpByForeachInteger(Integer[] array);
int updateEmpBySet(Emp e);
int insertEmp(Emp e);
List<Emp> selectEmp(RowBounds rbs);
List<Emp> selectEmpByPage(PageBean pg);
}
<?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="mapper.EmpMapper">
<select id="selectEmp" parameterType="Map" resultType="Emp">
select * from p_emp e
</select>
<select id="selectEmpByMapParam" parameterType="Map" resultType="Emp">
select * from p_emp e
<if test="sex!=null">
where e.sex=#{sex}
</if>
</select>
<select id="selectEmpByChoose" parameterType="Map" resultType="Emp">
select * from p_Emp e where 1=1
<choose>
<when test="ename!=null">
and e.ename like #{ename}
</when>
<when test="job!=null">
and e.job like #{job}
</when>
<otherwise>
and e.ssex = '1'
</otherwise>
</choose>
</select>
<select id="selectEmpByWhere" parameterType="Map" resultType="Emp">
select * from p_emp e
<where>
<if test="ename!=null">
and e.ename like #{ename}
</if>
<if test="job!=null">
and e.job like #{job}
</if>
</where>
</select>
<select id="selectEmpByTrim" parameterType="Map" resultType="Emp">
select * from p_Emp e
<trim prefix="where" prefixOverrides="and|or">
<if test="ename!=null">
and e.ename like #{ename}
</if>
<if test="job!=null">
and e.job like #{job}
</if>
</trim>
</select>
<select id="selectEmpByForeachMap" resultType="Emp">
select * from p_Emp e where e.empno in
<foreach collection="idList" item="aaa" open="(" close=")" separator=",">
#{aaa}
</foreach>
</select>
<select id="selectEmpByForeachList" resultType="Emp">
select * from p_Emp e where e.empno in
<foreach collection="list" item="aaa" open="(" close=")" separator=",">
#{aaa}
</foreach>
</select>
<select id="selectEmpByForeachInteger" resultType="Emp">
select * from p_Emp e where e.empno in
<foreach collection="array" item="aaa" open="(" close=")" separator=",">
#{aaa}
</foreach>
</select>
<update id="updateEmpBySet" parameterType="Emp">
update p_Emp e
<set>
<if test="ename!=null">
e.ename=#{ename},
</if>
<if test="job!=null">
e.job=#{job},
</if>
<if test="mgr!=null">
e.mgr=#{mgr},
</if>
<if test="hiredate!=null">
e.hiredate=#{hiredate},
</if>
<if test="sal!=null">
e.sal=#{sal}
</if>
</set>
where e.empno=#{empno}
</update>
<sql id="pageSqlPre">
SELECT * FROM (
</sql>
<sql id="pageSqlSuf">
WHERE ROWNUM <![CDATA[<=]]> 9) r WHERE r.rnum>6
</sql>
<select id="selectEmpBySql" resultType="Emp">
<include refid="pageSqlPre"></include>
SELECT e.*, ROWNUM rnum FROM p_Emp e
<include refid="pageSqlSuf"></include>
</select>
<!-- 不建议使用
<selectKey keyProperty="empno" order="BEFORE" resultType="int">
select test1.nextval from dual
</selectKey> -->
<sql id="pagePre">
SELECT * FROM (
</sql>
<sql id="pageSuf">
WHERE ROWNUM <![CDATA[<=]]> #{maxRow}) r
WHERE r.rnum > #{firstRow}
</sql>
<select id="selectEmpByPage" resultType="Emp" parameterType="PageBean">
<include refid="pagePre"></include>
select e.*, rownum rnum from p_emp e
<include refid="pageSuf"></include>
</select>
</mapper>
测试:
package test;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import mapper.DeptMapper;
import mapper.EmpMapper;
import model.Dept;
import model.Emp;
import model.PageBean;
import oracle.net.aso.e;
import util.MyBatisUtil;
public class JUTest {
private SqlSession ss;
private EmpMapper em;
private DeptMapper dm;
@Before
public void setUp() throws Exception {
ss = MyBatisUtil.getSession();
em = ss.getMapper(EmpMapper.class);
dm = ss.getMapper(DeptMapper.class);
}
@After
public void tearDown() throws Exception {
MyBatisUtil.destory(ss);
}
@Test
public void test() {
Map map=new HashMap();
//map.put("sex", "1");
// List<Emp> elist = em.selectEmpByMapParam(map);
// for(Emp e:elist){
// System.out.println(e);
// }
//map.put("ename", "T%");
// map.put("job", "推销员");
// List<Emp> elist=em.selectEmpByChoose(map);
// for(Emp e:elist){
// System.out.println(e);
// }
// map.put("ename", "T%");
// map.put("job", "推销员");
// List<Emp> elist =em.selectEmpByWhere(map);
// for(Emp e:elist){
// System.out.println(e);
// }
// map.put("ename", "T%");
// map.put("job", "推销员");
// List<Emp> elist =em.selectEmpByTrim(map);
// for(Emp e:elist){
// System.out.println(e);
// }
// List<Integer> idlist=new ArrayList<Integer>();
// idlist.add(7369);
// idlist.add(7521);
// idlist.add(7782);
// //直接传list集合,xml中collection属性为传入类型
// //List<Emp> elist=em.selectEmpByForeachList(idlist);
// map.put("idList", idlist);
// //将集合加到map中,传map,xml中collection属性为map的键
// //List<Emp> elist=em.selectEmpByForeachMap(map);
// //传集合,xml中collection属性为传入类型
// Integer[] ia={7369,7521};
// List<Emp> elist=em.selectEmpByForeachInteger(ia);
// for(Emp e:elist){
// System.out.println(e);
// }
// Emp e=new Emp();
// e.setEmpno(7010);
// e.setEname("修改");
// e.setSal(999);
// int ea=em.updateEmpBySet(e);
// System.out.println(ea);
//分页1 设置RowBounds,然后传入,自动分页
// int page = 2;
// int rows = 5;
//
// int limit = (page-1)*rows;
// int offset = rows;
//
//
// RowBounds rbs = new RowBounds(limit, offset);
// List<Emp> elist = em.selectEmp(rbs);
// for(Emp e:elist){
// System.out.println(e);
// }
//分页2 利用实体类,sql引入等
PageBean pb = new PageBean(1, 5);
List<Emp> elist = em.selectEmpByPage(pb);
for(Emp f : elist) {
System.out.println(f);
}
}
}
二、二进制存入图片
将图片转换为字节数组一Blob格式存入取出数据库
例子:
model:
package model;
public class Puser {
private String pname;
private String ppassword;
private byte[] pprcture;
public Puser() {
super();
// TODO Auto-generated constructor stub
}
public Puser(String pname, String ppassword, byte[] pprcture) {
super();
this.pname = pname;
this.ppassword = ppassword;
this.pprcture = pprcture;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public String getPpassword() {
return ppassword;
}
public void setPpassword(String ppassword) {
this.ppassword = ppassword;
}
public byte[] getPprcture() {
return pprcture;
}
public void setPprcture(byte[] pprcture) {
this.pprcture = pprcture;
}
}
mapper:
package mapper;
import java.util.List;
import model.Puser;
public interface PuserMapper {
int insertPuser(Puser p);
Puser getUser(String pname);
}
<?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="mapper.PuserMapper">
<insert id="insertPuser">
insert into puser values(#{pname},#{ppassword},#{pprcture})
</insert>
<select id="getUser" parameterType="String" resultType="puser">
select * from puser a where a.pname=#{pname}
</select>
</mapper>
测试:
package test;
import static org.junit.Assert.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import mapper.PuserMapper;
import model.Puser;
import util.MyBatisUtil;
public class JUtest {
private SqlSession ss;
private PuserMapper pm;
@Before
public void setUp() throws Exception {
ss = MyBatisUtil.getSession();
pm=ss.getMapper(PuserMapper.class);
}
@After
public void tearDown() throws Exception {
MyBatisUtil.destory(ss);
}
@Test
public void test() {
/*File file=new File("E:\\2017-4-1手机 备份\\2017·1·15备份\\kowy.jpg");
InputStream in =null;
if(file.exists()){
try {
in = new FileInputStream(file);
byte[] bs=new byte[in.available()];
in.read(bs);
Puser p=new Puser("鑫月半","666s",bs);
int a=pm.insertPuser(p);
System.out.println(a);
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}else{
System.out.println("文件有问题");
}*/
File outfile = new File("E:\\sanpang.jpg"); // 目标文件的地址
try {
OutputStream out = new FileOutputStream(outfile);
Map m=new HashMap();
//m.put("pname","鑫月半")
Puser user = pm.getUser("鑫月半");
byte[] bs = user.getPprcture();
System.out.println(bs.toString());
//out.write(bs);
//out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
MyBatis框架(三)动态SQL,分页,二进制存入数据库图片的更多相关文章
- mybatis框架(5)---动态sql
那么,问题来了: 什么是动态SQL? 动态SQL有什么作用? 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误.Mybatis的动态S ...
- mybatis框架中动态SQL的编写
1.动态SQL:在SQL语句中加入流程控制.比如加入if,foreach等. 重点掌握if语句: 案例1: <update id="updateItem" parameter ...
- Spring boot 配置 mybatis xml和动态SQL 分页配置
更新时间 2018年4月30日23:27:07 1.pom.xml <?xml version="1.0" encoding="UTF-8"?> & ...
- JavaWeb_(Mybatis框架)Mapper动态代理开发_三
系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...
- 【mybatis深度历险系列】mybatis中的动态sql
最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...
- mybatis 详解------动态SQL
mybatis 详解------动态SQL 目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when,o ...
- Mybatis入门之动态sql
Mybatis入门之动态sql 通过mybatis提供的各种标签方法实现动态拼接sql. 1.if.where.sql.include标签(条件.sql片段) <sql id="sel ...
- mybatis中的动态SQL
在实际开发中,数据库的查询很难一蹴而就,我们往往要根据各种不同的场景拼接出不同的SQL语句,这无疑是一项复杂的工作,我们在使用mybatis时,mybatis给我们提供了动态SQL,可以让我们根据具体 ...
- Mybatis映射文件动态SQL语句-01
因为在很多业务逻辑复杂的项目中,往往不是简单的sql语句就能查询出来自己想要的数据,所有mybatis引入了动态sql语句, UserMapper.xml <?xml version=" ...
随机推荐
- 浅谈CSS模块化
为什么要CSS模块化? 你是否为class命名而感到苦恼? 你是否有怕跟别人使用同样class名而感到担忧? 你是否因层级结构不清晰而感到烦躁? 你是否因代码难以复用而感到不爽? 你是否因为commo ...
- 《Java从入门到放弃》JavaSE篇:综合练习——单身狗租赁系统(数组版)
因为现在只学习了基本语法,所以在综合练习之前,先补充关于方法概念. 方法的作用:把一系列的代码放在一起,然后再取个别名.之后通过这个别名的调用,就相当于执行了这一系列的代码. 方法的语法:([]中的内 ...
- RPC服务不可用总结
A简单方法: 通过"控制面板/管理工具/服务",检查一下RPC的Remote Procedure Call (RPC)和Remote Procedure Call (RPC) Lo ...
- matplotlib 填充颜色
def huitu_host(nodes,total): x = np.arange(len(nodes)) plt.figure(figsize=(9,5)) plt.xticks(x,nodes) ...
- Java入门(4)——常见的String方法
考虑到API当中的解释,新手可能有点看不懂(我刚开始就是不太看得懂).最好的学习方法当然是是自己一个一个去试一遍,然后就可以加深印象. 然后, 这是我当初学习的时候用自己的大白话做的笔记.现在查阅的话 ...
- The C++ Programming Language 学习笔记 第6章 表达式和语句
1.关于strcpy函数. 书中说c风格的字符串尽量少用,strcpy这样的函数应该也要少用.这里讲这个函数主要是要通过本章课后练习第十题来讲一下前面提及的要点.巩固一下前几章的知识.写了一段,本来感 ...
- python的multiprocessing模块进程创建、资源回收-Process,Pool
python的multiprocessing有两种创建进程的方式,每种创建方式和进程资源的回收都不太相同,下面分别针对Process,Pool及系统自带的fork三种进程分析. 1.方式一:fork( ...
- javascript页面间传递参数
1.通过URL传递参数 传递参数页 function setCity() { var str = document.getElementById("cityName"); if ( ...
- 对 响应数据写在config文件的再次优化
之前写过 [基于moco的mock server 简单应用]这篇文章,然后自己这段时间也在做基金的接口测试,逛了一些论坛,然后对 响应数据写在config文件的再次优化,之前是把所有的响应数据都写到c ...
- 迁移学习-Transfer Learning
迁移学习两种类型: ConvNet as fixed feature extractor:利用在大数据集(如ImageNet)上预训练过的ConvNet(如AlexNet,VGGNet),移除最后几层 ...