spring对dao层的支持(datasource的作用)
本文大多数内容转自“http://www.cnblogs.com/liunanjava/p/4412408.html”感谢原作者
在做一个项目时,持久层并没有使用spring jpa和hibernate结合,而是使用了spring原生的jdbctemplate。
因为spring原声的jdbc template效率更高
二、Spring注入数据源
2.1、 DataSource(数据源)
连接数据的方式称为“数据库”。比如JDBC,连接池或者JNDI
Spring通过依赖注入方式配置数据源
不同系统,数据源的管理更多是针对底层的行为,这些行为不应该影响业务。
更换数据只需修改Bean定义的内容,而不需要修改任何一行代码。
2.2、配置数据源
datasource bean有很多种实现类,具体视不同的数据库而改变datasource实现类。
jdbc的连接方式datasource 的spring实现类为org.springframework.jdbc.datasource.DriverManagerDataSource。
spring实现了不同的数据库连接实现类。即不同数据库的datasource实现类。
applicationContext.xml配置数据源(由此可见spring的所有bean都是配置在spring.xml配置文件中的,datasource是最典型例子)
<?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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"> <!--数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!--驱动 --> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> <!--URL --> <property name="url" value="jdbc:oracl:thin:@localhost:1521:orcl"/> <!--连接的用户名 --> <property name="username" value="accp"></property> <!--连接的密码 --> <property name="password" value="accp"></property> </bean> </beans>
JDBC操作:
package com.pb.jdbc.dao.impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.sql.DataSource; import com.pb.entity.Person; import com.pb.jdbc.dao.PersonDao; public class PersonDaoImpl implements PersonDao { private DataSource dataSource; //引入datasource bean @Override public Person findById(Integer id) { Connection con = null; PreparedStatement ps = null; ResultSet rs = null; Person p=null; String sql="select * from person where id=?"; Object [] params={id}; //获取连接 try { con=dataSource.getConnection(); ps=con.prepareStatement(sql); if(params!=null){ ; i < params.length; i++) { ps.setObject(i+, params[i]); } } rs=ps.executeQuery(); if(rs!=null){ p=new Person(); while(rs.next()){ p.setId(rs.getInt("id")); p.setName(rs.getString("name")); p.setAge(rs.getInt("age")); } } return p; } catch (SQLException e) { e.printStackTrace(); }finally{ try { if(rs!=null) rs.close(); if(ps!=null) ps.close(); if(con!=null) con.close(); } catch (SQLException e) { e.printStackTrace(); } } return null; } public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } }
更新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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"> <!--数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!--驱动 --> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> <!--URL --> <property name="url" value="jdbc:oracl:thin:@localhost:1521:orcl"/> <!--连接的用户名 --> <property name="username" value="accp"></property> <!--连接的密码 --> <property name="password" value="accp"></property> </bean> <!-- PersonDao接口实现类 --> <bean id="personDaoImpl" class="com.pb.jdbc.dao.impl.PersonDaoImpl"> <!-- 属性关联 --> <property name="dataSource" ref="dataSource"/> </bean> </beans>
三、JDBC Template
为什么需要JDBCTemplate(JDBC模板)?
使用JDBC时,总是需要进行固定的步骤,比如Connection,Statement的获取、关闭,异常处理等。
JDBCTemplate作用:
Spring将JDBC常用的操作封装到JDBCTemplate中简化了使用JDBC的开发流程,开发人员不需要关心,获得连接和关闭连接
更改上面的代码
package com.pb.jdbc.dao.impl; import java.math.BigDecimal; import java.util.List; import java.util.Map; import javax.sql.DataSource; import org.springframework.jdbc.core.JdbcTemplate; import com.pb.entity.Person; import com.pb.jdbc.dao.PersonDao; public class JdbcTemplatePersonDaoImpl implements PersonDao { private JdbcTemplate jdbcTemplate; //根据ID查找 @Override public Person findById(Integer id) { Person p=null; //返回的是集合,但集合的每个元素都是一个map String sql="select * from person where id=?"; //占位符 Object [] params={id}; //调用SQL和占位 List results=jdbcTemplate.queryForList(sql,params); for (Object object : results) { Map personMap=(Map) object; //获取每个map的值 Long p_id=((BigDecimal) personMap.get("ID")).longValue(); String p_name=(String) personMap.get("NAME"); Integer p_age=((BigDecimal) personMap.get("AGE")).intValue(); //声明 p=new Person(); p.setAge(p_age); p.setId(p_id); p.setName(p_name); } return p; } //通过设置数据获取JdbcTemplate的实例 public void setDataSource(DataSource dataSource) { jdbcTemplate=new JdbcTemplate(dataSource); } }
四、JDBC Template
要使用Jdbctemplate 对象来完成jdbc 操作。通常情况下,有三种种方式得到JdbcTemplate 对象。
- 第一种方式:我们可以在自己定义的DAO 实现类中注入一个DataSource 引用来完 成JdbcTemplate 的实例化。也就是它是从外部“注入” DataSource 到DAO 中,然后 自己实例化JdbcTemplate,然后将DataSource 设置到JdbcTemplate 对象中。
- 第二种方式: 在 Spring 的 IoC 容器中配置一个 JdbcTemplate 的 bean,将 DataSource 注入进来,然后再把JdbcTemplate 注入到自定义DAO 中。
- 第三种方式: Spring 提供了 org.springframework.jdbc.core.support.JdbcDaoSupport 类 , 这 个 类 中 定 义 了 JdbcTemplate 属性,也定义了DataSource 属性,当设置DataSource 属性的时候,会创 建jdbcTemplate 的实例,所以我们自己编写的DAO 只需要继承JdbcDaoSupport 类, 然后注入DataSource 即可
第一种
public class UserServiceImpl implements UserService { private JdbcTemplate jdbcTemplate; public JdbcTemplate getJdbcTemplate() { return jdbcTemplate; } //注入方法1 public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } //其它方法这里省略…… }
application.xml 前提是已经配置了dataSource 2.2配置数据源
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name = "dataSource" ref="dataSource"> </bean> <bean id="userService" class="com.hxzy.account.jdbcTemplate.UserServiceImpl"> <property name="jdbcTemplate" ref="jdbcTemplate"/> </bean>
第二种 通过数据库实例化JdbcTemplate
public class UserServiceImpl implements UserService { private JdbcTemplate jdbcTemplate; //注入方法2 public void setDataSource(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } //其它方法省略…… }
applicationContext.xml
前提是已经配置了dataSource 2.2配置数据源
spring配置文件为:
<bean id="userService" class="com.hxzy.account.jdbcTemplate.UserServiceImpl"> <property name="dataSource" ref="dataSource"/> </bean>
第三种:
继承JdbcDaoSupport,其内部有个JdbcTemplate ,需要注入DataSource 属性来实例化。
public class UserDaoImpl extends JdbcDaoSupport implements UserDao { @Override public void save(User user) { String sql = null; this.getJdbcTemplate().update(sql); } //其它方法省略…… }
xml
<bean id="userDao" class="com.hxzy.account.jdbcTemplate.UserDaoImpl"> <property name="dataSource" ref="dataSource"/> </bean>
spring对dao层的支持(datasource的作用)的更多相关文章
- 对spring 对持久层的支持和数据库连接池的理解
1.spring对持久层的支持在于,得到数据库连接之后操作上的封装,将操作简化了.也就是说以后操作sql语句就用XXXTemplate(就是一个工具类)对象了. 2.数据库连接池的作用只在于得到数据库 ...
- Junit结合Spring对Dao层进行单元测试
关于单元测试,上一次就简单的概念和Mock基础做了,参考:http://60.174.249.204:8888/in/modules/article/view.article.php/74 实际开发过 ...
- Spring之DAO一
前面博客把bean.aop简单了解了一下,今天主要是了解Spring中DAO层,如果使用传统的JDBC时需要创建连接.打开.执行sql.关闭连接这一系列的步骤,Spring框架对JDBC进行了封装,我 ...
- Java高并发秒杀API之业务分析与DAO层
根据慕课网上关于java高并发秒杀API的课程讲解用maven+ssm+redis实现的一个秒杀系统 参考了codingXiaxw's blog,很详细:http://codingxiaxw.cn/2 ...
- Spring框架之使用JdbcTemplate开发Dao层程序
简介: JdbcTemplate开发dao层程序 由Spring框架给我们提供,Spring提供的很多操作数据源(关系型数据库,二维表格模型,有明确的行和列(mysql/orcal等) 非关系 ...
- mybatis dao 层开发简易版 非整合 spring
同样老习惯,先上项目结构截图 首先 补充上篇文中缺失的 mysql demo 用的 小脚本 drop database if exists mybatis; CREATE DATABASE `myba ...
- 解决Spring框架的Dao层改用@Repository注解,无法使用JdbcDaoSupport的问题
解决Spring框架的Dao层改用@Repository注解,无法使用JdbcDaoSupport的问题 Alternatively, create an own implementation of ...
- Spring学习记录4——Spring对DAO的支持
Spring对DAO的支持 随着持久化技术的持续发展,Spring对多个持久化技术提供了集成支持,包括Hibernate.MyBatis.JPA.JDO:此外,还提供了一个简化JDBC API操作的S ...
- 四、spring集成ibatis进行项目中dao层基类封装
Apache iBatis(现已迁至Google Code下发展,更名为MyBatis)是当前IT项目中使用很广泛的一个半自动ORM框架,区别于Hibernate之类的全自动框架,iBatis对数据库 ...
随机推荐
- Nginx(PHP/fastcgi)的PATH_INFO问题
引用: http://www.laruence.com/2009/11/13/1138.html server { listen 80; server_name localhost; index in ...
- mysql中char,varchar,text区别总结
具体对这三种类型的说明不做阐述可以查看mysql帮助文档. char的总结: char最大长度是255字符,注意是字符数和字符集没关系.可以有默认值,尾部有空格会被截断.varchar的总结 ...
- IOS项目自动构建
# Sets the target folders and the final framework product. # 如果工程名称和Framework的Target名称不一样的话,要自定义FMKN ...
- PHP多文件上传类
<?php class Upload{ var $saveName;// 保存名 var $savePath;// 保存路径 var $fileFormat = array('gif','jpg ...
- mingw64环境搭建
转自:http://www.cr173.com/soft/132367.html MinGW64位版,默认编译出来是64位的,需要编译32位请使用-m32 参数!mingw是一款gnu工具集合是Min ...
- spring 源代码地址
spring的源代码地址发生了更改,以前的地址是 https://src.springframework.org/svn/spring-framework/.但现在spring的代码开始使用Git进行 ...
- 电赛菜鸟营培训(零)——Keil环境搭建
一.Keil开发软件安装 1.安装keil软件 2.使用注册机进行破解 将方框内的ID号复制到注册机,然后得到License,放到最底下就可以完成了. 二.Keil工程搭建 表示参考数据手册,在这里建 ...
- 利用SQL语句查询数据库中所有表
Oracle: SELECT * FROM ALL_TABLES;系统里有权限的表 SELECT * FROM DBA_TABLES; 系统表 SELECT * FROM USER_TABLES; 当 ...
- 【poi】用POI新建一个xlsx文件【或者说将数据存入到xlsx中】/【将数据从xlsx中获取到项目中】
第一部分:写入xlsx中 使用POI创建一个xlsx文件: 项目结构如下: 具体使用的POI中的 XSSFWorkbook xlsx对象 Sheet 工作簿对象 Row 行对象 Cell 单元格 ...
- QUnit使用笔记-1判断方法
QUnit是一个前端测试工具. 判断效果: html基本结构: <h1 id="qunit-header">QUnit</h1> <h2 id=&qu ...