一、Spring对DAO的支持

DAO:Data Access Object

Spring提供了DAO框架,让开发人员无须耦合特定的数据库技术,就能进行应用程序的开发。

Spring封闭了操作Oracle,MySql,DB2,SQL等数据库的用法。

它们都实现同一接口,方法也是一样的。

优势:

由于依赖于接口,可以通过依赖注入随时替换DAO接口的实现类,而应用程序完全不用了解接口与底层数据库操作细节。

应用程序----调用-----》DAO接口《---实现--DAO接口实现类----操作------》数据库

二、Spring注入数据源

2.1、 DataSource(数据源)

连接数据的方式称为“数据库”。比如JDBC,连接池或者JNDI

Spring通过依赖注入方式配置数据源

不同系统,数据源的管理更多是针对底层的行为,这些行为不应该影响业务。

更换数据只需修改Bean定义的内容,而不需要修改任何一行代码。

2.2、配置数据源

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> </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;
@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){
for (int i = 0; i < params.length; i++) {
ps.setObject(i+1, 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>

五、JDBC Template操作数据库

 执行DDL与更新

  • 使用JdbcTemplate的execute()方法可以执行DDL语句
  • 执行update或者inert,可以使用update()方法;

package com.pb.demo;

import java.util.List;
import java.util.Map; import javax.sql.DataSource; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
/**
* 1.JdbcTemplate queryForXxx方法执行SQL语句
* 2. query和update都可以使用占位符
* 3. 返回的List中的元素为map
* 4.使用update执行更新操作
* 5.使用execute方法执行DDL操作
*/
public class JdbcTemplateDemo { public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//获取数据源
DataSource dataSource=context.getBean("dataSource",DataSource.class);
//通过数据源实例JdbcTemplate
JdbcTemplate jt=new JdbcTemplate(dataSource); //执行占位符的查询语句
String sql_v="select * from person where name=? and age=?";
Object [] params={"李四",24};
//传入参数
List result=jt.queryForList(sql_v,params);
for (Object object : result) {
//直接输出对象
System.out.println(object);
//或者输出值
Map map=(Map)object;
System.out.println("ID: "+map.get("ID")+"姓名:"+map.get("NAME")+map.get("AGE"));
}
//更新
String sql_update="update person set name=? where age=?";
//年龄为23的都更新为张小三
Object [] pupdate={"张小三",23};
//数据库受影响的行数
int count=jt.update(sql_update, pupdate);
System.out.println("更新了"+count+"行");
//查询总记录数
String sql_count="select count(*) from person";
int totalcount=jt.queryForInt(sql_count);
System.out.println("Person表的总记录数: "+totalcount);
//执行DDL语句
//创建一张表
String ddl="create table test(id number(4) primary key,name varchar2(50))";
jt.execute(ddl);
System.out.println("创建表 成功");
//删除表
String del_table="drop table test";
jt.execute(del_table);
System.out.println("删除表成功"); } }

配置数据如:2.2

package com.pb.demo;

import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import javax.sql.DataSource; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
/**
* 使用批量处理数据
*/
public class JdbcTemplateDemo2 { public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//获取数据源
DataSource dataSource=context.getBean("dataSource",DataSource.class);
//通过数据源实例JdbcTemplate
JdbcTemplate jt=new JdbcTemplate(dataSource); //批量插入数据
final int count=200;
final List id=new ArrayList();
final List name=new ArrayList();
final List password=new ArrayList();
//为集合调定值
for (int i = 0; i < count; i++) {
id.add(i);
name.add("name_"+i);
password.add("password_"+i); } //指处理数据
String sql="insert into users values(?,?,?)";
BatchPreparedStatementSetter bps=new BatchPreparedStatementSetter() { @Override
public void setValues(PreparedStatement ps, int index) throws SQLException {
ps.setObject(1, id.get(index));
ps.setObject(2, name.get(index));
ps.setObject(3, password.get(index)); } @Override
public int getBatchSize() { return count;
}
};
//执行插入
jt.batchUpdate(sql, bps);
System.out.println("插入完成!"); } }

六、JDBC Template以对象方 式操作数据库

执行函数的类继承:

sqlfunction

package com.pb.object;

import javax.sql.DataSource;

import org.springframework.jdbc.object.SqlFunction;
/**
* 执行函数
*
*/
public class PersonFunction extends SqlFunction{
public PersonFunction(DataSource ds){
//初始化
super(ds,"select count(*) from person");
//编译
compile();
} }

执行增加或者更新的类继承sqlupdate

package com.pb.object;

import java.sql.Types;

import javax.sql.DataSource;

import org.springframework.jdbc.object.SqlUpdate;
/**
* 执行增加或者更新
*
*/
public class PersonUpdate extends SqlUpdate {
public PersonUpdate(DataSource ds){
super(ds,"insert into person values(?,?,?)");
//设置参数为Oracle中的数据
int [] types={Types.BIGINT,Types.VARCHAR,Types.INTEGER};
//设置参数
setTypes(types);
compile(); }
}

执行查询的类继承MappingSqlQuery

package com.pb.object;

import java.sql.ResultSet;
import java.sql.SQLException; import javax.sql.DataSource; import org.springframework.jdbc.object.MappingSqlQuery; import com.pb.entity.Person;
/**
* 对象查询
* @author Administrator
*
*/
public class PersonQuery extends MappingSqlQuery {
public PersonQuery(DataSource ds){
super(ds,"select * from person");
compile();
} @Override
protected Object mapRow(ResultSet rs, int rownum) throws SQLException {
Person p=new Person();
p.setAge(rs.getInt("age"));
p.setId(rs.getLong("id"));
p.setName(rs.getString("name")); return p;
} }

实现类和接口

package com.pb.dao;

import java.util.List;

import com.pb.entity.Person;

public interface PersonDao {
//查询全部
public List<Person> find();
//增加
public void update(Person p);
//查询总记录数
public int getCount(); }

实现类

package com.pb.dao.impl;

import java.util.List;

import javax.sql.DataSource;

import com.pb.dao.PersonDao;
import com.pb.entity.Person;
import com.pb.object.PersonFunction;
import com.pb.object.PersonQuery;
import com.pb.object.PersonUpdate; public class ObjectPersonDaoImpl implements PersonDao {
//3个实现类
private PersonFunction pf=null; //执行函数
private PersonQuery pq=null; //执行查询
private PersonUpdate pu=null; //执行更新 /*
*通过注入数据源实例化对象
*
*/
public void setDataSource(DataSource ds){
pf=new PersonFunction(ds);
pq=new PersonQuery(ds);
pu=new PersonUpdate(ds);
} @Override
public List<Person> find() { return pq.execute();
} @Override
public void update(Person p) {
//传入参数
pu.update(p.getId(),p.getName(),p.getAge()); } @Override
public int getCount() {
//函数使用run运行调用
return pf.run();
} }

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-3.1.xsd"> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
<property name="username" value="accp"/>
<property name="password" value="accp"/>
</bean>
<bean id="objectPersonDao" class="com.pb.dao.impl.ObjectPersonDaoImpl">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>

测试类

package com.pb.demo;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.pb.dao.PersonDao;
import com.pb.entity.Person; public class TestObjectJdbc { public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); PersonDao opd=context.getBean("objectPersonDao",PersonDao.class);
Person p=new Person();
p.setAge(99);
p.setId(7);
p.setName("灭绝师太"); opd.update(p); List<Person> persons=opd.find(); //调用查询总记录数的方法
System.out.println("总记录数:"+opd.getCount());
for (Person per : persons) {
System.out.println("ID:"+per.getId()+"姓名:"+per.getName()+" 年龄:"+per.getAge());
}
} }

Spring(七)持久层的更多相关文章

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

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

  2. 05_ssm基础(四)之Spring与持久层的整合

    30.31.spring对jdbc的支持jdbcTemplate 使用Spring的JDBC准备:  1):拷贝jar:       mysql-connector-java-5.1.11.jar:M ...

  3. 整合使用持久层框架mybatis 使用SqlSessionTemplate模板类与使用映射接口 对比

    spring中整合使用mybatis的用法总结 一:在Spring配置Mybatis 第一步:将mybatis-spring类包添加 到项目的类库中 第二步:编写spring和持久层衔接的xml文件, ...

  4. Spring Boot 入门之持久层篇(三)

    原文地址:Spring Boot 入门之持久层篇(三) 博客地址:http://www.extlight.com 一.前言 上一篇<Spring Boot 入门之 Web 篇(二)>介绍了 ...

  5. 第五章 征服数据库(Spring对DB的使用)——开发持久层

    本章内容: 定义Spring对数据库访问的支持 配置数据库资源 使用Spring的JDBC模板 在几乎所有的企业级应用中,都需要构建数据持久层.现在意义上的数据持久层是指把对象或者数据保存到数据库中, ...

  6. SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装

    SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装 >>>>>>>& ...

  7. Spring集成MyBatis持久层框架

    一.MyBatis介绍 MyBatis 是一款优秀的持久层框架,它支持定制化SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的JDBC代码和手动设置参数以及获取结果集,可以使用简单的XML ...

  8. spring boot整合双持久层框架jpa、mybatis

    公司之前用的是spring boot + jpa,但由于jpa无法完美的解决某些动态查询问题,就使用的jdbcTemplate 动态封装SQL,由于代码相对复杂,可读性差,现准备再引入mybatis. ...

  9. spring学习(四)spring 持久层的封装

    持久层:所谓“持久层”,也就是在系统逻辑层面上,专著于实现数据持久化的一个相对独立的领域(Domain),是把数据保存到可掉电式存储设备中.持久层是负责向(或者从)一个或者多个数据存储器中存储(或者获 ...

随机推荐

  1. 事务复制中的snapshot

        Snapshot agent读取article的信息,将article的内容和脚本放置到snapshot文件夹中: 接下来distribution agent会读取这些快照文件,传输到订阅,完 ...

  2. Unity 动画

    Unity 并没有自带建模工具. 3D建模工具 maya, 3dmax, blender Skinned Mesh Renderer Mesh Renderer Mesh Filter Modelli ...

  3. Visual Studio 2010 简体中文旗舰、专业版(MSDN原版下载)

    Visual Studio 2010 简体中文旗舰.专业版(MSDN原版下载)(Visual Studio 2010 ultimate professional x86 dvd)2010[光盘镜像]- ...

  4. NPM使用详解(上)

    1.NPM是什么? NPM是JavaScript的包管理工具,在安装NodeJS(什么?你不知道node?来,我们合计合计:https://nodejs.org/)的时候,会自动安装上npm. 要查看 ...

  5. Robot Framework自动化测试(三)---Selenium API

    Robot  Framework  Selenium  API 说明: 此文档只是将最常用的UI 操作列出.更多方法请查找selenium 关键字库. 一.浏览器驱动 通过不同的浏览器执行脚本. Op ...

  6. Direct3D11学习:(一)开发环境配置

    转载请注明出处:http://www.cnblogs.com/Ray1024   从今天开始,开启一个新的系列:Direct3D11的学习教程. 因为一直对3D方面比较感兴趣,最近决定开始学习D3D知 ...

  7. 基于HTML5技术的电力3D监控应用(四)

    回答了知乎问题较长,一些使用WebGL的经验,作为新的一篇: 正好逛到这个问题,正好是2013年底,正好最近基于的HT for Web 3D做的电力项目收尾,正好用到的就是WebGL技术,因此说说自己 ...

  8. 0422 发现( 数学口袋精灵)bug

    团队博客地址: 甘佳萍:http://www.cnblogs.com/gjpg/ 李鹏飞:http://www.cnblogs.com/l549023320/ 赵创佳:http://www.cnblo ...

  9. Mybatis 示例之 SelectKey

    SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式. 不管SelectKey有多好,尽量不要遇到这种情况吧,毕竟很麻烦. sel ...

  10. 图片轮播(淡入淡出)--JS原生和jQuery实现

    图片轮播(淡入淡出)--js原生和jquery实现 图片轮播有很多种方式,这里采用其中的 淡入淡出形式 js原生和jQuery都可以实现,jquery因为封装了很多用法,所以用起来就简单许多,转换成j ...