1.Ibatis的作用
这个框架功能同Hibernate,同样是ORM(Object-Relation Mapping,对象关系映射),把数据库中的表映射成类,然后对类进行操作,但与Hibernate不同的地方在于:Ibatis是半自动,要执行的SQL我们手动写成XML文件;而Hibernate是全自动。里面里面已经封装了各种操作;
2.Ibatis的使用
目前的项目主要是采用Hibernate进行增、删、改;因为Hibernate这方面做得很好。至于查询方面就采用Ibatis,这样以后要优化SQL语句也就方便,可以做到一改全改;
3.举例说明
3.1建立两个表(Tab1,Tab2),由于我们要测试有值为空的;左联接等操作,所以用下面的数据来举例子
create table tab1(userid number(4),username varchar2(10),birthday date);
create table tab2(userid number(4),usersex char(1));
insert into tab1 values(1,'wwz1',sysdate);
insert into tab1 values(2,'wwz2',sysdate);
insert into tab1 values(3,'wwz3',sysdate);
insert into tab1 values(4,'wwz4',sysdate);
insert into tab1(userid,username) values(5,'wwz5');
insert into tab2 values(1,'b');
insert into tab2 values(2,'b');
insert into tab2 values(3,'g');
insert into tab2 values(4,'b');
3.2建立两个Bean(com.wangwz.IbatisTest.Tab1Bean.java和com.wangwz.IbatisTest.Tab12Bean.java)
Tab1Bean有三个属性int userid;String username;Date birthday及其set和get方法
Tab12Bean有四个属性int userid;String username,Date birthday,String usersex及其set和get方法
3.3建立Ibatis的配置文件com/wangwz/IbatisTest/sqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" maxRequests="32" maxSessions="10" maxTransactions="5" useStatementNamespaces="false" />
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@127.0.0.1:1521:cnfol" />
<property name="JDBC.Username" value="cnfol" />
<property name="JDBC.Password" value="cnfol" />
</dataSource>
</transactionManager>
<sqlMap resource="com/wangwz/ibatisTest/Tab1.xml" /><!--包含了Tab1.xml文件-->
</sqlMapConfig>
3.4建立SQL的映射文件com/wangwz/ibatisTest/Tab1.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Tab1">
<select id="getTab1" parameterClass="java.lang.String" resultClass="com.wangwz.ibatisTest.Tab1Bean">
select * from Tab1 where username = #value#
</select>
<select id="getTab1List" resultClass="com.wangwz.ibatisTest.Tab1Bean">
select * from Tab1
</select>
<select id="getTab12List" resultClass="com.wangwz.ibatisTest.Tab12Bean">
select * from tab1 left join tab2 on tab1.userid=tab2.userid
</select>
</sqlMap>
3.5下载Ibatis包,把里面的Ibatis.jar拷贝到工程的lib下;
3.6写操作类com.wangwz.ibatisTest.DoSelect.java
public class DoSelect
{
public static void main(String[] args)
{
SqlMapClient sqlMapper;
Reader reader;
try
{
reader = Resources.getResourceAsReader("com/wangwz/ibatisTest/SqlMapConfig.xml");
sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
Tab1Bean tab1Bean = (Tab1Bean) sqlMapper.queryForObject("getTab1", "wwz1");
System.out.println(tab1Bean.getUserid());
System.out.println(tab1Bean.getUsername());
ArrayList<Tab1Bean> al = (ArrayList<Tab1Bean>) sqlMapper.queryForList("getTab1List");
for (int i = 0; i < al.size(); i++)
{
System.out.print(al.get(i).getUserid() + "/t");
System.out.print(al.get(i).getUsername() + "/t");
}
ArrayList<Tab12Bean> al2 = (ArrayList<Tab12Bean>) sqlMapper.queryForList("getTab12List");
for (int i = 0; i < al2.size(); i++)
{
System.out.print(al2.get(i).getUserid() + "/t");
System.out.print(al2.get(i).getUsername() + "/t");
System.out.print(al2.get(i).getBirthday() + "/t");
System.out.println(al2.get(i).getSex());
}
}
catch (IOException e)
{
e.printStackTrace();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
4.总结
使用Ibatis有一个我觉得不太方便的地方,就是传入的参数只能有一个,如果要传多个参数就得封装一个BEAN
5.补充
上面有两处绿色的字,在Tab1.xml中的绿色字是表示命名空间名称,当sqlMapConfig.xml里面的绿色字设置成true时,在程序中调用SQL语句前面就必须加上命名空间.才能访问;但Tab1.xml中的命名空间可以与文件名不同,即,命令空间可以取名为Tab2;
当Ibatis初始化Bean的时候,会自动调用无参的构造函数,所以我们写的Bean中如果有写带参的构造函数,一定得多写个无参的构造函数,否则Ibatis会找因找不到构造函数而出错;报的错如下:JavaBeansDataExchange could not instantiate result class