您的位置:首页 > 其它

iBATIS学习01:iBATIS概览+iBATIS十分钟快速上手操练

2016-05-12 11:06 501 查看

iBATIS概览+iBATIS十分钟快速上手操练

【iBATIS概览】

iBATIS是一个持久框架,可用来配置 Java 类的属性和 RDBMS 内的表列之间的映射。在配置时,此框架负责处理 JDBC 连接和分配。可以使用 XML 文件配置 iBATIS。

iBATIS 主要的设计目的是为了让我们执行 SQL 时对输入输出的数据管理更加方便,所以如何方便的让我们写出 SQL 和方便的获取 SQL 的执行结果才是 iBATIS 的核心竞争力。

iBATIS 通过 SQL Map 将 Java 对象两者结合映射成 一条SQL 语句,反过来也可将结果集转化成 Java 对象,与其他 ORM 框架相比,它不但解决了 Java 对象与输入参数的映射、java对象和结果集的映射,而且还让用户方便的手写使用 SQL 语句。

在iBATIS中,SqlMapSession 负责创建数据库的连接(即要想获得Connection,得先取得SqlMapSession对象),包括对事务的管理(SqlMapSession中已经设置了事务管理器)(图示),iBATIS
对管理事务既可以自己管理也可以由外部管理,iBATIS 自己管理是通过共享 SqlMapSession 对象实现的,多个 Statement 的执行时共享一个 SqlMapSession 实例,而且都是线程安全的。如果是外部程序管理就要自己控制 SqlMapSession 对象的生命周期。

iBATIS中关于sql语句说明:

1:iBATIS 会把 SqlMap 配置文件解析成一个个 Statement,其中每一个Statement包括 ParameterMap、ResultMap,以及解析后的 SQL对象。

2:ibatis 中的sql语句和标准的 SQL 语句不同的是,参数的赋值是“#“包裹的变量名。如何解析这个变量就是 iBATIS 要完成的工作。当然 SQL 的表达形式还有很多其他的形式如动态 SQL 等。iBATIS 会根据“#”分隔符取出合法的变量名并依此来构建参数对象数组,数组的顺序就是 SQL 中变量出现的顺序。

iBATIS的数据映射流程:

1:组合运行时SQL语句的流程

a) 当 iBATIS 构建好 RequestScope 执行环境后,根据Statement中的SQL语句,解析出其中参数,并按参数出现的顺序保存在ParameterMap对象中。接着 iBATIS 会根据SQL中的变量和 parameterClass 指定的类型创建合适的 DataExchange 和 parameterPlan 对象。parameterPlan
对象中按照前面的顺序保存了变量的 setter 和 getter 方法列表。

b) 用合适的数据交换类DataExchange,用它来根据前面解析的ParameterMap,用ParameterPlan中的getter方法利用反射获取传递过来的JAVA对象的相应属性值组装成参数实参数组,这个数组的顺序就是对应于 SQL 中参数的顺序。

c) 根据返回的实参数组调用对应的类型处理器(TypeHandler)用返回的实参数组来调用 preparedStatement.setXXX(i, parameter) 提交参数到PrepareStatement对象,并执行该preparedStatement语句。

2:结果集转换成JAVA对象的流程

a) 根据ResquestScope对象获取执行结果ResultMap对象。

b) 根据目标JAVA对象获取其所有可写的属性数组(含有setter方法的),然后根据返回的ResultSet中的列名和获取到的属性数组做一个匹配,形成一个映射列表resultMappingList。

c) 选择 DataExchange 类型、AccessPlan 类型为后面的真正的数据交换提供支持。

d) 根据resultMappingList中每个属性的值选择合适的类型处理器(TypeHandler),并调用该处理器到ResultSet中获取到对应的结果值。处理完resultMappingList后,相应的结果值保存在一个columnValues数组中,这个数组的顺序就是 SQL 中对应列名的顺序。

e) 通过DataExchange来调用AccessPlan中对应字段的setter方法利用反射将属性值设置到JAVA对象的相应属性中。并返回java对象。

总体来说 iBATIS 的系统结构还是比较简单的,它主要完成两件事情:

a) 根据 JDBC 规范建立与数据库的连接

b) 通过反射打通 Java 对象与数据库参数交互之间相互转化关系

