Ibatis是apache的一个开源项目,2010年这个项目有apache software foundation迁移到了google code 并且改名为mybatis;Ibatis是一个O/R Mapping(Object Relational Mapping)的解决方案;
Ibatis实现sql Maps和Data Access Object(Dao);
Ibatis的特点是小巧,简单。但是对sql的要求比较高,不像hibernate可以自动生成sql
应用Ibatis的步骤:
1.建立一个java工程;
2.先一个lib文件,导入Ibatis、数据库驱动、数据库连接池的jar。导入相应的配置文件SqlMapCOnfig.xml(放在src下),导入XXX.xml(放在po类的包下,XXX对应的是相应的类的名字,用于写sql语句的配置文件)
--------1)在SqlMapConfig.xml配置文件中配置事物管理数据源(整合了spring后可以讲与数据库的连接配置在applicationContext.xml中)
<sqlMapConfig>
<transactionManagertype="JDBC"commitRequired="false">
<dataSourcetype="SIMPLE">//
<propertyname="JDBC.Driver"value="com.mysql.jdbc.Driver"/>
<propertyname="JDBC.ConnectionURL"value="jdbc:mysql://127.0.0.1/struts2"/>
<propertyname="JDBC.Username"value="root"/>
<propertyname="JDBC.Password"value="root"/>
</dataSource>
</transactionManager>
<!--配置文件中必须包含一个以上的sqlMap -->
<sqlMapresource="com/puckasoft/po/User.xml"/>
</sqlMapConfig>
3.写测试类测试数据源是否配置成功
publicclass TestSqlMapConfig {
@Test
publicvoid test1()throws Exception {
String configLocation = "SqlMapConfig.xml";
SqlMapClient client = null;
Reader reader = null;
try {
reader = Resources.getResourceAsReader(configLocation);
client = SqlMapClientBuilder.buildSqlMapClient(reader);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader !=null)
reader.close();
}
}
}
将这个测试类封装起来放在util包下命名为IbatisUtil
publicclass IBatisUtil {
publicstaticfinal StringCONFIG_LOCATION ="SqlMapConfig.xml";
privatestatic SqlMapClientsqlMapClient =null;
static {
Reader reader = null;
try {
reader = Resources.getResourceAsReader(CONFIG_LOCATION);
sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
} catch (IOException e) {
thrownew ExceptionInInitializerError();
} finally {
try {
if (reader !=null)
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
publicstatic SqlMapClient getSqlMapClient() {
returnsqlMapClient;
}
}
5.使用Ibatis在相应的*.xml文件中写sql局域并建立Dao进行测试;
!1)插入写法:<insert> int insert(String id, Object parameterObject)
<insert id = "saveDeptDaoSql" parameterClass= “com.puck.po.Dept”>
insert into dept(dname,loc) values(#dname#,#loc#);
</insert>
(注解:
(1.)id是为sql语句起的一个代号,唯一标识。
(2).在Dao中调用方法传参数的时候会用到,注意保持一致。
(3) #dname# 代表的是hibernate语句中的?号。
(4)在相应的Dao方法中实现IDao方法时,当插入2个或者2个以上的字段时,则参数配置成相应的类类型。
)
!2)更新语句<update> int update(String id Object parameterObject)
<update id = "updateDeptDaoSql" paramterClass = "com.puck.po.Dept">
update dept set dname = #dname#,loc = #loc#,where deptno = #deptno#
</update>
!3)查询语句<select> List queryForList(String id,Object parameterObject)
<select id = "findDepDapSql" paramterClass = "int " resultClass = "com.puck.po.Dept">
select dname from deptno = #deptno#
</select>
<注解:resultClass属性是用来指明返回值的类型(全称)>
!4).Ibatis的高级查询:
【1】模糊查询 public List<Emp> findEmpsByEname(String ename);
<select id="findEmpsByEnameSql" parameterClass="java.lang.String" resultClass="com.puckasoft.po.Emp">
select * from emp where ename like '$abc$'
</select>
【注解:(1)当参数类型为String类型是 必须写全称即java.lang.String .(2)返回值的类型是相应容器中存放的元素的类型.(3)当模糊查询时,如上示例,查询名字中包含XXX的所有员工,写法为'$XXX$' dao中写法如:sqlMapClient.queryForList("findEmpsByEnameSql", "%" + ename
+ "%");】
【2】多条件查询 public List<Emp> findEmps(Date beginDate,Date endDate,Float hisal,Float losal)
<select id="findEmpsSql" parameterClass="hashMap" resultClass="com.puckasoft.po.Emp" >
select * from emp where sal between #losal# and #hisal# and hiredate between #beginDate# and #endDate#
</select>
【注解:当查询的参数不全部是在一个类中是用hashMap(hashMap的昵称)表示返回值的类型,这里不能使用hashMap的全称,当然也可以利用这些字段自定义一个vo类,然后写该类的全称】
【3】分页查询 public List<Emp> findEmpsByPage(int firstResult,int maxResult);
<select id="findEmpsByPageSql" resultClass="com.puckasoft.po.Emp">
select * from emp
</select>
【注解:查询语句中出现在where部分的一般才算是参数,所以firstResult 和maxResult不算是参数 ,当然在属性里不用配置参数类型】
【4】返回Map public Map findEmpSals();
<select id="findEmpSalsSql" resultClass="hashMap">
select max(sal)as maxSal,min(sal) as minSal,avg(sal) as avgSal from emp
</select>
【注解:同上,当返回Map类型的值时不用Map的全称,而用hashMap这个昵称表示返回值的类型】
【5】返回List<Map> public List<Map> findHisalByDept();
<select id="findHisalByDeptSql" resultClass="hashMap">
select deptno,max(sal) as maxSal from emp group by deptno order by max(sal) desc
</select>
【注解:当然在此处返回值也是hashMap】
Ibatis和spring的集成
Spring为Ibatis提供的服务有
1.创建数据源
2.创建sqlMapClient
3.管理事务
4.创建单例的dao组件,注入Ibatis的sqlMapClient
具体如下:
1.导入spring的相关jar包
2.创建或拷贝配置文件log4j.properties、applicationcontext.xml
3将ibatis的数据源和事务交由spring管理
1:)移除sqlMapConfig.xml的数据源和事务配置信息
2)在applicationcontext.xml配置数据源、sqlmapclient、事务管理器、事务特性,事务切面
4.修改dao组件
1)移除dao中的单例代码,移除sqlmapclient的赋值代码,为sqlmapclients产生setter和getter方法
2)在applicationcntext.xml中位置dao组件