MyBatis 杂项(分页,缓存,处理BLOB\CLOB数据)

1.处理CLOB,BLOB数据

oracle中的
  clob:clob
  blob:blob
mysql中的
  clob:longtext
  blob:longblob

2.传入多个输入参数,mybatis自带的param属性(但是不经常用,我们用map就足够了)

3.MyBatis分页

逻辑分页:将数据全部取出先放到内存中,之后在内存中进行分页,性能不好。不推荐使用

物理分页:通过语句进行分页。

4.MyBatis缓存

MyBatis默认情况下:MyBatis默认使用一级缓存,即同一个SqlSession调用了相同的select语句,则直接回从缓存中返回结果,而不是再去查询以便数据库;

开发者可以自己配置二级缓存,二级缓存是全局的;

默认情况下:select使用二级缓存,insert,update,delete不使用二级缓存;

代码示例:

mapper接口:

package com.maya.mappers;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.RowBounds;

import com.maya.model.Student;

public interface StudentMapper {

    public int insert(Student student);//添加blob,clob

    public Student findById(String id);//读取BLOB,CLOB

    public List<Student> findKeys(String name,String sex);//多个参数处理方式

    public List<Student> findByRow(RowBounds RBs);//MyBatis进行分页,逻辑分页,性能不好,不常使用

    public List<Student> findByRow2(Map<String,Object> param);//MyBatis进行分页,物理分页 ,常使用
}

mapper.xml映射文件