【iBATIS十分钟快速上手教程】

1:准备ibatis环境

搭建环境:导入相关包:(数据库的驱动包,ibatis的包)

ibatis相关包:ibatis.jar

配置文件

jdbc连接属性文件(文本文件)

包含driver,url,username,password四项内容即可

iBATIS的总配置文件(xml文件:一般文件名约定为SqlMapConfig.xml)

<sqlMapConfig>

<properties resource="前面配置的数据库文件地址"/>

<transactionMamager type="JDBC">

<dataSource type="SIMPLE">

<property value="${driver}" name="JDBC.Driver">

...

</dataSource>

</transactionMamager>

<sqlMap resource="Student.xml"/>

...

</sqlMapConfig>

每个实体的映射(map)文件(XML文件):映射实体和数据库表,对应实体的sql语句可以写在这个配置文件的<sqlMap>标签中。区别于Hibernate的配置文件,里面没有字段映射,因为ibatis是基于sql语句的。

程序中读取配置文件方式

Reader reader = com.ibatis.common.resources.Resources.getResourceAsReader("ibatis的总配置文件");

private static SqlMapClient sqlMapClient = com .ibatis.sqlmap.client.SqlClientBuilder.buildSqlMapClient(reader);

reader.close();

ibatis中的CRUD操作可以借助于SqlMapClient的queryForObject、queryForList、insert、delete、update等方法实现,这些方法通过传入sql语句的id值来调用写在配置文件中的sql语句完成操作。

2:查询所有对象(用select标签,用sqlMapClient的queryForList方法)

typealias:[注意:定义了别名之后,后面在标签中就可以直接使用别名了。]

<typealias alias="Student" type="package1.package2.Student">

select:

<select id="sql语句id" resultClass="返回类型[如果是集合就是集合元素的类型]" parameterClass="参数类型">

sql语句

</select>

e.g: <select id="selectAllStudents" resultClass="Student">

select * from Student

</select>

3:查询指定id的对象(用select标签,用sqlMapClient的queryForObject方法)

e.g:<select id="selectStudent" resultClass="Student" parameterClass="int">

select * from student where sid=#sid# (#夹在中间表示占位符)

</select>

4:插入一个实体对象(用insert标签,用sqlMapClient的insert方法)

e.g:<insert id="insertStudent" parameterClass="Student">

insert into Student(id,name) values (#id#,#name# [注意:顺序必须和前面对应,且必须和对象的属性字段的get方法对应,而且是赋给前面对应的位置的变量。])

</insert>

5:删除指定ID的对象(用delete标签,用sqlMapClient的delete方法)

e.g:<delete id="deleteStudent" parameterClass="int">

delete from student where id=#id# [注意:此时的#id#中的id仅仅是占位符,可以随便写比如#sid#]

</delete>

6:修改实体对象(用update标签,用sqlMapClient的update方法)[默认修改除了主键之外的所有字段都会更改,和hibernate一样。]

e.g:<update id="updateStudent" parameterClass="Student[此处不区分大小写]">

update student set name = #name# where id=#id#

</update>

7:模糊查询实体(用select标签,用sqlMapClient的select方法)

[注意:ibatis中的是sql语句,语句指向表名而不是类名,区别于Hibernate中的hql。]

e.g:<select id="selectStudentByName" parameterClass="String" resultClass="Student">

select id ,name where name like '%$name$%' [注意:模糊查询用的$符号!]

</select>

8:主键生成

e.g:MySql会自增

e.g:Oracle

<insert id="insertStudentBySequence" parameterClass="Student">

<selectKey resultClass="int" keyProperty="id[注意:赋给对象的那个字段]">

select 序列.nextVal from 虚表

</selectKey>

insert into Student(id,name) values (#id#,#name#)

</insert>

[注意:ibatis会调用类的无参构造方法,所以,对JavaBean的最优实践就是都添加一个无参构造方法]

9:ibatis优缺点总结

优点

简单

减少代码量

是对JDBC的包装,无需自己开启事务等

架构级性能增强

sql语句与程序代码分离

简化项目分工

增强了移植性

缺点:

Sql语句自己写

调用的时候,参数数量只能一个。

参考资料::https://www.ibm.com/developerworks/cn/java/j-lo-ibatis-principle/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: