1.MyBatis介绍
MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以对配置和原生Map使用简单的XML或注解,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
MyBatis的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的XML文件就显得相对简单。如果拿它跟具有相同功能的JDBC代码进行对比,你会立即发现省掉了将近95%的代码。MyBatis就是针对SQL构建的,并且比普通的方法做的更好。
SQL映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):
·cache–给定命名空间的缓存配置。
·cache-ref–其他命名空间缓存配置的引用。
·resultMap–是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
·parameterMap–已废弃!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除,这里不会记录。
·sql–可被其他语句引用的可重用语句块。
·insert–映射插入语句
·update–映射更新语句
·delete–映射删除语句
·select–映射查询语句
2.存储过程和POJO类
在数据库中有两个存储过程,一个用来插入并放回插入结果,另一个用来查询返回游标。数据库系统为Oracle 10g。
create or replace procedure sp_order_insert(p_orderid in out number,
p_useridin out varchar2,
p_namein out varchar2,
p_content in out varchar2,
p_amountin out number ,
p_photo in blob
)is
这是第一个,用来执行插入操作。
create or replace procedure sp_order_select(p_typein varchar2,
p_max_id in number,
p_min_id in number,
p_photo_inin boolean,
c_cursor OUT SYS_REFCURSOR) is
这是第二个,用来执行查询操作的,我没有用定制化的SQL来操作。
在POJO中定义的类中,涉及到数字、字符和图片。在POJO中图片我用的byte[]保存,而在数据库中用的是Blob。这里先说明一下。
public class Order {
private static final long serialVersionUID= 1L;
private long orderid= 0;
private User user=new User();
private String type= "";
private Integer status= 0;
private String name= "";
private String content= "";
private byte[] photo = new byte[0];
3.映射器的XML文件
关于XML文件的映射说明,在官方文档http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#
中,您可以去仔细阅读。这里要介绍的是我阅读理解这些文字和实际操作过程中的经验总结。
我用到一个SELECT语句去实现上述两个存储过程的调用操作。这两个过程,几乎可以涵盖一般项目的所有需求。
这里声明一下,我之前没接触过MyBatis,甚至Spring,JAVA也是N多年前学习过一段时间,应该不超过6个月。
在理清楚了Spring和MyBatis的结构以后,就开始配置映射器的XML文件。
我从google里,找了很多文档,夹杂各种版本的配置,不同项目的只言片语。终于搞出来一个能用的版本。
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
{call sp_order_insert(?,?,?)}
call sp_order_select(#{type ,jdbcType=VARCHAR ,mode=IN},
#{maxOrderid , jdbcType=BIGINT,mode=IN},
#{minOrderid , jdbcType=BIGINT,mode=IN},
false,
#{selectedRows, mode=OUT,jdbcType=CURSOR, javaType=ResultSet, resultMap=orderResultMap})
select orderid, userid, name from t_order_info
select orderid, photo fromt_order_info where orderid=#{orderid}
但是,这个版本对于图片的操作没有设置,更重要的一点是parameterMap元素MyBatis 3中已经废弃了,所以需要做一个适配MyBatis 3的修改。
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
{call sp_order_insert(
#{orderid,jdbcType=BIGINT,javaType=long ,mode=INOUT},
#{user.userid ,jdbcType=VARCHAR ,javaType=string,mode=INOUT},
#{name ,jdbcType=VARCHAR,javaType=string,mode=INOUT},
#{content,jdbcType=VARCHAR,javaType=string ,mode=INOUT},
#{amount,jdbcType=DOUBLE,javaType=double ,mode=INOUT},
#{photo ,jdbcType=BINARY, javaType=[B,mode=IN}
)}
call sp_order_select(#{type ,jdbcType=VARCHAR ,mode=IN},
#{maxOrderid , jdbcType=BIGINT,mode=IN},
#{minOrderid , jdbcType=BIGINT,mode=IN},
false,
#{selectedRows, mode=OUT,jdbcType=CURSOR, javaType=ResultSet, resultMap=orderResultMap})
select orderid, userid, name fromt_order_info
select orderid, photo fromt_order_info where orderid=#{orderid}
这里涉及了一个数据库层是BLOB,而JAVA类中byte[],MyBatis 3在配置映射器XML文件时如何操作的问题。
在存储过程调用时,参数配置是这样的。
#{photo ,jdbcType=BINARY,javaType=[B,mode=IN}
这属于将JAVA对象转成jdbc对象,用于插入数据库。
在定义结果集时, 又是这样设置的。
属于将数据库返回结果集,即JDGC的结果集转换成JAVA类中的类型。
由于是新手,对应这种映射关系和处理方式很陌生。在javaType和jdbcType之间搞的很混乱。这些都是个人理解。
4.小结
XML配置起来操作数据库,确实很强大。
在MyBatis3中,调用有插入和返回的Oracle存储过程,调用有游标返回的Oracle存储过程,涉及到BLOB字段和JAVA byte[]的相互转化操作,不用另外定义typehandler处理这种两个之间的转换。(嗯,主要是我不会这个)。
这是一个只有6个月JAVA经验,对MyBatis一无所知的新手的项目笔记。