MyBatis的其它方法
来源:互联网 发布:马赛克视频还原软件 编辑:程序博客网 时间:2024/05/22 07:04
除了前面介绍的数据库的简单应用之外,MyBatis还提供了多种的特性,这些都是非常有用的。如,以分页加载数据,储蓄或查看CLOB/BLOB类型的数据,和操作枚举类型的值等。让我们来看一下这些特性。
1. 操作枚举类型
MyBatis提供了使用枚举类型的应用。想像一下,现在STUDENTTS表中拥有一个性别的字段是gender,这个字段的值可是是MALE或FEMALE。所以STUDENT表中这个gender的字段就是枚举类型。
public enum Gender{FEMALE,MALE}
默认情况下,MyBatis会使用EnumTypeHandler的类去操作枚举的属性,和储蓄枚举的值。你不需要额外的配置,你只需要像下面的代码调用就行了。
public class Student{private Integer id;private String name;private String email;private PhoneNumber phone;private Address address;private Gender gender;//setters and getters}
<insert id="insertStudent" parameterType="Student"useGeneratedKeys="true" keyProperty="id">insert into students(name,email,addr_id, phone,gender)values(#{name},#{email},#{address.addrId},#{phone},#{gender})</insert>
当你在执行insertStudent的声明时,MyBatis将会把FEMALE或MALE的值填充到Grender中。如果你想要储蓄额外的信息,如0代表FEMALE,1代表MALE的话,那么你需要在mybatis-config.xml的文件中配置EnumOrdinalTypeHandler.
<typeHandlerhandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"javaType="com.owen.mybatis.domain.Gender"/>
2. 操作CLOB/BLOB类型
现在我们添加这样的一张储蓄图片的表,表中含有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;
这个图片可以是PNG、JPG等形式,这个表可以跟student和tutor相关联。
默认情况下,MyBatis映射CLOB类型是java.lang.String,而BLOB是byte[]。
public class UserPic{private int id;private String name;private byte[] pic;private String bio;//setters & getters}
创建UserPicMapper.xml文件和配置映射声明:
<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()方法展示了如何以String读取CLOB类型,和如何以byte[]读取BLOB类型。
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(newFile("C:\\Images\\UserImage_FromDB.jpg"));os.write(pic);os.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
3. 放入多个参数
MyBatis提供了另外一个方式来映射多个参数的声明。现在我们可以查找学习通过所给的name和email。
Public interface StudentMapper{List<Student> findAllStudentsByNameEmail(String name, Stringemail);}
MyBatis提供的多值映射参数,使用的是#{param}语法。
<select id="findAllStudentsByNameEmail" resultMap="StudentResult">select stud_id, name,email, phone from Studentswhere name=#{param1} and email=#{param2}</select>
这个#{param1}就是name,#{param2}就是email。
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);studentMapper.findAllStudentsByNameEmail(name, email);
4. 多个结果是Map形式
如果我们查询学生这张表,查询的结果是多行的,我们希望是可以以map的形式,也就是就key、value的形式来展现,那我们可以使用下面的方法。
<select id=" findAllStudents" resultMap="StudentResult">select * from Students</select>Map<Integer, Student> studentMap =sqlSession.selectMap("com.owen.mybatis.mappers.StudentMapper.findAllStudents", "studId");
上面的studentMap将会包含studId的key和Student对象。
5. 分页展现数据
有时候,我们的数据表中会有大量的数据,一张表中可能的万条数据,那我们我们不可能一次性全部加载到页面上显示。我们需要对数据进行分页显示。MyBatis就提供了Rowbounds来实现分页功能。RowBounds对象是有offset和limit的参数,offset是开始的位置,limit是每页面显示多少条。下面是每一页显示25条数据的例子。
<select id="findAllStudents" resultMap="StudentResult">select * from Students</select>
你可以加载第一页的数据是25条
<pre name="code" class="java">int offset =0 , limit =25;RowBounds rowBounds = new RowBounds(offset, limit);List<Student> = studentMapper.getStudents(rowBounds);
如果显示第二面,那么offset=25和limit=25;第三页是offset=50,limit=25.
6. 总结
通过页面的几个章节,我们学习了MyBatis的关系表之间的查询,还有就是Mybatis的动态语句的应用。相信通过这几个章节的学习,你对MyBatis有了进一步的认识。而这个新认识也是MyBatis中重要的部分。下一章节,我们将要学习如何通过注解来使用本章的功能。源码下载:https://github.com/owenwilliam/mybatis.com.git
- MyBatis的其它方法
- 传多个值到其它页面的方法
- 传多个值到其它页面的方法
- 09_Request的其它方法
- 四种启动其它程序的方法
- 引入其它html文件的方法
- 四种启动其它程序的方法
- 四种启动其它程序的方法
- 获取其它apk的资源方法
- 四种启动其它程序的方法
- tc中引用其它脚本的方法
- 数组元素的其它赋值方法
- 传多个值到其它页面的方法
- MFC启动其它应用程序的方法
- shell引入其它文件函数的方法
- SQL 关联其它服务器的方法OPENDATASOURCE
- Java8 Collectors其它一些方法的使用
- Mybatis 实现不确定修改几个字段的修改方法(动态语句set、if实现),避免修改时其它没被修改的字段变为null
- Java 多线程学习笔记(三)-守护线程
- APP登陆协议之Native层分析
- Android新浪微博开发(三)完结篇之调用新浪微博API实现信息展示
- 最长回文子串
- 3、区间重合判断
- MyBatis的其它方法
- Nginx学习历程_3_配置Nginx打开目录浏览功能
- Java 多线程学习笔记(四)yield 介绍
- sql语句学习
- Java 多线程学习笔记(五)synchronized 锁重入
- Javascript FileSystemObject 读取/创建本地文件及目录文件夹的方法
- TCP /IP 协议- 链路层
- 一些优秀博客收集
- Java 多线程学习笔记(六)synchronized 不具有继承性