当前位置: 首页 > 工具软件 > iBATIS > 使用案例 >

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

益银龙
2023-12-01

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/

 类似资料: