mybatis的一些细节问题

看书上提到的,记下来,加深一下印象。

一、mybatis处理CLOB/BLOB列的类型处理,例如:

CREATE TABLE USER_PICS (
    ID INT(11) NOT NULL AUTO_INCREMENT,
    NAME VARCHAR(50) DEFAULT NULL,
    PIC BLOB,
    BIO LONGTEXT,
    PRIMARY KEY (ID)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;

默认情况下,mybatis会将CLOB类型的列映射到java.lang.String类型上,而把BLOB类型的列映射到byte[]类型上。

public class UserPic{
    private int id;
    private String name;
    private byte[] pic;
    private String bio;
    //setters & getters
}

创建mapper文件代码如下

<insert id="insertUserPic" parameterType="UserPic">
    INSERT INTO USER_PICS(NAME, PIC,BIO)
    VALUES(#{name},#{pic},#{bio})
</insert>
<select id="getUserPic" parameterType="int" resultType="UserPic">
    SELECT * FROM USER_PICS WHERE ID=#{id}
</select>

下列的insertUserPic()展示了如何将数据插入到 CLOB/BLOB 类型的列上:

public void insertUserPic(){
    byte[] pic = null;
    try{
            File file = new File("C:\\Images\\UserImg.jpg");
            InputStream is = new FileInputStream(file);
            pic = new byte[is.available()];
            is.read(pic);
            is.close();
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
        String name = "UserName";
        String bio = "put some lenghty bio here";
        UserPic userPic = new UserPic(0, name, pic , bio);
        SqlSession sqlSession = MyBatisUtil.openSession();
        try{
            UserPicMapper mapper =
            sqlSession.getMapper(UserPicMapper.class);
            mapper.insertUserPic(userPic);
            sqlSession.commit();
        }
        finally{
            sqlSession.close();
        }
}

下面的 getUserPic()方法展示了怎样将 CLOB 类型数据读取到 String 类型,BLOB 类型数据读取成 byte[]属性:

public void getUserPic(){
    UserPic userPic = null;
    SqlSession sqlSession = MyBatisUtil.openSession();
    try{
        UserPicMapper mapper =
        sqlSession.getMapper(UserPicMapper.class);
        userPic = mapper.getUserPic(1);
    }finally{
        sqlSession.close();
    }
    byte[] pic = userPic.getPic();
    try{
        OutputStream os = new FileOutputStream(new
        File("C:\\Images\\UserImage_FromDB.jpg"));
        os.write(pic);
        os.close();
    }catch (FileNotFoundException e){ 
        e.printStackTrace();
    }catch (IOException e){
        e.printStackTrace();
    }
}

二、使用RowBound来进行分页处理

mybatis可以使用RowBound来进行分页处理,RowBound有两个参数,offset和limit。offset标识开始的位置,limit标识要取的记录的数目,例如:

<select id="findAllStudents" resultMap="StudentResult">
    select * from Students
</select>

然后,你可以加载如下加载第一页数据(前 25 条) :

int offset =0 , limit =25;
RowBounds rowBounds = new RowBounds(offset, limit);
List<Student> = studentMapper.getStudents(rowBounds);

个人感觉这个对象可能比较适用于使用反向工程生成的代码,进行单表查询的时候使用,与mybatis的分页插件pageHelper比较像,不知道是不是,大牛有知道的帮忙解释一下。

三、mybatis-3.2.2 并不支持使用 resultMap 配置将查询的结果集映射成一个属性为key,而另外属性为 value 的 HashMap。sqlSession.selectMap()则可以返回 以给定列为 key,记录对象为 value 的 map。我们不能将其配置成使用其中一个属性作为 key,而另外的属性作为 value。

四、缓存

mybatis对通过映射的select语句加载查询结果提供了内建的缓存支持。

默认情况下,开启一级缓存,即:如果你使用同一个sqlSession接口对象条用了同一个select语句,则直接从缓存中返回结构,不会再次查询数据库。

二级缓存,默认是关闭的,你可以通过在mapper映射文件中加入下面这一行来实现。

一个缓存的配置和缓存实例被绑定到映射器配置文件所在的名空间 (namespace)上,所以在相同名空间内的所有语

句被绑定到一个 cache 中。

<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
<!--
    一、eviction:定义缓存的移除机制,主要包括
    1、LUR(Least Recently used最近最少使用)
    2、FIFO(first in first out,先进先出)
    3、SOFT(software reference,软引用(不清楚什么玩意))
    4、WEAK(weak reference,弱引用,不知道什么鬼)
    二、flushInterval:缓存刷新间隔,以毫秒计。默认情况下不设置。所以不使用刷新间隔,缓存 cache 只
有调用语句的时候刷新。
    三、size:此表示缓存 cache 中能容纳的最大元素数。默认值是 1024,你可以设置成任意的正整数。
    四、readOnly:一个只读的缓存 cache 会对所有的调用者返回被缓存对象的同一个实例(实际返回的是被返回对
象的一份引用)。一个读/写缓存 cache 将会返回被返回对象的一分拷贝(通过序列化) 。默认情况下设
置为 false。可能的值有 false 和 true。
-->

mybatis-config.xml中配置的

<settings>
    <!-- 该配置影响的所有映射器中配置的缓存的全局开关。-->
    <setting name="cacheEnable" value="true"/>
</settings>
时间: 2024-10-11 22:22:20

mybatis的一些细节问题的相关文章

Maven搭建Mybatis+Spring+ehcache细节

1.创建Maven工程 1.1.Fill-->New Maven Project-->Next-->maven-archetype-webapp-->Next-->输入group id和artiface id点击finish完成,这里group id和artiface id就是标识项目唯一坐标的作用,这里不做介绍,然后把工程目录调整下,这样就是个标准的maven工程了.   1.2.编写pom文件,有了maven真的极大的方便了我们构建项目,这里maven帮我们把编写在pom

MyBatis1:MyBatis入门

MyBatis是什么 MyBatis是什么,MyBatis的jar包中有它的官方文档,文档是这么描述MyBatis的: MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of para

mybatis知识点总结和梳理

使用jdbc开发时,和mybatis相比的不足 1,数据库连接,使用时就创建,不使用就释放,对数据库进行频繁连接开关和关闭,造成数据库资源浪费,影响数据库的性能 解决:使用数据库连接池管理数据库的连接 2,sql语句使用硬编码在java程序中,修改sql语句,就需要重新编译java代码,不利于系统维护 解决:把sql语句放在xml配置文件中,修改sql语句也不需要重新编译java代码 3,向预编译语句PreparedStatement中设置参数,对占位符位置和设置参数值,硬编码,修改sql语句也

spring整合mybatis步骤分析

1.spring配置datasource bean的时候,不同的数据库连接方式有有不同的datasource实现类. 比如采用c3p0数据库连接池,要用c3p0的datasource实现类 com.mchange.v2.c3p0.ComboPooledDataSource <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name=&

mybatis 操作存储过程 小细节错误

项目开发的时候遇到一个错误: <span style="font-size:24px;">org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: java.sql.SQLException: ORA-06550: 第 8 行, 第 4 列: PLS-00103: 出现符号 ";"在需要下列之一时: . ( ) , * @ % & =

mybatis不可忽略的细节

自我总结,欢迎拍砖! 目的:在需要返回int,long等基础类型数据的情况下,尽量在mybatis的Mapper中用基础类型的包装类. 原因:当查询的字段为空值时,mybatis会返回null,用基础类型接收则会出现异常,但是用包装类就把这个问题规避了. 一.读数据环境准备: 创建student表(无主键): create table student(id int,name varchar(20),idCard bigint,classNo varchar(10)); insert into s

mybatis的一些小细节

Mybatis要解决的问题: 1. 将sql语句硬编码到java代码中,如果修改sql语句,需要修改java代码,重新编译.系统可维护性不高. 设想如何解决? 能否将sql单独配置在配置文件中. 2. 数据库连接频繁开启和释放,对数据库的资源是一种浪费. 设想如何解决? 使用数据库连接池管理数据库连接. 3. 向preparedStatement中占位符的位置设置参数时,存在硬编码(占位符的位置,设置的变量值) 设想如何解决? 能否也通过配置的方式,配置设置的参数,自动进行设置参数 4. 解析结

DAO层使用mybatis框架有关实体类的有趣细节

1.根据个人习惯,将储存那些数据库查询结果集有映射关系的JavaBean类的Package包名有如下格式: cn.bjut.domain cn.bjut.pojo cn.bjut.model ======================end 原文地址:https://www.cnblogs.com/MarlonKang/p/11617077.html

mybatis与hibernate的区别

本文转载自:http://blog.csdn.net/wangpeng047/article/details/17038659 以前没怎么用过mybatis,只知道与hibernate一样是个orm数据库框架.随着使用熟练度的增加,发现它与hibernate区别是非常大的,结合至今为止的经验,总结出以下几点: 1. hibernate是全自动,而mybatis是半自动. hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql