本文大多数内容转自“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的作用)的更多相关文章

  1. 对spring 对持久层的支持和数据库连接池的理解

    1.spring对持久层的支持在于,得到数据库连接之后操作上的封装,将操作简化了.也就是说以后操作sql语句就用XXXTemplate(就是一个工具类)对象了. 2.数据库连接池的作用只在于得到数据库 ...

  2. Junit结合Spring对Dao层进行单元测试

    关于单元测试,上一次就简单的概念和Mock基础做了,参考:http://60.174.249.204:8888/in/modules/article/view.article.php/74 实际开发过 ...

  3. Spring之DAO一

    前面博客把bean.aop简单了解了一下,今天主要是了解Spring中DAO层,如果使用传统的JDBC时需要创建连接.打开.执行sql.关闭连接这一系列的步骤,Spring框架对JDBC进行了封装,我 ...

  4. Java高并发秒杀API之业务分析与DAO层

    根据慕课网上关于java高并发秒杀API的课程讲解用maven+ssm+redis实现的一个秒杀系统 参考了codingXiaxw's blog,很详细:http://codingxiaxw.cn/2 ...

  5. Spring框架之使用JdbcTemplate开发Dao层程序

    简介: JdbcTemplate开发dao层程序     由Spring框架给我们提供,Spring提供的很多操作数据源(关系型数据库,二维表格模型,有明确的行和列(mysql/orcal等) 非关系 ...

  6. mybatis dao 层开发简易版 非整合 spring

    同样老习惯,先上项目结构截图 首先 补充上篇文中缺失的 mysql demo 用的 小脚本 drop database if exists mybatis; CREATE DATABASE `myba ...

  7. 解决Spring框架的Dao层改用@Repository注解,无法使用JdbcDaoSupport的问题

    解决Spring框架的Dao层改用@Repository注解,无法使用JdbcDaoSupport的问题 Alternatively, create an own implementation of ...

  8. Spring学习记录4——Spring对DAO的支持

    Spring对DAO的支持 随着持久化技术的持续发展,Spring对多个持久化技术提供了集成支持,包括Hibernate.MyBatis.JPA.JDO:此外,还提供了一个简化JDBC API操作的S ...

  9. 四、spring集成ibatis进行项目中dao层基类封装

    Apache iBatis(现已迁至Google Code下发展,更名为MyBatis)是当前IT项目中使用很广泛的一个半自动ORM框架,区别于Hibernate之类的全自动框架,iBatis对数据库 ...

随机推荐

  1. Struts2中的ActionContext、OGNL及EL的使用

    文章分类:Java编程 本文基于struts2.1.8.1,xwork2.1.6 1.EL         EL(Expression Language)源于jsp页面标签jstl,后来被jsp2.0 ...

  2. SQL with as

    姓名 课程 分数 张三 语文 张三 数学 张三 物理 李四 语文 李四 数学 李四 物理 先看下面一个嵌套的查询语句 ) 上面的查询语句使用了一个子查询.虽然这条SQL语句并不复杂,但如果嵌套的层次过 ...

  3. ***Linux文件夹文件创建、删除、改名

    Linux删除文件夹命令 linux删除目录很简单,很多人还是习惯用rmdir,不过一旦目录非空,就陷入深深的苦恼之中,现在使用rm -rf命令即可.直接rm就可以了,不过要加两个参数-rf 即:rm ...

  4. win + linux + android 多任务分屏

    Win10 的多任务分屏操作方法_百度经验http://jingyan.baidu.com/article/48206aeaf6ef35216ad6b336.html win+方向键 如果是想四分屏幕 ...

  5. VB已死?还是会在Roslyn之下焕发新生?

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 由于最初的ASP.NET 5测试版并未支持VB,导致社区有一种声音:觉得VB将死.今天我们就 ...

  6. Python 中的函数与类的方法

    注:本文转译自 Stackoverflow 上 Adding a Method to an Existing Object 的最佳回答. 在 python 中,def 定义的函数与类中的方法有很大的不 ...

  7. cocos2dx游戏开发——微信打飞机学习笔记(四)——GameScene的搭建

    一.创建文件 首先呢,就是那个创建新的.h 和 .cpp 的文件,然后可以起名为GameScene 最重要的就是一定要创建在Classes的目录下哦= =,别手抖= =. 二.GameScene.h和 ...

  8. 如何查找MySQL中查询慢的SQL语句

    如何查找MySQL中查询慢的SQL语句 更多 如何在mysql查找效率慢的SQL语句呢?这可能是困然很多人的一个问题,MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow ...

  9. 简单几何(直线与圆的交点) ZOJ Collision 3728

    题目传送门 题意:有两个一大一小的同心圆,圆心在原点,大圆外有一小圆,其圆心有一个速度(vx, vy),如果碰到了小圆会反弹,问该圆在大圆内运动的时间 分析:将圆外的小圆看成一个点,判断该直线与同心圆 ...

  10. BZOJ3931 [CQOI2015]网络吞吐量(最大流)

    没啥好说的,有写过类似的,就是预处理出最短路上的边建容量网络. #include<cstdio> #include<cstring> #include<queue> ...