1.iBatis简介:iBatis是Apache的一个开源项目,一个O/R Mapping解决方案。
iBatis的最大特点就是小巧,上手很快。如果不需要太多复杂的功能,iBatis是能满足你的要求有足够灵活的最简单的解决方案。
2.搭建环境:
1)导入iBatis的jar包
2)导入iBatis的(JDBC的连接属性文件)
3)导入iBatis的总配置文件(相当与Hibernate中的hibernate.cfg.xml文件)
4)导入iBatis的实体映射文件(相当于Hibernate中的ClassName.hbm.xml文件)
3.测试举例:一个简单的iBatis的Java应用项目
1)导入iBatis的jar包文件到项目
2)创建*.properties类型的JDBC连接属性文件,名字可以自行修改,一般放入到项目中的src目录(方便在程序中获得),内容如下:
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
username=scott
password=tiger
说明:该文件的内容就是指定JDBC连接数据库的一些参数,该文件会在iBatis的"配置文件"中引用;其中键值的键名可以自定义。
3)创建SqlMapConfig.xml配置文件(iBatis的配置文件),名字可以修改,一般放入项目的src目录,内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<sqlMapConfig>
<!-- 指定JDBC连接属性文件,准备使用,且地址为"包名.文件名" -->
<properties resource="com/*.properties" />
<!-- 使用JDBC类型的事务进行处理,iBatis的事务也是和JDBC一样,自动就是启动的,而Hibernate需要我们手动开启事务 -->
<transactionManager type="JDBC">
<!-- 配置数据源 -->
<dataSource type="SIMPLE">
<!-- 读取*.properties文件中指定键名对应的键值,使用EL "${}" 表达式进行取值 -->
<property name="JDBC.Driver" value="${driver}">
<property name="JDBC.ConnectionURL" value="${url}">
<property name="JDBC.Username" value="${username}">
<property name="JDBC.Password" value="${password}">
</dataSource>
</transactionManager>
<!-- 指定映射文件,映射文件要对应实体对象类,且此处指定映射文件的地址 -->
<sqlMap resource="com/pojo/实体类名.xml">
</sqlMapConfig>
4)创建"类名.xml"映射文件,文件名可以自行修改,只要在配置文件指定好即可。一般会放到src目录。内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<sqlMap namespace="Account">
<!-- 为对应的类指定一个别名,方便在该文件中使用 -->
<typeAlias alias="类别名" type="类全名"/>
<!-- 配置表中的列字段和对象中的属性的映射,只指返回结果中需要返回的字段与属性的映射,<resultMap>可以有多个 -->
<resultMap id="标识名称" class="对应类名(可以使用上边的别名)">
<result property="类中属性名" column="字段名"/>
。。。
</resultMap>
<!-- 配置sql语句,可以有CRUD各个配置,具体看文档 -->
<select id="标识(程序中可以通过该参数得到sql语句)" resultMap="指定<resultMap>的id值,表示该sql中查询或者删除对应的字段和<resultMap>指定的对应">
select * from 表名
</select>
<select id="标识" resultClass="指定类名,说明这个查询结果集中的每个结果对象使用指定的类来封装">
select * from 表名
</select>
说明:不指定<select>的resultMap属性的话,要指定resultClass属性,值为该<select>查询结果集使用的封装类的类名(如果正好是本类的话可以使用<typeAlias>指定的别名),就会对对象中所有的属性和对应字段进行映射并进行搜索。
其实<resultMap>元素配置的功能就相当于"select id,name from 表名"中的id,name字段,使用来限制查询哪个字段。犹如insert into 表(id,name) values(1,"user");中"表"后面括号中的限定一样。
</sqlMap>
5)创建对应"映射文件"的实体类,例如Student类
public class Student{
private int id;
private String name;
private String age;
生成setter和getter方法
}
注意:一定要有缺省的构造方法,因为使用的是反射机制进行创建实例对象。
6)运行iBatis框架,其实就是在程序中加载iBatis的配置文件,然后使用iBatis提供的API进行数据库的操作。
*分析:其实只加载配置文件就可以了,因为配置文件可以找到属性文件和映射文件,所以可以进而全部加载到程序内存。
*运行iBatis的代码:一般程序中只运行一次,所以一般用static修饰。类似Hibernate的运行。
//加载iBatis的配置文件到Reader流对象中,传入参数仍然为配置文件在src中的位置(包括包名)
Reader reader = com.ibatis.common.resources.Resources.getResourceAsReader("com/SqlMapConfig.xml");
//使用iBatis框架提供的SqlMapClient类对包含配置文件的流对象进行封装,以方便使用
SqlMapClient sqlMapClient = com.itatis.sqlmap.client.SqlMapClientBuilder.buildSqlMapClient(reader);
//关闭流对象
reader.close();
说明:上面三行代码一般放入static静态代码块。
7)使用iBatis提供的API对数据库进行操作:可以创建自己的DAO类,然后在实现类中的方法中使用如下代码即可查询等操作。
//执行指定的sql语句,并且返回结果集
List list = sqlMapClient.queryForList("传入映射文件中<select>等sql配置元素的id值,表示使用这些sql");
3.指定查询条件的查询:上边例子中查询的是指定对象(表)的所有记录,现在要做的操作是"根据指定的查询条件进行查询"。
*解决方案:<select id="selectObjectById" resultClass="类名" parameterClass="java.lang.Integer">select * from 表名 where id = #id# </select>
*说明:其中parameterClass属性指定<select>包含的sql语句中的参数(在##两符号之间的为参数,程序中要传入为其赋值)的类型。
其中"##"中的"id"可以换成任何字符。
*注意:parameterClass属性的值不区分大小写,因为指定的是类名,所以一般大写开头会比较易懂。
一个<select>中只能由一个parameterClass属性,即只能指定一个参数类型。
*代码实现:就是在DAO的实现类中的查询方法中加入如下代码就可以实现根据编号ID进行查找指定的对象。
//根据ID编号查询Student对象
Student student = (Student)sqlMapClient.queryForObject("selectObjectById", id); //id就是传入参数值,即为映射文件中<select>包含的sql语句中的参数赋值。
4.插入一条记录到数据库:在映射文件中使用<insert>元素。
*格式:<insert id="insertObject" parameterClass="Student">insert into Student(id,name,age) values(#id#,#name#,#age#)</insert>
*说明:parameterClass属性指定的是一个对象类名(别名),就是说插入的对象的类型,而"##"之间使用的并不是一个对象,而是对象中的属性,
也就是说在为"#id#"赋值时会调用传入的值对象的getId()方法(student.getId()),以确保赋值正常。
*注意:因为"#id#"标识student.getId(),所以"##"之间的内容必须是对象的属性。
而<select>或<delete>中的"##"之间的内容不是这种机制,所以可以改变"##"之间的内容。
*代码实现:创建一个Student对象,然后调用iBatis的API插入对象到数据库。
Student student = new Student();
student.setId(1);
student.setName("lj");
student.setAge(24);
//第一个参数为<insert>的标识id值,第二个参数为插入到数据库中的对象
sqlMapClient.insert("insertObject", student);
5.删除一条记录从数据库:使用<delete>元素标签实现。
*格式:<delete id="deleteObject" parameterClass="int">delete from Student where id = #id# </delete>
*说明:同<select>中配置的基本一样。其中"##"中的"id"可以换成任何字符。
*代码实现:删除一条记录。
int flag = sqlMapClient.delete("deleteObject", id); //返回的整型值是影响的数据库表行数,类似JDBC中的操作
6.修改实体对象:使用<update>元素标签实现。
*格式:<update id="updateObject" parameterClass="Student">update Student set name = #name#, age = #age# where id = #id# </update>
*说明:parameterClass属性指定的仍然是对象的类名,同<insert>的解释同理。
*代码实现:修改一条记录。
Student student = new Student();
student.setId(1);
student.setName("lj_lj"); //修改
student.setAge(2424); //修改
//修改记录
int flag = sqlMapClient.update("updateObject", student); //返回值为影响行数,同JDBC同理
7.模糊查询:使用<select>标签,共有两种解决方案。
*格式:
<select id="queryLike" parameterClass="String" resultClass="Student">
select * from Student where name like '%$name$%'
</select>
说明:基本和上边使用的一样,只不过读取参数的方法,如果不放在单引号(双引号)里边就用"##"包含,如果在单引号(双引号)中就用"$$"来包含。
*代码实现:
List list = sqlMapClient.queryForList("queryLike", name);
*结果:这样就可以实现模糊查询了。
**另一种解决方案:可以将select * from Student where name like '%$name$%'改成select * from Student where name like '$name$',然后在程序代码中为参数赋值的时候,让变量的前后加上百分号"%"就可以了,
如,List list = sqlMapClient.queryForList("queryLike", "%" + name + "%");这样也可以实现模糊查询。