本文主要是介绍ibatis与spring整合,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这两天一直在研究ibatis与spring的整合 一个小小的demo搞的我头晕目眩的,但程序一旦跑起来了,突然有一种豁然开朗,重见天日,感觉生活很美好的感觉!,也许,这就是那一行行的代码带给我们的不同享受吧。呵呵,废话就不多说了。在此先引用几句别人的资料。。。
spring通过DAO模式,提供了对iBATIS的良好支持。SqlMapClient对象是iBATIS中的主要对象,我们可以通过配置让spring来管理SqlMapClient对象的创建。
与hibernate类似,Spring提供了SqlMapClientDaoSupport对象,我们的DAO可以继承这个类,通过它所提供的SqlMapClientTemplate对象来操纵数据库。看起来这些概念都与hibernate类似。
通过SqlMapClientTemplate来操纵数据库的CRUD是没有问题的。此篇文章没有进行事务处理。
本文采用ibatis+spring+MySQL 进行编写
数据库脚本如下
- create database ibatis;
- create table person(
- id int primary key,
- name varchar(10),
- sex int
- );
- create database ibatis;
- create table person(
- id int primary key,
- name varchar(10),
- sex int
- );
一:要有一个PO类
Person.Java
- package po;
- import java.io.Serializable;
- public class Person implements Serializable{
- /**
- *
- */
- private static final long serialVersionUID = -517413165963030507L;
- /**
- *
- */
- private int id;
- private String name;
- private int sex;
- public Person(){
- }
- public Person(int id,String name,int sex){
- this.id = id;
- this.name = name;
- this.sex = sex;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getSex() {
- return sex;
- }
- public void setSex(int sex) {
- this.sex = sex;
- }
- }
- package po;
- import java.io.Serializable;
- public class Person implements Serializable{
- /**
- *
- */
- private static final long serialVersionUID = -517413165963030507L;
- /**
- *
- */
- private int id;
- private String name;
- private int sex;
- public Person(){
- }
- public Person(int id,String name,int sex){
- this.id = id;
- this.name = name;
- this.sex = sex;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getSex() {
- return sex;
- }
- public void setSex(int sex) {
- this.sex = sex;
- }
- }
二:DAO接口类
IAction.java
- package dao;
- import java.util.List;
- import po.Person;
- public interface IAction {
- public boolean insertPerson(Person person); //添加
- public boolean deleteById(int id); //删除
- public boolean updatePerson(Person person); //修改
- public Person queryById(int id); //根据ID查询
- public List<Person> queryAllPerson(); //查询全部
- }
- package dao;
- import java.util.List;
- import po.Person;
- public interface IAction {
- public boolean insertPerson(Person person); //添加
- public boolean deleteById(int id); //删除
- public boolean updatePerson(Person person); //修改
- public Person queryById(int id); //根据ID查询
- public List<Person> queryAllPerson(); //查询全部
- }
三:DAO实现类
ActionImpl.java 此类继承SqlMapClientSupport 实现IAction接口
- package dao.impl;
- import java.io.IOException;
- import java.io.Reader;
- import java.sql.SQLException;
- import java.util.List;
- import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
- import com.ibatis.common.resources.Resources;
- import com.ibatis.sqlmap.client.SqlMapClient;
- import com.ibatis.sqlmap.client.SqlMapClientBuilder;
- import com.ibatis.sqlmap.client.SqlMapSession;
- import po.Person;
- import dao.IAction;
- public class ActionImpl extends SqlMapClientDaoSupport implements IAction {
- //添加操作
- @Override
- public boolean insertPerson(Person person) {
- // TODO Auto-generated method stub
- getSqlMapClientTemplate().insert("insertPerson",person);
- return false;
- }
- //删除操作
- @Override
- public boolean deleteById(int id) {
- // TODO Auto-generated method stub
- getSqlMapClientTemplate().delete("deleteById", id);
- return false;
- }
- //查询全部
- @Override
- public List<Person> queryAllPerson() {
- // TODO Auto-generated method stub
- List<Person> persons = getSqlMapClientTemplate().queryForList("queryAllPerson");
- return persons;
- }
- @Override
- public Person queryById(int id) {
- // TODO Auto-generated method stub
- package dao.impl;
- import java.io.IOException;
- import java.io.Reader;
- import java.sql.SQLException;
- import java.util.List;
- import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
- import com.ibatis.common.resources.Resources;
- import com.ibatis.sqlmap.client.SqlMapClient;
- import com.ibatis.sqlmap.client.SqlMapClientBuilder;
- import com.ibatis.sqlmap.client.SqlMapSession;
- import po.Person;
- import dao.IAction;
- public class ActionImpl extends SqlMapClientDaoSupport implements IAction {
- //添加操作
- @Override
- public boolean insertPerson(Person person) {
- // TODO Auto-generated method stub
- getSqlMapClientTemplate().insert("insertPerson",person);
- return false;
- }
- //删除操作
- @Override
- public boolean deleteById(int id) {
- // TODO Auto-generated method stub
- getSqlMapClientTemplate().delete("deleteById", id);
- return false;
- }
- //查询全部
- @Override
- public List<Person> queryAllPerson() {
- // TODO Auto-generated method stub
- List<Person> persons = getSqlMapClientTemplate().queryForList("queryAllPerson");
- return persons;
- }
- @Override
- public Person queryById(int id) {
- // TODO Auto-generated method stub
- //自己添加实现代码
- return null;
- }
- @Override
- public boolean updatePerson(Person person) {
- // TODO Auto-generated method stub
- //自己添加实现代码
- return null;
- }
- @Override
- public boolean updatePerson(Person person) {
- // TODO Auto-generated method stub
- //自己添加实现代码
- return false;
- }
- //自己添加实现代码
- return false;
- }
四:既然是ibatis spring整合 那就必须要有ibatis的配置文件
SqlMapConfig.xml
- <?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>
- <?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>
- <!--此处一定不能有<settings/> 标签-->
- <!-- <settings cacheModelsEnabled="true"
- enhancementEnabled="true"
- lazyLoadingEnabled="true"
- errorTracingEnabled="true"
- maxRequests="32"
- maxSessions="10"
- maxTransactions="5"
- useStatementNamespaces="false" /> -->
- <sqlMap resource="po/Person.xml" />
- </sqlMapConfig>
- <!--此处一定不能有<settings/> 标签-->
- <!-- <settings cacheModelsEnabled="true"
- enhancementEnabled="true"
- lazyLoadingEnabled="true"
- errorTracingEnabled="true"
- maxRequests="32"
- maxSessions="10"
- maxTransactions="5"
- useStatementNamespaces="false" /> -->
- <sqlMap resource="po/Person.xml" />
- </sqlMapConfig>
SqlMapClient.xml里本应该有数据源的配置的 使用spring之后数据源的配置移植到了spring上
五:Person.xml
里面配置了一下对数据的增删改查操作
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE sqlMap
- PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
- "http://www.ibatis.com/dtd/sql-map-2.dtd">
- <sqlMap>
- <typeAlias alias="person" type="po.Person" />
- <insert id="insertPerson" parameterClass="po.Person">
- <![CDATA[
- insert into person values (#id#,#name#,#sex#)
- ]]>
- </insert>
- <delete id="deleteById" parameterClass="int">
- <![CDATA[
- delete from person where id=#id#
- ]]>
- </delete>
- <update id="updatePerson" parameterClass="po.Person">
- <![CDATA[
- update person set name=#name#,sex=#sex# where id=#id#
- ]]>
- </update>
- <select id="queryById" parameterClass="int" resultClass="po.Person">
- <![CDATA[
- select * from person where id=#id#
- ]]>
- </select>
- <select id="queryAllPerson" cacheModel="personCache" resultClass="po.Person">
- <![CDATA[
- select * from person
- ]]>
- </select>
- </sqlMap>
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE sqlMap
- PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
- "http://www.ibatis.com/dtd/sql-map-2.dtd">
- <sqlMap>
- <typeAlias alias="person" type="po.Person" />
- <insert id="insertPerson" parameterClass="po.Person">
- <![CDATA[
- insert into person values (#id#,#name#,#sex#)
- ]]>
- </insert>
- <delete id="deleteById" parameterClass="int">
- <![CDATA[
- delete from person where id=#id#
- ]]>
- </delete>
- <update id="updatePerson" parameterClass="po.Person">
- <![CDATA[
- update person set name=#name#,sex=#sex# where id=#id#
- ]]>
- </update>
- <select id="queryById" parameterClass="int" resultClass="po.Person">
- <![CDATA[
- select * from person where id=#id#
- ]]>
- </select>
- <select id="queryAllPerson" cacheModel="personCache" resultClass="po.Person">
- <![CDATA[
- select * from person
- ]]>
- </select>
- </sqlMap>
六:下面最重要的也就是配置applicationContext.xml了
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
- <property name="driverClassName" value="com.mysql.jdbc.Driver" />
- <property name="url" value="jdbc:mysql://localhost:3306/ibatis" />
- <property name="username" value="root" />
- <property name="password" value="1" />
- </bean>
- <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
- <property name="configLocation"> <!-- name 为configLocation或s 不可为其他 -->
- <value>SqlMapConfig.xml</value> <!-- 不区分大小写,路径前可加'/' -->
- </property>
- <!-- dataSource不是必需 -->
- <property name="dataSource">
- <ref local="dataSource" />
- </property>
- </bean>
- <bean id="personDAO" class="dao.impl.ActionImpl">
- <!-- dataSource不是必需 -->
- <property name="dataSource">
- <ref local="dataSource" />
- </property>
- <!-- sqlMapClient必需 -->
- <property name="sqlMapClient">
- <ref local="sqlMapClient"/>
- </property>
- </bean>
- <!-- transactionManager不是必需 -->
- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource">
- <ref local="dataSource" />
- </property>
- </bean>
- </beans>
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
- <property name="driverClassName" value="com.mysql.jdbc.Driver" />
- <property name="url" value="jdbc:mysql://localhost:3306/ibatis" />
- <property name="username" value="root" />
- <property name="password" value="1" />
- </bean>
- <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
- <property name="configLocation"> <!-- name 为configLocation或s 不可为其他 -->
- <value>SqlMapConfig.xml</value> <!-- 不区分大小写,路径前可加'/' -->
- </property>
- <!-- dataSource不是必需 -->
- <property name="dataSource">
- <ref local="dataSource" />
- </property>
- </bean>
- <bean id="personDAO" class="dao.impl.ActionImpl">
- <!-- dataSource不是必需 -->
- <property name="dataSource">
- <ref local="dataSource" />
- </property>
- <!-- sqlMapClient必需 -->
- <property name="sqlMapClient">
- <ref local="sqlMapClient"/>
- </property>
- </bean>
- <!-- transactionManager不是必需 -->
- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource">
- <ref local="dataSource" />
- </property>
- </bean>
- </beans>
注释里面的必需或不是必需都是本人多次试验的,至于为什么是必需不必需 其中的原理我也不是能太讲清楚,在此先是这些写罢了。
里面的每一个节点,属性,如果不太理解,可以上网查一些其他资料。
七:编写测试类
此类利用junit进行测试。只测试了部分功能。
- package dao.impl;
- import java.util.Iterator;
- import java.util.List;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import po.Person;
- public class ActionImplTest {
- private static ApplicationContext applicationContext = null; //提供静态ApplicationContext
- static{
- applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //实例化
- }
- //添加操作
- @Test
- public void testInsertPerson(){
- ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO");
- s.insertPerson(new Person(1,"zhangsan",2));
- }
- //删除操作
- @Test
- public void testDeletePerson(){
- ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO");
- s.deleteById(1);
- }
- //查询全部
- @Test
- public void testQueryAllPerson(){
- ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO");
- List<Person> persons = s.queryAllPerson();
- //System.out.println(persons.size());
- Iterator<Person> ite = persons.iterator();
- while(ite.hasNext()){
- Person person = ite.next();
- System.out.print("ID: "+person.getId());
- System.out.print(" Name: "+person.getName());
- System.out.print(" Sex: "+person.getSex());
- System.out.println();
- }
- }
- }
- package dao.impl;
- import java.util.Iterator;
- import java.util.List;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import po.Person;
- public class ActionImplTest {
- private static ApplicationContext applicationContext = null; //提供静态ApplicationContext
- static{
- applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //实例化
- }
- //添加操作
- @Test
- public void testInsertPerson(){
- ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO");
- s.insertPerson(new Person(1,"zhangsan",2));
- }
- //删除操作
- @Test
- public void testDeletePerson(){
- ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO");
- s.deleteById(1);
- }
- //查询全部
- @Test
- public void testQueryAllPerson(){
- ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO");
- List<Person> persons = s.queryAllPerson();
- //System.out.println(persons.size());
- Iterator<Person> ite = persons.iterator();
- while(ite.hasNext()){
- Person person = ite.next();
- System.out.print("ID: "+person.getId());
- System.out.print(" Name: "+person.getName());
- System.out.print(" Sex: "+person.getSex());
- System.out.println();
- }
- }
- }
八:如需记录日志 则要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
- log4j.rootLogger=DEBUG, stdout, fileout
- #log4j.logger.test=info
- #log4j.logger.org.apache.jasper = DEBUG
- #log4j.logger.org.apache.catalina.startup.TldConfig = DEBUG
- #log4j.logger.org.apache.catalina.session.ManagerBase = DEBUG
- log4j.logger.com.fiscal = DEBUG
- log4j.logger.com.system = DEBUG
- log4j.logger.com.ibatis = DEBUG
- log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = DEBUG
- log4j.logger.com.ibatis.common.jdbc.ScriptRunner = DEBUG
- log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = DEBUG
- log4j.logger.java.sql.Connection = DEBUG
- log4j.logger.java.sql.Statement = DEBUG
- log4j.logger.java.sql.PreparedStatement = DEBUG, fileout
- log4j.logger.java.sql.ResultSet = DEBUG
- log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- log4j.appender.fileout=org.apache.log4j.RollingFileAppender
- log4j.appender.fileout.File=C\:\\ibatis.log
- log4j.appender.fileout.MaxFileSize=10000KB
- log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH\:mm\:ss} \:%m%n
- log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
- log4j.appender.fileout.layout.ConversionPattern=[%-5p]_%d{yyyy-MM-dd HH\:mm\:ss} \:%m%n
- #log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
- # log4j.logger.org=info
- #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
- log4j.rootLogger=DEBUG, stdout, fileout
- #log4j.logger.test=info
- #log4j.logger.org.apache.jasper = DEBUG
- #log4j.logger.org.apache.catalina.startup.TldConfig = DEBUG
- #log4j.logger.org.apache.catalina.session.ManagerBase = DEBUG
- log4j.logger.com.fiscal = DEBUG
- log4j.logger.com.system = DEBUG
- log4j.logger.com.ibatis = DEBUG
- log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = DEBUG
- log4j.logger.com.ibatis.common.jdbc.ScriptRunner = DEBUG
- log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = DEBUG
- log4j.logger.java.sql.Connection = DEBUG
- log4j.logger.java.sql.Statement = DEBUG
- log4j.logger.java.sql.PreparedStatement = DEBUG, fileout
- log4j.logger.java.sql.ResultSet = DEBUG
- log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- log4j.appender.fileout=org.apache.log4j.RollingFileAppender
- log4j.appender.fileout.File=C\:\\ibatis.log
- log4j.appender.fileout.MaxFileSize=10000KB
- log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH\:mm\:ss} \:%m%n
- log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
- log4j.appender.fileout.layout.ConversionPattern=[%-5p]_%d{yyyy-MM-dd HH\:mm\:ss} \:%m%n
- #log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
- # 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
- 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
下面是本人的目录结构图
这篇关于ibatis与spring整合的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!