ibatis in Spring 实战

本文详细介绍Ibatis框架的整合过程及具体应用实践,包括数据库表的创建、日志配置、POJO定义、映射文件编写、配置文件设置等关键步骤,并提供了一个完整的测试案例。

1 创建数据库
创建测试数据库,并在数据库中创建一个user 表,其中包含三个字段:
Ø id(int)
Ø name(varchar)
Ø sex(int)。
2 log日志
ibatis 采用Apache common_logging,并结合Apache log4j 作为日志输出组件。在
CLASSPATH 中新建log4j.properties配置文件

 

log4j.properties
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%c{1} - %m%n
log4j.logger.java.sql.PreparedStatement=DEBUG

3 POJO(Plain Ordinary Java Object)
User.java

 

public class User {
public Integer id;
public String username;
public String password;
public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

}

4 ibatis 的映射文件
User.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="User">
<typeAlias alias="user" type="test.ibatis.com.User" />
<insert id="insertUser" parameterClass="user">
INSERT INTO users ( username, password) VALUES (
#username#,#password# )
</insert>
<select id="getUsers" resultClass="user">
<![CDATA[
select * from users
]]>
<dynamic prepend="WHERE">
<isNotEmpty prepend="AND" property="user.username">
(username like #user.username#)
</isNotEmpty>
<isNotEmpty prepend="AND" property="user.password">
(password like #user.password#)
</isNotEmpty>
</dynamic>
<isNotEmpty property="orderBy">$orderBy$</isNotEmpty>
</select>
<select id="getUser" resultClass="user" parameterClass="user">
select * from users
<dynamic prepend="WHERE">
<isNotEmpty prepend="AND" property="username">
(username like #username#)
</isNotEmpty>
<isNotEmpty prepend="AND" property="password">
(password like #password#)
</isNotEmpty>
<isNotEmpty prepend="AND" property="id">
(id = #id#)
</isNotEmpty>
</dynamic>
</select>
</sqlMap>

5 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>
<sqlMap resource="test/ibatis/com/User.xml" />
</sqlMapConfig>

6 Ibatis-Context.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy
-method="close">
<property name="driverClassName">
<value>org.gjt.mm.mysql.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/test</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value></value>
</property>
</bean>
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>SqlMapConfig.xml</value>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>
<bean id="userDAO" class="test.ibatis.com.UserDAO">
<property name="dataSource">
<ref local="dataSource" />
</property>
<property name="sqlMapClient">
<ref local="sqlMapClient" />
</property>
</bean>
<bean id="userDAOProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="userDAO" />
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
</beans>

可以看到:
1. sqlMapClient节点
sqlMapClient节点实际上配置了一个sqlMapClient的创建工厂类。
configLocation属性配置了ibatis映射文件的名称。
2. transactionManager节点
transactionManager采用了Spring中的DataSourceTransactionManager。
3.UserDAO节点 对应的,UserDAO需要配置两个属性,sqlMapClient和DataSource,sqlMapClient将从指
定的DataSource中获取数据库连接。
7 Aao接口

IuserDAO.java

 

package test.ibatis.com;
import java.util.List;
import java.util.Map;
public interface IUserDAO {
public void insertUser(User user);
public List queryForList(Map map);
public User queryForUser(User user);
}

8 Aao实现
UserDAO.java

 

package test.ibatis.com;
import java.util.List;
import java.util.Map;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
public class UserDAO extends SqlMapClientDaoSupport implements IUserDAO {
//数据入操作(insert, update, delete):
public void insertUser(User user) {
getSqlMapClientTemplate().insert(
"insertUser", user);
}

//执行批量 (select)
public List queryForList(Map map) {
return getSqlMapClientTemplate().queryForList("getUsers", map,2,4);
//return getSqlMapClientTemplate().queryForList("getUsers", map);
}

public User queryForUser(User user) {
//在指定象中存放果(select)
return (User)getSqlMapClientTemplate().queryForObject("getUser",
user, user);
// return (User)getSqlMapClientTemplate().queryForObject("getUser",
user);
}

}

SqlMapClientDaoSupport(如果使用ibatis 1.x版本,对应支持类是
SqlMapDaoSupport)是Spring中面向ibatis的辅助类,它负责调度DataSource、
SqlMapClientTemplate(对应ibatis 1.x版本是SqlMapTemplate)完成ibatis操作,
而DAO则通过对此类进行扩展获得上述功能。上面配置文件中针对UserDAO的属性设
置部分,其中的属性也是继承自于这个基类。
SqlMapClientTemplate对传统SqlMapClient调用模式进行了封装,简化了上层访问
代码。
9 测试代码TestMain
TestMain .jav a

 

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import test.ibatis.com.IUserDAO;
import test.ibatis.com.User;
public class TestMain {
public static final Log log = LogFactory.getLog(TestMain.class);
public static void main(String[] args) {
ClassPathResource resource 
= new ClassPathResource("Ibatis-
Context.xml");
BeanFactory factory = new XmlBeanFactory(resource);
IUserDAO userdao 
= (IUserDAO) factory.getBean("userDAOProxy");
User user 
= new User();
user.setUsername(
"Sofia");
user.setPassword(
"mypass");
//数据入操作(insert, update, delete):
userdao.insertUser(user);
Map map
=new HashMap();
map.put(
"user", user);
map.put(
"orderBy""order by id desc");
//数据 (select)
List list=userdao.queryForList(map);
log.debug(StringUtils.repeat(
"*"20));
log.debug(list.size());
log.debug(StringUtils.repeat(
"*"20));
for(int i=0;i<list.size();i++){
User user01 
= (User)list.get(i);
log.debug(user01.getUsername());
}

Integer key 
= new Integer (1);
user.setId(
1);
User user02 
= userdao.queryForUser(user);
log.debug(user02.getUsername());
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值