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>

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

iBatis与MyBatis:你应该选择哪个?简介:随着Java语言的快速发展,许多持久化框架也应运而生。iBatis和MyBatis是两个备受欢迎的持久化框架,它们都提供了一种简单而高效的数据访问解决方案。本文将介绍iBatis和MyBatis的特点和优势,并给出一些具体的代码示例,帮助你选择合适的框架。iBatis简介:iBatis是一个开源的持久化框架

MyBatis动态SQL标签解读:Set标签用法详解MyBatis是一个优秀的持久层框架,它提供了丰富的动态SQL标签,可以灵活地构建数据库操作语句。其中,Set标签是用于生成UPDATE语句中SET子句的标签,在更新操作中非常常用。本文将详细解读MyBatis中Set标签的用法,以及通过具体的代码示例来演示其功能。什么是Set标签Set标签用于MyBati

MyBatis中实现批量删除语句的几种方式,需要具体代码示例近年来,由于数据量的不断增加,批量操作成为了数据库操作的一个重要环节之一。在实际开发中,我们经常需要批量删除数据库中的记录。本文将重点介绍在MyBatis中实现批量删除语句的几种方式,并提供相应的代码示例。使用foreach标签实现批量删除MyBatis提供了foreach标签,可以方便地遍历一个集

JPA和MyBatis:功能与性能对比分析引言:在Java开发中,持久化框架扮演着非常重要的角色。常见的持久化框架包括JPA(JavaPersistenceAPI)和MyBatis。本文将对这两个框架的功能和性能进行对比分析,并提供具体的代码示例。一、功能对比:JPA:JPA是JavaEE的一部分,提供了一种面向对象的数据持久化解决方案。它通过注解或X

MyBatis批量删除语句的使用方法详解,需要具体代码示例引言:MyBatis是一款优秀的持久层框架,提供了丰富的SQL操作功能。在实际项目开发中,经常会遇到需要批量删除数据的情况。本文将详细介绍MyBatis批量删除语句的使用方法,并附上具体的代码示例。使用场景:在数据库中删除大量数据时,逐条执行删除语句效率低下。此时,可以使用MyBatis的批量删除功能

MyBatis的缓存机制解析:一级缓存与二级缓存的区别与应用在MyBatis框架中,缓存是一个非常重要的特性,可以有效提升数据库操作的性能。其中,一级缓存和二级缓存是MyBatis中常用的两种缓存机制。本文将详细解析一级缓存与二级缓存的区别与应用,并提供具体的代码示例进行说明。一、一级缓存一级缓存也被称为本地缓存,它默认开启且不可关闭。一级缓存是SqlSes

MyBatisGenerator是MyBatis官方提供的一个代码生成工具,可以帮助开发人员快速生成符合数据库表结构的JavaBean、Mapper接口以及XML映射文件。在使用MyBatisGenerator进行代码生成的过程中,配置参数的设置是至关重要的。本文将从配置参数的角度出发,深入探讨MyBatisGenerator的

MyBatis一级缓存详解:如何提升数据访问效率?在开发过程中,高效的数据访问一直是程序员们关注的焦点之一。而对于MyBatis这样的持久层框架而言,缓存是提升数据访问效率的关键方法之一。MyBatis提供了一级缓存和二级缓存两种缓存机制,其中一级缓存是默认开启的。本文将详细介绍MyBatis一级缓存的机制,并提供具体的代码示例,帮助读者更好地理
