spring与mybatis(oracle)整合
今天闲着无聊把项目拆解开,抽出了spring与mybatis部分.做了个demo,希望对初学者有些帮助,另外整个demo是从项目中完整剥离下来的,里面的架构大家也可以参考一下.
先是完整的项目图
首先是用户类 用户类中目前就只包含sava方法,update,find方法
package com.user;
import com.dao.IDaoUtil;
public class User {
private String id;
private String xm;
/**
* 保存,2014-4-16
*/
public void save(IDaoUtil dao) {
dao.addObject("UserMapper.insert", this);
}
//省略get/set方法
}
再下来就是usermap 为了简单我只写了insert, 至于别的操作大家自己写
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="UserMapper">
<insert id="insert" parameterType="UserModel">
INSERT INTO
user (id,xm)
VALUES (
#{id,jdbcType=VARCHAR},
#{xm,jdbcType=VARCHAR}
)
</insert>
</mapper>
抽象出所有与数据库相关的工作
做成IDaoUtil
package com.dao;
import java.util.List;
import java.util.Map;
public interface IDaoUtil {
public void addObject(String mapperStr, Object model);
public void deleteObjectByID(String mapperStr, String id);
@SuppressWarnings("rawtypes")
public void deleteObjectByMap(String mapperStr, Map map);
public void deleteObject(String mapperStr, Object model);
public void updateObject(String mapperStr,Object model);
public Object getObjectByID(String mapperStr,String keyValue);
@SuppressWarnings("rawtypes")
public Object getObjectByMap(String mapperStr,Map map);
@SuppressWarnings("rawtypes")
public List findListByMap(String mapperStr, Map map);
@SuppressWarnings("rawtypes")
public List findListByID(String mapperStr, String id);
@SuppressWarnings("rawtypes")
public Integer countByMap(String countSql,Map map);
}
在写出它的实现类
而下面这个类 我认为是这篇博客的精髓 希望对大家有帮助
package com.dao;
import java.util.List;
import java.util.Map;
//import org.apache.ibatis.builder.xml.dynamic.ForEachSqlNode;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.mapping.ParameterMode;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
import org.apache.ibatis.reflection.factory.ObjectFactory;
import org.apache.ibatis.reflection.property.PropertyTokenizer;
import org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory;
import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory;
import org.apache.ibatis.scripting.xmltags.ForEachSqlNode;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
@Scope("prototype")
@Service
public class DaoUtil extends SqlSessionDaoSupport implements IDaoUtil{
@Override
@Autowired
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
super.setSqlSessionFactory(sqlSessionFactory);
}
public static int daocount=0;
public DaoUtil(){
daocount++;
System.out.println("DaoUtil已创建:"+daocount+"次;");
}
public static final ObjectFactory DEFAULT_OBJECT_FACTORY = new DefaultObjectFactory();
public static final ObjectWrapperFactory DEFAULT_OBJECT_WRAPPER_FACTORY =
new DefaultObjectWrapperFactory();
public static Logger logger = LoggerFactory.getLogger(DaoUtil.class);
@Override
public void addObject(String mapperStr, Object model) {
try {
getSqlSession().insert(mapperStr, model);
// System.out.println(this.getSql(getSqlSession(),mapperStr, model));
} catch (RuntimeException re) {
logger.error("DaoUtil.addObject(); sqlmapper: "+ mapperStr
+ ";\r\n### class name:" +model.getClass().getName()
// +";\r\n### sql:" +this.getSql(getSqlSession(),mapperStr, model)
+ " failed end\r\n",re);
throw re;
}
}
@Override
public void deleteObjectByID(String mapperStr, String id) {
try {
// System.out.println("sql "+this.getSql(getSqlSession(),mapperStr, id));
getSqlSession().delete(mapperStr, id);
} catch (RuntimeException re) {
logger.error("DaoUtil.addObject(); sqlmapper: "+ mapperStr
+";\r\n### sql:" +this.getSql(getSqlSession(),mapperStr, id)
+ " failed end\r\n",re);
throw re;
}
}
@SuppressWarnings("rawtypes")
@Override
public void deleteObjectByMap(String mapperStr, Map map) {
try {
getSqlSession().delete(mapperStr, map);
} catch (RuntimeException re) {
logger.error("DaoUtil.addObject(); sqlmapper: "+ mapperStr
+";\r\n### sql:" +this.getSql(getSqlSession(),mapperStr, map)
+ " failed end\r\n",re);
throw re;
}
}
@Override
public void deleteObject(String mapperStr, Object model) {
try {
getSqlSession().delete(mapperStr, model);
} catch (RuntimeException re) {
logger.error("DaoUtil.addObject(); sqlmapper: "+ mapperStr
+";\r\n### sql:" +this.getSql(getSqlSession(),mapperStr, model)
+ " failed end\r\n",re);
throw re;
}
}
/**
* 更新数据
*/
@Override
public void updateObject(String mapperStr,Object model){
try {
getSqlSession().update(mapperStr, model);
} catch (RuntimeException re) {
logger.error("DaoUtil.addObject(); sqlmapper: "+ mapperStr
+ ";\r\n### class name:" +model.getClass().getName()
+";\r\n### sql:" +this.getSql(getSqlSession(),mapperStr, model)
+ " failed end\r\n",re);
throw re;
}
}
/**
* 根据ID获取一个对象
*/
@Override
public Object getObjectByID(String mapperStr,String keyValue){
try {
// System.out.println("sql "+this.getSql(getSqlSession(),mapperStr, keyValue));
Object entity = getSqlSession().selectOne(mapperStr, keyValue);
return entity;
} catch (RuntimeException re) {
re.printStackTrace();
logger.error("DaoUtil.addObject(); sqlmapper: "+ mapperStr
+";\r\n### sql:" +this.getSql(getSqlSession(),mapperStr, keyValue)
+ " failed end\r\n",re);
throw re;
}
}
/**
* 根据map获取一个对象
*/
@SuppressWarnings("rawtypes")
@Override
public Object getObjectByMap(String mapperStr,Map map){
try {
Object entity = getSqlSession().selectOne(mapperStr, map);
return entity;
} catch (RuntimeException re) {
logger.error("DaoUtil.addObject(); sqlmapper: "+ mapperStr
+";\r\n### sql:" +this.getSql(getSqlSession(),mapperStr, map)
+ " failed end\r\n",re);
throw re;
}
}
/**
* 根据mapper获取数据列表
*/
@Override
@SuppressWarnings({ "rawtypes" })
public List findListByMap(String mapperStr, Map map) {
try {
// float a= 2/0;
List list = getSqlSession().selectList(mapperStr, map);
return list;
} catch (RuntimeException re) {
logger.error("DaoUtil.findListByMap(); sqlmapper: "+ mapperStr
+";\r\n### sql:" +this.getSql(getSqlSession(),mapperStr, map)
+ " failed end\r\n",re);
throw re;
}
}
/**
* 根据mapper获取数据列表
*/
@SuppressWarnings({ "rawtypes" })
@Override
public List findListByID(String mapperStr, String keyValue) {
try {
// float a= 2/0;
List list = getSqlSession().selectList(mapperStr, keyValue);
return list;
} catch (RuntimeException re) {
logger.error("DaoUtil.findListByID(); sqlmapper: "+ mapperStr
+";\r\n### sql:" +this.getSql(getSqlSession(),mapperStr, keyValue)
+ " failed end\r\n",re);
throw re;
}
}
public Integer countByMap(String countSql,Map map){
Integer count=(Integer)getSqlSession().selectOne(countSql,map);
if(count==null)
count=0;
return count;
}
/**获取sql String*/
public String getSql(SqlSession sqlSession,String sqlid, Object parameterObject) {
Configuration cfg = sqlSession.getConfiguration();
MappedStatement ms = cfg.getMappedStatement(sqlid);
if (null == ms) {
return "";
}
//BoundSql bs = ms.getBoundSql(obj);
BoundSql boundSql = ms.getBoundSql(parameterObject);
String parameterStr="";
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
if (parameterMappings != null) {
//Object[] parameterArray = new Object[parameterMappings.size()];
MetaObject metaObject = parameterObject == null ? null : MetaObject.forObject(parameterObject, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY);
for (int i = 0; i < parameterMappings.size(); i++) {
ParameterMapping parameterMapping = parameterMappings.get(i);
if (parameterMapping.getMode() != ParameterMode.OUT) {
Object value;
String propertyName = parameterMapping.getProperty();
PropertyTokenizer prop = new PropertyTokenizer(propertyName);
if (parameterObject == null) {
value = null;
} else if (ms.getConfiguration().getTypeHandlerRegistry().hasTypeHandler(parameterObject.getClass())) {
value = parameterObject;
} else if (boundSql.hasAdditionalParameter(propertyName)) {
value = boundSql.getAdditionalParameter(propertyName);
} else if (propertyName.startsWith(ForEachSqlNode.ITEM_PREFIX)
&& boundSql.hasAdditionalParameter(prop.getName())) {
value = boundSql.getAdditionalParameter(prop.getName());
if (value != null) {
value = MetaObject.forObject(value, null, null).getValue(propertyName.substring(prop.getName().length()));
}
} else {
value = metaObject == null ? null : metaObject.getValue(propertyName);
}
//parameterArray[i] = value;
parameterStr+=value+"; ";
}
}
//ibatisSql.setParameters(parameterArray);
}
return boundSql.getSql()+";\r\n### parameters: "+parameterStr;
//return "没有测试";
}
}
再下来就是学生的facade类 同样的我只写了add方法
package com.facade.xuesheng;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.dao.IDaoUtil;
import com.user.User;
/**
* 学生模块facade类
*
* @version V1.0 ,2013-11-10
* @author xiahui
*
*/
@Service
public class XueShengFacade {
@Resource
private IDaoUtil daoUtil;
/**
* 添加一个学生记录
*
*/
public String addDkRecord(User user){
user.save(daoUtil);
return "success";
}
}
再下来就是整个程序的关键spring的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
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:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<!-- ====================================================================================== -->
<!-- 启用基于注解(Annotation-based)的配置 -->
<!-- ====================================================================================== -->
<context:annotation-config />
<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@203.218.132.153:1521:orcl" />
<property name="username" value="hasdfp" />
<property name="password" value="sdfd" />
</bean>
<!-- ====================================================================================== -->
<!-- 配置 SqlMapClient -->
<!-- ====================================================================================== -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:config/sqlMapConfig.xml" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<context:component-scan base-package="com.dao"/>
<context:component-scan base-package="com.facade.xuesheng"/>
</beans>
最后测试类
package com.facade.xuesheng;
import org.example.Country;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import com.dao.IDaoUtil;
import com.facade.xuesheng.XueShengFacade;
import com.user.User;
@ContextConfiguration(locations = { "classpath:test/UserApplicationContext.xml" })
public class XueShengFacadeTest extends AbstractJUnit4SpringContextTests {
@Autowired
private XueShengFacade xueShengFacade;
/**
*
* @throws Exception
*/
@Test
public void testAddDkRecord() throws Exception {
User user = new User();
user.setId("123");
user.setXm("郭靖");
String result = xueShengFacade.addDkRecord(user);
System.out.println(result);
}
}
}
测试结果
DaoUtil已创建:1次;
success
spring与mybatis(oracle)整合的更多相关文章
- SSM框架整合(Spring+SpringMVC+MyBatis+Oracle)
1.开发环境搭建以及创建Maven Web项目 参看之前的博文[确保maven web项目不报错]:http://www.cnblogs.com/cainiaomahua/p/6306476.html ...
- (4)Maven快速入门_4在Spring+SpringMVC+MyBatis+Oracle+Maven框架整合运行在Tomcat8中
利用Maven 创建Spring+SpringMVC+MyBatis+Oracle 项目 分了三个项目 Dao (jar) Service (jar) Controller (web) ...
- 关于Spring和mybatis的整合
Spring同Mybatis的整合 1.引入相应的jar包.(Mybatis的jar包,Spring的jar包,mybatis-spring-1.1.1.jar). 2.编写相应的包(三层的包).搭建 ...
- 如约而至,Java 10 正式发布! Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十四)Redis缓存正确的使用姿势 努力的孩子运气不会太差,跌宕的人生定当更加精彩 优先队列详解(转载)
如约而至,Java 10 正式发布! 3 月 20 日,Oracle 宣布 Java 10 正式发布. 官方已提供下载:http://www.oracle.com/technetwork/java ...
- 基于maven进行spring 和mybatis的整合(Myeclpise)
学习日记:基于maven进行spring和mybatis的整合,进行分页查询 什么是maven:maven是一个项目管理工具,使用maven可以自动管理java项目的整个生命周期,包括编译.构建.测试 ...
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(六)maven整合SSM
写在前面的话 承接前文<Spring+SpringMVC+MyBatis+easyUI整合基础篇(五)讲一下maven>,本篇所讲述的是如何使用maven与原ssm项目整合,使得一个普 ...
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(八)mysql中文查询bug修复
写在前面的话 在测试搜索时出现的问题,mysql通过中文查询条件搜索不出数据,但是英文和数字可以搜索到记录,中文无返回记录.本文就是写一下发现问题的过程及解决方法.此bug在第一个项目中点这里还存在, ...
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(十一)SVN服务器进阶
日常啰嗦 上一篇文章<Spring+SpringMVC+MyBatis+easyUI整合基础篇(十)SVN搭建>简单的讲了一下SVN服务器的搭建,并没有详细的介绍配置文件及一些复杂的功能, ...
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(十二)阶段总结
不知不觉,已经到了基础篇的收尾阶段了,看着前面的十几篇文章,真的有点不敢相信,自己竟然真的坚持了下来,虽然过程中也有过懒散和焦虑,不过结果还是自己所希望的,克服了很多的问题,将自己的作品展现出来,也发 ...
随机推荐
- OpenSuSE Linux下安装Oracle10g的步骤
OpenSuSE Linux下安装Oracle10g的步骤: --root用户 --1.vi etc/profile 添加脚本: if [ \$USER = "oracle" ]; ...
- truncated、delete和drop的异同点
相同点 truncate和不带where子句的delete, 以及drop都会删除表内的数据. 不同点: 1.truncate和 delete只删除数据不删除表的结构(定义) drop语句将删除表的结 ...
- Flume 读取RabbitMq消息队列消息,并将消息写入kafka
首先是关于flume的基础介绍 组件名称 功能介绍 Agent代理 使用JVM 运行Flume.每台机器运行一个agent,但是可以在一个agent中包含多个sources和sinks. Client ...
- Django Views(视图函数)
http请求中产生两个核心对象: http请求:HttpRequest对象 http响应:HttpResponse对象 所在位置:django.http 之前我们用到的参数request就是HttpR ...
- Detailed Item Cost Report (XML) timed out waiting for the Output Post-processor to finish
In this Document Symptoms Cause Solution References APPLIES TO: Oracle Cost Management - Ver ...
- ANT不完全总结,包含各种命令,ant例子等,转自:http://lavasoft.blog.51cto.com/62575/87306
ANT不完全总结 好久没有用Ant了,最近让MyEclipse.JBuilder2008逼的重回Ant上了.手生了,写了一个脚本后,重新总结下.参考了官方的文档和网上一些资料. 一.ANT的介 ...
- Unity UGUI图文混排(六) -- 超链接
图文混排更新到超链接这儿,好像也差不多了,不过就在最后一点,博主也表现得相当不专业,直接整合了山中双木林同学提供的超链接的解决方案,博主甚至没来得及细看就直接复制了,但感觉还是挺好用的. 博主已经将超 ...
- 深入浅出如何解析xml文件---上篇
xml小伙伴们并不陌生,xml是可扩展标记语言,标准通用标记语言语言的子集,是一种用来标记电子文件使其具有结构性的标记语言.我们知道xml可以用dom与sax等方法进行解析,但是xml为什么要解析呢? ...
- android viewpager切换到最后一页时,跳转至其他activity
许许多多的qpp,在启动时会显示一些帮助页或者产品介绍什么的,通常滑动到最后一页时会有一个开始体验的按钮,用来跳转到app的主activity上,但是如果没有? 可以通过如下方法实现: 1.为View ...
- [ExtJS5学习笔记]第二十三节 Extjs5中表格gridpanel的列格式设置
本文地址:http://blog.csdn.net/sushengmiyan/article/details/39665979 官方文档:http://docs.sencha.com/extjs/5. ...