<?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="com.maya.mappers.StudentMapper">

    <!--
        1,size:表示缓存cache中能容纳的最大元素数。默认是1024;
        2,flushInterval:定义缓存刷新周期,以毫秒计;
        3,eviction:定义缓存的移除机制;默认是LRU(least recently userd,最近最少使用),还有FIFO(first in first out,先进先出)
        4,readOnly:默认值是false,假如是true的话,缓存只能读。
     -->
    <cache size="1024" flushInterval="60000" eviction="LRU" readOnly="false"/>

    <resultMap type="Student" id="StudentResult">
        <id property="snumber" column="son" />
        <result property="name" column="sname" />
        <result property="sex" column="sex" />
    </resultMap>

    <!-- 添加BLOB,CLOB -->
    <insert id="insert" parameterType="Student">
        insert into student (son,sname,sex,pic,text) values (#{snumber},#{name},#{sex},#{pic},#{text})
    </insert>

    <!-- 读取BLOB,CLOB -->
    <select id="findById" parameterType="String" resultMap="StudentResult">
        select * from student where son=#{id}
    </select>

    <!-- mybatis处理多个参数,类型就要用mybatis的参数,第一个就是param1,第二个就是param2 -->
    <select id="findKeys" resultMap="StudentResult">
        select * from student where sname like #{param1} and sex=#{param2}
    </select>

    <!-- 逻辑分页 -->
    <select id="findByRow" resultMap="StudentResult">
        select * from student
    </select>

    <!-- 物理分页,这是基于oracle的分页过程,mysql的分页过程非常简单 select * from student limit start, size  -->
    <select id="findByRow2" parameterType="Map" resultMap="StudentResult">
        <choose>
            <when test="start!=null and end!=null">
                select * from (select a.*, rownum ro from (select * from student) a) where ro between #{start} and #{end}
            </when>
            <otherwise>
                select * from student
            </otherwise>
        </choose>
    </select>

</mapper>

junit测试

package com.maya.service;
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.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.maya.mappers.StudentMapper;
import com.maya.model.Student;
import com.maya.util.MyBatisUtil;

public class JunitTest2 {
    private static Logger logger=Logger.getLogger(JunitTest2.class);
    private SqlSession sqlSession=null;
    private StudentMapper studentMapper=null;

    @Before
    public void setUp() throws Exception {
        sqlSession=MyBatisUtil.openSession();
        studentMapper=sqlSession.getMapper(StudentMapper.class);
    }

    @After
    public void tearDown() throws Exception {
        sqlSession.close();
    }

    @Test
    //存储CLOB,BLOB
    public void testInsertStudent(){
        logger.info("添加学生---存储CLOB,BLOB");
        Student s=new Student();
        s.setSnumber("111");
        s.setName("正男");
        s.setSex("男");
        s.setText("很长的文本。。。。。。。。。。。。。。。。");
        byte[] pic=null;//
        try {
            File f=new File("c://hehe.png");//填写路径
            InputStream in=new FileInputStream(f);//读改路径
            pic=new byte[in.available()];//available()长度
            in.read(pic);//读
            in.close();//关闭
        } catch (Exception e) {
            e.printStackTrace();
        }
        s.setPic(pic);
        int i=studentMapper.insert(s);
        System.out.println(i);
        sqlSession.commit();
    }

    @Test
    //读取BLOB,CLOB
    public void testReadStudent(){
        logger.info("读取CLOB和BLOB。。。。");
        Student s=studentMapper.findById("111");
        System.out.println(s);
        byte[] pic=s.getPic();
        try{
            File f=new File("e://a2.png");//填写路径
            OutputStream os=new FileOutputStream(f);//写入该路径
            os.write(pic);//写
            os.close();//关闭
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    @Test
    //mybatis处理多个参数
    public void textKeys(){
        logger.info("mybatis处理多个参数");
        List<Student> list=studentMapper.findKeys("%正%", "男");
        System.out.println(list);
    }

    @Test
    //MyBatis分页(逻辑分页,性能不好,不常使用)
    public void textRow(){
        logger.info("mybatis处理多个参数");
        int offset=0,limit=3;
        RowBounds RBs=new RowBounds(offset,limit);
        List<Student> list=studentMapper.findByRow(RBs);
        System.out.println(list);
    }

    @Test
    //MyBatis分页(物理分页,性能不好,不常使用)
    public void textRow2(){
        int pageStart=2;
        int pageSize=3;
        logger.info("mybatis处理多个参数");
        Map<String, Object> param=new HashMap<String, Object>();
        param.put("start", (pageStart-1)*pageSize+1);
        param.put("end", (pageStart-1)*pageSize+pageSize);
        List<Student> list=studentMapper.findByRow2(param);
        System.out.println(list);
    }

}
时间: 2024-10-13 22:22:28

MyBatis 杂项(分页,缓存,处理BLOB\CLOB数据)的相关文章

java操作oracle的blob,clob数据

一.区别和定义 LONG: 可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长文本一个表中最多一个LONG列 LONG RAW: 可变长二进制数据,最长2G CLOB:  字符大对象Clob 用来存储单字节的字符数据 NCLOB: 用来存储多字节的字符数据 BLOB: 用于存储二进制数据 BFILE: 存储在文件中的二进制数据,这个文件中的数据只能被只读访.但该文件不包含在数据库内. bfile字段实际的文件存储在文件系统中,字段中存储的是文件定位指针.bfile对o

MyBatis SQL分页处理及查询总数据量

查询数据总数:<select id="selectCount" resultType="java.lang.Integer"> <!-- WARNING - @mbggenerated This element is automatically generated by MyBatis Generator, do not modify. --> select count(id) from tb_user <where > <

MyBatis延迟加载和缓存(4)

一.项目创建 1.项目目录结构 2.数据库配置和上一篇的一样,这里不再描述.下面创建mybatis配置文件SqlMapConfig.xml 1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/m

MyBatis Review——查询缓存

一,查询缓存简介 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级缓存是SqlSession级别的缓存.在操作数据库时候,需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据.不同的sqlSession之间的缓存数据区域是互相不影响的. 二级缓存是mapper级别的缓存,多个sqlSession去操作同一个mapper的sql语句,多个sqlSession可以共用二级缓存,二级缓存是跨sqlSes

处理大数据对象clob数据和blob数据

直接上下代码: 1 package com.learn.jdbc.chap06; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.InputStream; 6 import java.sql.Connection; 7 import java.sql.PreparedStatement; 8 9 import com.learn.jdbc.model.Album; 10 import com.

Oracle如何通过dataLink复制远程数据库的CLOB\BLOB字段数据到本地数据库

Oracle不支持直接通过Database Link复制远程数据库表的CLOB/BLOB字段数据到本地数据库. 像如下的SQL是不能执行的.(ipop_topic表有一个CLOB的字段) insert into ipop_topicselect * from [email protected] where application_id=1000 但是,我们可以借助全局临时表,先把数据复制到临时表,再从临时表转移到你的目的表. create global temporary table ipop_

解决:oracle+myBatis ResultMap 类型为 map 时,表字段类型有 Long/Blob/Clob 时报错

前言:最近在做一个通用查询单表的组件,所以 sql 的写法就是 select *,然后 resultType="map" .如果数据库中的表里有字段类型为 Long 等类型时,mybatis 在执行 sql 时会报错,如果表中有 Blob.Clob 类型在转 json 是也会报错,而且我这里也需要将这几种类型都转为 String 类型到前端. long 类型 sql 报错: Blob/Clob 转 json 报错: 解决方案: 自定义 typeHandle 来统一处理数据库这些特殊的字

《深入理解mybatis原理》 MyBatis的一级缓存实现详解 及使用注意事项

0.写在前面 MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓存机制上.MyBatis提供了一级缓存.二级缓存 这两个缓存机制,能够很好地处理和维护缓存,以提高系统的性能.本文的目的则是向读者详细介绍MyBatis的一级缓存,深入源码,解析MyBatis一级缓存的实现原理,并且针对一级缓存的特点提出了在实际使用过程中应该注意的事项. 读完本文,你将会学到: 1.什么是一级缓存?为什么使用一级缓存? 2.MyBatis的一级缓存是怎样组织的?(即SqlSes

Mybatis 的分页插件PageHelper-4.1.1的使用

Mybatis 的分页插件 PageHelper 项目地址:http://git.oschina.net/free/Mybatis_PageHelper 文档地址:http://git.oschina.net/free/Mybatis_PageHelper/blob/master/wikis/HowToUse.markdown 我用的版本是PageHelper-4.1.1.Mybatis-3.3.0 PageHelper 依赖于 jsqlparser-0.9.4.jar 使用方法: 1.根据My