最近大脑变懒了,遇到问题没有思考而直接Google。在网上也看到过一些描述这种问题的帖子,总之这种习惯很不好,对自己没有一点帮助(如果仅仅复制网上的代码,而没有分析网上代码),所有正在努力改正这个缺点,希望与同有这种“不良”习惯的同行共勉。
言归正传。
最近也是很浮躁,与生活有很大的关系,所有经常想一些办法让自己“静”下来。于是写了ibatis与spring整合的小例子,很简单,官方文档很写的很清楚,如果想更加明白理解可以看看官方文档。在文章的下面我只贴一些配置文件的代码,其它代码就“不好意思”贴下来了。以后大家忘记了头文件怎么写,也可以参考参考。相信大家都懂下面的代码我就不解释了。
1.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> <typeAlias alias="User" type="pojo.User"/> <!-- 动态配置WHERE条件 --> <sql id="baseUserWhere"> <dynamic prepend="WHERE"> <isNotEmpty property="id" prepend="and"> id = #id# </isNotEmpty> <isNotEmpty property="username" prepend="and"> username = #username# </isNotEmpty> <isNotEmpty property="password" prepend="and"> password = #password# </isNotEmpty> <isNotEmpty property="isUser" prepend="and"> isUser = #isUser# </isNotEmpty> </dynamic> </sql> <!-- 动态配置SET条件 --> <sql id="baseUserSet"> <dynamic prepend="SET"> <isNotNull property="fileds.id" prepend=","> id = #fileds.id# </isNotNull> <isNotNull property="fileds.username" prepend=","> username = #fileds.username# </isNotNull> <isNotNull property="fileds.password" prepend=","> password = #fileds.password# </isNotNull> <isNotNull property="fileds.isUser" prepend=","> isUser = #fileds.isUser# </isNotNull> </dynamic> </sql> <select id="selectUserById" parameterClass="java.lang.String" resultClass="User"> <![CDATA[ select id, username, password, isUser from tab_user where id = #id#; ]]> </select> <select id="selectUserAll" resultClass="User"> <![CDATA[ select id, username, password, isUser from tab_user; ]]> </select> <insert id="insertUser" parameterClass="User"> <![CDATA[ insert into tab_user ( id, username, password, isUser ) values ( #id#, #username#, #password#, #isUser# ); ]]> </insert> <update id="updateUser" parameterClass="User"> <![CDATA[ update tab_user set username = #username#, password = #password#, isUser = #isUser# where id = #id#; ]]> </update> <delete id="deleteUserById" parameterClass="java.lang.String"> <![CDATA[ delete from tab_user where id = #id#; ]]> </delete> </sqlMap>
2.ibatis配置文件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="2014" maxSessions="512" maxTransactions="128" useStatementNamespaces="true" /> --> <!-- 导入映射文件 --> <sqlMap resource="dao/impl/User.xml"/> </sqlMapConfig>
3.数据源文件jdbc.properties
jdbc.driverClass = com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8 jdbc.username = root jdbc.password = root # BasicDataSource提供了close()方法关闭数据源,所以必须设定destroy-method=”close”属性, 以便Spring容器关闭时,数据源能够正常关闭。除以上必须的数据源属性外,还有一些常用的属性: # # defaultAutoCommit:设置从数据源中返回的连接是否采用自动提交机制,默认值为 true; # defaultReadOnly:设置数据源是否仅能执行只读操作, 默认值为 false; # maxActive:最大连接数据库连接数,设置为0时,表示没有限制; # maxIdle:最大等待连接中的数量,设置为0时,表示没有限制; # maxWait:最大等待秒数,单位为毫秒, 超过时间会报出错误信息; # validationQuery:用于验证连接是否成功的查询SQL语句,SQL语句必须至少要返回一行数据, 如你可以简单地设置为:“select count(*) from user”; # removeAbandoned:是否自我中断,默认是 false ; # removeAbandonedTimeout:几秒后数据连接会自动断开,在removeAbandoned为true,提供该值; # logAbandoned:是否记录中断事件, 默认为 false;
4.spring配置文件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" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation" value="classpath:sqlMapConfig.xml" /> <property name="dataSource" ref="dataSource" /> </bean> <!-- dao --> <bean id="userDao" class="dao.impl.UserDaoImpl"> <property name="sqlMapClient" ref="sqlMapClient"></property> </bean> <!-- service --> <bean id="userService" class="service.impl.UserServiceImpl"> <property name="userDao" ref="userDao"></property> </bean> <!-- 配置文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="jdbc.properties"/> </bean> <!-- 配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"> <value>${jdbc.driverClass}</value> </property> <property name="url"> <value>${jdbc.url}</value> </property> <property name="username"> <value>${jdbc.username}</value> </property> <property name="password"> <value>${jdbc.password}</value> </property> </bean> <!-- 配置事物管理 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> </beans>
5.log4j配置文件log4j.properties
log4j配置在web项目中很重要。
#-------------------------------- # 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 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 #--------------------------------
最后贴出自己的测试代码,采用单元测试。
5.Test代码UserTest.java
package test; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import pojo.User; import service.UserService; import junit.framework.TestCase; public class UserTest extends TestCase{ private static ApplicationContext applicationContext; private static UserService userService; static{ applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); userService = (UserService) applicationContext.getBean("userService"); } /** * 测试插入数据 * @throws Exception */ public void insertTest() throws Exception{ User user = new User(); user.setId("1"); user.setUsername("guchao2"); user.setPassword("123456"); user.setIsUser(new Integer(1)); userService.insertUser(user); } /** * 测试查询数据 * @throws Exception */ public void selectTest() throws Exception{ User user = new User(); user = userService.selectUser("0"); System.out.println(user.getId() + " " + user.getUsername() + " " + user.getPassword() + " " + (user.getIsUser().equals(new Integer(1))? "是" : "否")); } /** * 测试查询全部数据 * @throws Exception */ public void selectAllTest() throws Exception{ List<User> users = new ArrayList<User>(); users = userService.selectUserAll(); Iterator<User> iterator = users.iterator(); while(iterator.hasNext()){ User user = iterator.next(); System.out.println(user.getId() + " " + user.getUsername() + " " + user.getPassword() + " " + (user.getIsUser().equals(new Integer(1))? "是" : "否")); } } /** * 测试更新数据 * @throws Exception */ public void update() throws Exception{ User user = new User(); user.setId("0"); user.setUsername("gc"); user.setPassword("123"); user.setIsUser(new Integer(0)); userService.updateUser(user); } /** * 测试删除数据 * @throws Exception */ public void delete() throws Exception{ userService.deleteUser("0"); } }
包也要提一下:
就这些了。
补充:一不小心给忘了Dao层实现类(可能以后忘了继承SqlMapClientDaoSupport类)
6.数据访问实现类UserDAoImpl.java
package dao.impl; import java.sql.SQLException; import java.util.List; import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; import pojo.User; import dao.UserDao; public class UserDaoImpl extends SqlMapClientDaoSupport implements UserDao{ @Override public void delete(String id) throws SQLException { // TODO Auto-generated method stub getSqlMapClientTemplate().delete("deleteUserById", id); } @Override public void insert(User user) throws SQLException { // TODO Auto-generated method stub getSqlMapClientTemplate().insert("insertUser", user); } @Override public User select(String id) throws SQLException { // TODO Auto-generated method stub return (User) getSqlMapClientTemplate().queryForObject("selectUserById", id); } @SuppressWarnings("unchecked") @Override public List<User> selectAll() throws SQLException { // TODO Auto-generated method stub return getSqlMapClientTemplate().queryForList("selectUserAll"); } @Override public void update(User user) throws SQLException { // TODO Auto-generated method stub getSqlMapClientTemplate().update("updateUser", user); } }