MyBatis 杂项(分页,缓存,处理BLOBCLOB数据)

Posted AnswerTheQuestion

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis 杂项(分页,缓存,处理BLOBCLOB数据)相关的知识,希望对你有一定的参考价值。

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);
    }
    
}

 






以上是关于MyBatis 杂项(分页,缓存,处理BLOBCLOB数据)的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis源码分析自定义缓存分页的实现

小峰mybatismybatis分页和缓存

Mybatis 怎么分多个配置文件

Mybatis-Plugin解析

Mybatis-Interceptor

JavaLearn#(27)MyBatis进阶:Mapper代理(接口绑定)多参数传递模糊查询分页自增主键回填动态SQL一级缓存二级缓存