首先简历数据库demo(本文选mysql)
数据库脚本:
CREATE
TABLE
`ibatis` (
`id`
varchar
(
20
)
NOT
NULL
,
`name`
varchar
(
20
)
default
NULL
,
PRIMARY
KEY
(`id`)
) ENGINE
=
InnoDB
DEFAULT
CHARSET
=
gb2312;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
insert
into
ibatis
values
("
1
","
1
");
insert
into
ibatis
values
("
2
","
2
");
DAO接口:
package
ch10.SpringAndIbatis;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
import
java.util.List;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
public
interface
IDAO
{
public List getList();
public Ibatis getByName(String name);
public Ibatis getById(String id);
public void save(Ibatis ibatis);
public void delete(String id);
public void update(Ibatis ibatis);
}
Ibatis配置文件:
<?
xml version="1.0" encoding="UTF-8"
?>
<!
DOCTYPE sqlMapConfig
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-config-2.dtd"
>
<
sqlMapConfig
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<
sqlMap
resource
="ch10/SpringAndIbatis/Ibatis.xml"
/>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
</
sqlMapConfig
>
ibatis sql map文件ibatis.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
>
<
typeAlias
type
="ch10.SpringAndIbatis.Ibatis"
alias
="user"
/>
<
resultMap
id
="ibatisTest"
class
="user"
>
<
result
column
="id"
property
="id"
jdbcType
="VARCHAR"
/>
<
result
column
="name"
property
="name"
jdbcType
="VARCHAR"
/>
</
resultMap
>
<!--
获得全查询列表
-->
<
select
id
="getAllUsers"
resultMap
="ibatisTest"
>
select * from Ibatis
</
select
>
<!--
根据用户名获得用户对象
-->
<
select
id
="getUsersByName"
resultMap
="ibatisTest"
>
select * from Ibatis where name=#value#
</
select
>
<!--
根据id获得用户对象
-->
<
select
id
="getUsersById"
resultMap
="ibatisTest"
>
select * from Ibatis where id=#value#
</
select
>
<!--
新增用户对象
-->
<
insert
id
="insertUsers"
parameterClass
="user"
>
insert into ibatis (id,name) values (#id#,#name#)
</
insert
>
<!--
删除用户对象
-->
<
delete
id
="deleteUsers"
>
delete from ibatis where id=#value#
</
delete
>
<!--
更新用户对象
-->
<
delete
id
="updateUsers"
parameterClass
="user"
>
update ibatis set name=#name# where id=#id#
</
delete
>
</
sqlMap
>
spring配置文件
<?
xml version="1.0" encoding="UTF-8"
?>
<
beans
xmlns
="http://www.springframework.org/schema/beans"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<
bean
id
="dataSource"
class
="org.apache.commons.dbcp.BasicDataSource"
>
<
property
name
="driverClassName"
>
<
value
>
com.mysql.jdbc.Driver
</
value
>
</
property
>
<
property
name
="username"
>
<
value
>
root
</
value
>
</
property
>
<
property
name
="password"
>
<
value
>
1234
</
value
>
</
property
>
<
property
name
="url"
>
<
value
>
jdbc:mysql://localhost:3306/spring
</
value
>
</
property
>
</
bean
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<
bean
id
="sqlMapClient"
class
="org.springframework.orm.ibatis.SqlMapClientFactoryBean"
>
<!--
此处应注入ibatis配置文件,而非sqlMap文件,否则会出现“there is no statement.....异常”
-->
<
property
name
="configLocation"
>
<
value
>
ch10/SpringAndIbatis/sqlMapConfig.xml
</
value
>
</
property
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
</
bean
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<
bean
id
="testDAO"
class
="ch10.SpringAndIbatis.TestDAO"
>
<
property
name
="dataSource"
>
<
ref
bean
="dataSource"
/>
</
property
>
<
property
name
="sqlMapClient"
>
<
ref
bean
="sqlMapClient"
/>
</
property
>
</
bean
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
</
beans
>
DAO实现类:
package
ch10.SpringAndIbatis;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
import
java.util.List;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
import
org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
public
class
TestDAO
extends
SqlMapClientDaoSupport
implements
IDAO
{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public void delete(String id) {
getSqlMapClientTemplate().delete("deleteUsers", id);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public Ibatis getById(String id) {
return (Ibatis)getSqlMapClientTemplate().queryForObject("getUsersById",id);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public Ibatis getByName(String name) {
return (Ibatis)getSqlMapClientTemplate().queryForObject("getUsersByName",name);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public List getList() {
return getSqlMapClientTemplate().queryForList("getAllUsers",null);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public void save(Ibatis ibatis) {
getSqlMapClientTemplate().insert("insertUsers",ibatis);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public void update(Ibatis ibatis) {
getSqlMapClientTemplate().update("updateUsers", ibatis);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
domain对象
package
ch10.SpringAndIbatis;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
public
class
Ibatis
{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Ibatis(){
}
public Ibatis(String id, String name) {
super();
this.id = id;
this.name = name;
}
}
测试代码:
package
ch10.SpringAndIbatis;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
import
java.util.ArrayList;
import
java.util.Iterator;
import
java.util.List;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
import
org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
public
class
Test
{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("ch10/SpringAndIbatis/applicationContext.xml");
TestDAO testDAOImpl=(TestDAO)context.getBean("testDAO");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//获得全查询列表
System.out.println("获得全查询列表");
List result=new ArrayList();
result=testDAOImpl.getList();
for (Iterator iter = result.iterator(); iter.hasNext();) {
Ibatis element = (Ibatis) iter.next();
System.out.println(element.getName());
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
//根据用户名获得用户对象
System.out.println("根据用户名获得用户对象");
Ibatis ibatis=testDAOImpl.getByName("1");
System.out.println(ibatis.getName());
//根据id获得用户对象
System.out.println("根据id获得用户对象");
Ibatis ibatis1=testDAOImpl.getById("1");
System.out.println(ibatis.getName());
//新增用户对象
System.out.println("-----------------");
System.out.println("新增用户对象前");
List result1=new ArrayList();
result1=testDAOImpl.getList();
for (Iterator iter = result1.iterator(); iter.hasNext();) {
Ibatis element = (Ibatis) iter.next();
System.out.println(element.getName());
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
testDAOImpl.save(new Ibatis("3","3")); //新增用户
System.out.println("新增用户对象后");
List result2=new ArrayList();
result2=testDAOImpl.getList();
for (Iterator iter = result2.iterator(); iter.hasNext();) {
Ibatis element = (Ibatis) iter.next();
System.out.println(element.getName());
}
System.out.println("-----------------");
//删除用户对象
System.out.println("-----------------");
System.out.println("删除用户对象前");
List result3=new ArrayList();
result3=testDAOImpl.getList();
for (Iterator iter = result3.iterator(); iter.hasNext();) {
Ibatis element = (Ibatis) iter.next();
System.out.println(element.getName());
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
testDAOImpl.delete("3"); //删除用户
System.out.println("删除用户对象后");
List result4=new ArrayList();
result4=testDAOImpl.getList();
for (Iterator iter = result4.iterator(); iter.hasNext();) {
Ibatis element = (Ibatis) iter.next();
System.out.println(element.getName());
}
System.out.println("-----------------");
//更新用户对象
System.out.println("-----------------");
System.out.println("更新用户对象前");
List result5=new ArrayList();
result5=testDAOImpl.getList();
for (Iterator iter = result5.iterator(); iter.hasNext();) {
Ibatis element = (Ibatis) iter.next();
System.out.println(element.getName());
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
Ibatis ibatis3=testDAOImpl.getById("1");
ibatis3.setName("new1");
testDAOImpl.update(ibatis3);//更新用户对象
System.out.println("更新用户对象后");
List result6=new ArrayList();
result6=testDAOImpl.getList();
for (Iterator iter = result6.iterator(); iter.hasNext();) {
Ibatis element = (Ibatis) iter.next();
System.out.println(element.getName());
}
System.out.println("-----------------");
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
测试结果:
获得全查询列表
1
2
根据用户名获得用户对象
1
根据id获得用户对象
1
-----------------
新增用户对象前
1
2
新增用户对象后
1
2
3
-----------------
-----------------
删除用户对象前
1
2
3
删除用户对象后
1
2
-----------------
-----------------
更新用户对象前
1
2
更新用户对象后
new1
2
-----------------------------------------------------------------------------
Spring通过DAO模式,提供了对iBATIS的良好支持。SqlMapClient对象是iBATIS中的主要对象,我们可以通过配置让spring来管理SqlMapClient对象的创建。
与hibernate类似,Spring提供了SqlMapClientDaoSupport对象,我们的DAO可以继承这个类,通过它所提供的SqlMapClientTemplate对象来操纵数据库。看起来这些概念都与hibernate类似。
通过SqlMapClientTemplate来操纵数据库的CRUD是没有问题的。此篇文章没有进行事务处理。
本文采用ibatis+spring+mysql 进行编写
数据库脚本如下
1 | create database ibatis; |
一:要有一个PO类
Person.java
03 | import java.io.Serializable; |
05 | public class Person implements Serializable{ |
09 | private static final long serialVersionUID = -517413165963030507L; |
20 | public Person( int id,String name, int sex){ |
28 | public void setId( int id) { |
31 | public String getName() { |
34 | public void setName(String name) { |
40 | public void setSex( int sex) { |
二:DAO接口类
IAction.java
03 | import java.util.List; |
07 | public interface IAction { |
08 | public boolean insertPerson(Person person); |
09 | public boolean deleteById( int id); |
10 | public boolean updatePerson(Person person); |
11 | public Person queryById( int id); |
12 | public List<Person> queryAllPerson(); |
三:DAO实现类
ActionImpl.java 此类继承SqlMapClientSupport 实现IAction接口
03 | import java.io.IOException; |
04 | import java.io.Reader; |
05 | import java.sql.SQLException; |
06 | import java.util.List; |
08 | import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; |
10 | import com.ibatis.common.resources.Resources; |
11 | import com.ibatis.sqlmap.client.SqlMapClient; |
12 | import com.ibatis.sqlmap.client.SqlMapClientBuilder; |
13 | import com.ibatis.sqlmap.client.SqlMapSession; |
18 | public class ActionImpl extends SqlMapClientDaoSupport implements IAction { |
22 | public boolean insertPerson(Person person) { |
24 | getSqlMapClientTemplate().insert( "insertPerson" ,person); |
30 | public boolean deleteById( int id) { |
32 | getSqlMapClientTemplate().delete( "deleteById" , id); |
40 | public List<Person> queryAllPerson() { |
42 | List<Person> persons = getSqlMapClientTemplate().queryForList( "queryAllPerson" ); |
47 | public Person queryById( int id) { |
56 | public boolean updatePerson(Person person) { |
四:既然是ibatis spring整合 那就必须要有ibatis的配置文件
SqlMapConfig.xml
01 | <? xml version = "1.0" encoding = "UTF-8" ?> |
02 | <!DOCTYPE sqlMapConfig |
03 | PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" |
16 | < sqlMap resource = "po/Person.xml" /> |
SqlMapClient.xml里本应该有数据源的配置的 使用spring之后数据源的配置移植到了spring上
五:Person.xml
里面配置了一下对数据的增删改查操作
01 | <? xml version = "1.0" encoding = "UTF-8" ?> |
03 | PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" |
06 | < typeAlias alias = "person" type = "po.Person" /> |
08 | < insert id = "insertPerson" parameterClass = "po.Person" > |
10 | insert into person values (#id#,#name#,#sex#) |
14 | < delete id = "deleteById" parameterClass = "int" > |
16 | delete from person where id=#id# |
20 | < update id = "updatePerson" parameterClass = "po.Person" > |
22 | update person set name=#name#,sex=#sex# where id=#id# |
26 | < select id = "queryById" parameterClass = "int" resultClass = "po.Person" > |
28 | select * from person where id=#id# |
32 | < select id = "queryAllPerson" cacheModel = "personCache" resultClass = "po.Person" > |
六:下面最重要的也就是配置applicationContext.xml了
01 | <? xml version = "1.0" encoding = "UTF-8" ?> |
06 | < bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" > |
07 | < property name = "driverClassName" value = "com.mysql.jdbc.Driver" /> |
09 | < property name = "username" value = "root" /> |
10 | < property name = "password" value = "1" /> |
13 | < bean id = "sqlMapClient" class = "org.springframework.orm.ibatis.SqlMapClientFactoryBean" > |
14 | < property name = "configLocation" > |
15 | < value >SqlMapConfig.xml</ value > |
19 | < property name = "dataSource" > |
20 | < ref local = "dataSource" /> |
24 | < bean id = "personDAO" class = "dao.impl.ActionImpl" > |
26 | < property name = "dataSource" > |
27 | < ref local = "dataSource" /> |
31 | < property name = "sqlMapClient" > |
32 | < ref local = "sqlMapClient" /> |
37 | < bean id = "transactionManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" > |
38 | < property name = "dataSource" > |
39 | < ref local = "dataSource" /> |
注释里面的必需或不是必需都是本人多次试验的,至于为什么是必需不必需 其中的原理我也不是能太讲清楚,在此先是这些写罢了。
里面的每一个节点,属性,如果不太理解,可以上网查一些其他资料。
七:编写测试类
此类利用junit进行测试。只测试了部分功能。
03 | import java.util.Iterator; |
04 | import java.util.List; |
06 | import org.junit.Test; |
07 | import org.springframework.context.ApplicationContext; |
08 | import org.springframework.context.support.ClassPathXmlApplicationContext; |
13 | public class ActionImplTest { |
14 | private static ApplicationContext applicationContext = null ; |
16 | applicationContext = new ClassPathXmlApplicationContext( "applicationContext.xml" ); |
20 | public void testInsertPerson(){ |
21 | ActionImpl s = (ActionImpl)applicationContext.getBean( "personDAO" ); |
22 | s.insertPerson( new Person( 1 , "zhangsan" , 2 )); |
27 | public void testDeletePerson(){ |
28 | ActionImpl s = (ActionImpl)applicationContext.getBean( "personDAO" ); |
34 | public void testQueryAllPerson(){ |
35 | ActionImpl s = (ActionImpl)applicationContext.getBean( "personDAO" ); |
36 | List<Person> persons = s.queryAllPerson(); |
38 | Iterator<Person> ite = persons.iterator(); |
40 | Person person = ite.next(); |
41 | System.out.print( "ID: " +person.getId()); |
42 | System.out.print( " Name: " +person.getName()); |
43 | System.out.print( " Sex: " +person.getSex()); |
八:如需记录日志 则要log4j.properties
01 | #log4j.rootLogger=DEBUG, stdout |
02 | #log4j.appender.stdout=org.apache.log4j.ConsoleAppender |
03 | #log4j.appender.stdout.layout=org.apache.log4j.PatternLayout |
04 | #log4j.appender.stdout.layout.ConversionPattern=%c{1} - %m%n |
05 | #log4j.logger.java.sql.PreparedStatement=DEBUG |
06 | log4j.rootLogger=DEBUG, stdout, fileout |
07 | #log4j.logger.test=info |
08 | #log4j.logger.org.apache.jasper = DEBUG |
09 | #log4j.logger.org.apache.catalina.startup.TldConfig = DEBUG |
10 | #log4j.logger.org.apache.catalina.session.ManagerBase = DEBUG |
12 | log4j.logger.com.fiscal = DEBUG |
13 | log4j.logger.com.system = DEBUG |
15 | log4j.logger.com.ibatis = DEBUG |
16 | log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = DEBUG |
17 | log4j.logger.com.ibatis.common.jdbc.ScriptRunner = DEBUG |
18 | log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = DEBUG |
19 | log4j.logger.java.sql.Connection = DEBUG |
20 | log4j.logger.java.sql.Statement = DEBUG |
21 | log4j.logger.java.sql.PreparedStatement = DEBUG, fileout |
22 | log4j.logger.java.sql.ResultSet = DEBUG |
24 | log4j.appender.stdout=org.apache.log4j.ConsoleAppender |
26 | log4j.appender.fileout=org.apache.log4j.RollingFileAppender |
27 | log4j.appender.fileout.File=C\:\\ibatis.log |
28 | log4j.appender.fileout.MaxFileSize=10000KB |
30 | log4j.appender.stdout.layout=org.apache.log4j.PatternLayout |
31 | log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH\:mm\:ss} \:%m%n |
32 | log4j.appender.fileout.layout=org.apache.log4j.PatternLayout |
33 | log4j.appender.fileout.layout.ConversionPattern=[%-5p]_%d{yyyy-MM-dd HH\:mm\:ss} \:%m%n |
35 | #log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout |
37 | # log4j.logger.org=info |
九:已经到最后了,我觉得这最后的才是最最重要的,就是一下jar包问题
我调试了很长时间 一大部分时间是jar问题
在此列出一下我认为能够跑起来这个小程序所需的一下jar包
如没有,可网上下载。
- ibaits-2.3.4.jar
- spring.jar
- mysql-connector-java-bin.jar
- commons-dbcp-1.4.jar
- commons-pool-1.5.6.jar
- spring-orm-2.5.6.jar //已集成到spring.jar里
- //记录日志所需
- log4j-1.2.15.jar
- commons-logging.jar
下面是本人的目录结构图
![](http://hi.csdn.net/attachment/201111/6/0_1320567004lM9p.gif)