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=" ...
随机推荐
- FBI Warning
FBI Warning... --------------------------- 电影中的片头部分:<正宗的FBI Warning>: ========== 翻译: fbi warni ...
- 再起航,我的学习笔记之JavaScript设计模式14(桥接模式)
桥接模式 桥接模式(Bridge): 在系统沿着多个维度变化的同时,又不增加其复杂度并已达到解耦 从定义上看桥接模式的定义十分难以理解,那么我们来通过示例来演示什么是桥接模式. 现在我们需要做一个导航 ...
- 这可能是新手最容易入门的JVM讲解(不过是一场恋爱)
作者:请叫我红领巾,转载请注明出处http://www.cnblogs.com/xxzhuang/p/7453746.html 一.写在前面 首先,本篇文章并没有涉及原理,而是在笔者撸了<深入理 ...
- JS函数-我调用自己试试看
前言 最近在读<JavaScript语言精粹>,对递归函数有了进一步的认识,希望总结下来: 递归是一种强大的编程技术,他把一个问题分解为一组相似的子问题,每一问题都用一个寻常解去解决.递归 ...
- amoeba
Amoeba 原理:amoeba相当于业务员,处理client的读写请求,并将读写请求分开处理.amoeba和master以及slave都有联系,如果是读的请求,amoeba就从slave读取信息反馈 ...
- python专题-异常处理(基础)
之前在学习python的时候有整理过python异常处理的文章,不够简单也不够完整,所以决定再整理一篇,算做补充. http://www.cnblogs.com/cmt110/p/7464748.ht ...
- Grails笔记四:Groovy特性小结
在学习Grails的时候与Groovy打交道不可避免,虽然不必太深刻,但多知道一些特性也是很有帮助的~ 1.相除后获取整数 使用intdiv()方法可以获得整数,注意点是这个方法只适用两个整数相除,浮 ...
- Centos 6启动流程详解
author:JevonWei 版权声明:原创作品 Centos6 启动流程 POST开机自检 当按下电源键后,会启动ROM芯片中的CMOS程序检查CPU.内存等硬件设备是否正常运行,CMOS中的程序 ...
- Python Celery队列
Celery队列简介: Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery. 使用 ...
- MySQL的JOIN(二):JOIN原理
表连接算法 Nested Loop Join(NLJ)算法: 首先介绍一种基础算法:NLJ,嵌套循环算法.循环外层是驱动表,循坏内层是被驱动表.驱动表会驱动被驱动表进行连接操作.首先驱动表找到第一条记 ...