Spring(七)持久层
一、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"?>
<beansxmlns="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.xsdhttp://www.springframework.org/schema/aophttp://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;@Overridepublic 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"?>
<beansxmlns="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.xsdhttp://www.springframework.org/schema/aophttp://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查找@Overridepublic Person findById(Integer id) {Person p=null;//返回的是集合,但集合的每个元素都是一个mapString 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);//通过数据源实例JdbcTemplateJdbcTemplate 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);//通过数据源实例JdbcTemplateJdbcTemplate 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() {@Overridepublic 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));}@Overridepublic 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();}@Overrideprotected 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);}@Overridepublic List<Person> find() {return pq.execute();}@Overridepublic void update(Person p) {//传入参数pu.update(p.getId(),p.getName(),p.getAge());}@Overridepublic int getCount() {//函数使用run运行调用return pf.run();}}
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="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());}}}
转载于:https://www.cnblogs.com/yuexiaoyun/p/9457514.html
Spring(七)持久层相关推荐
- mybatis和spring jdbc持久层框架事务支持分析
mybatis和spring jdbc持久层框架事务支持分析 持久层框架中的事务支持指的是持久层框架如何支持数据库事务,我们先梳理出原生数据库事务操作的主线脉络,它是通过java.sql 包下的C ...
- Spring 从入门到精通 (二十) 持久层框架 MyBatis
关键词:Spring | 整合 | 持久层 | MyBatis 本专栏通过理论和实践相结合,系统学习框架核心思想及简单原理,原创不易,如果觉得文章对你有帮助,点赞收藏支持博主 ✨ 目录 一.MyBat ...
- Spring基础专题——第七章(持久层整合)
前言:去年到现在一直没有很好的时间完成这个spring基础+源码的博客目标,去年一年比较懒吧,所以今年我希望我的知识可以分享给正在奋斗中的互联网开发人员,以及未来想往架构师上走的道友们我们一起进步,从 ...
- SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装
SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装 >>>>>>>& ...
- Spring –持久层–编写实体并配置Hibernate
欢迎来到本教程的第二部分. 当您看到本文有多长时间时,请不要惊慌–我向您保证,这主要是简单的POJO和一些生成的代码. 在开始之前,我们需要更新我们的Maven依赖项,因为我们现在将使用Hiberna ...
- Spring 3.1和Hibernate的持久层
1.概述 本文将展示如何使用Spring和Hibernate实现DAO . 有关核心的Hibernate配置,请参阅有关带有Spring的Hibernate 3和Hibernate 4的文章. 2 ...
- Spring Data JPA的持久层
1.概述 本文将重点介绍Spring 3.1,JPA和Spring Data的持久层的配置和实现. 有关使用基于Java的配置和项目的基本Maven pom设置Spring上下文的分步介绍,请参阅本文 ...
- 【Spring 持久层】Spring 事务开发、事务属性详解
持久层 事务回顾 Spring 事务编程开发 Spring 中的事务属性(Transaction Attribute) 隔离属性(ISOLATION) 传播属性(PROPAGATION) 只读属性(r ...
- 【Spring 持久层】Spring 与 Mybatis 整合
持久层 持久层整合总述 Mybatis 开发步骤回顾 Mybatis 开发中存在的问题 Spring 与 Mybatis 整合思路 Spring 与 Mybatis 整合的开发步骤 Spring 与 ...
最新文章
- vim树形目录NERDTree
- 软考解析:2015年上半年下午试卷
- windows环境下,如何在Pycharm下安装TensorFlow环境
- 【小马哥】Spring Cloud系列讲座
- 王者-甄别同一板块强弱股的方法【真假美猴王】
- iOS视频播放器MPMoviePlayerController
- C# XNA 简单的 迷宫游戏
- 计网PPT 第八章 互联网上的音频和视频服务
- redis-replicator使用的一点点心得
- hnu 模型机组合部件的实现(一)
- 微信商家收款码怎么申请,3分钟快速开通低费率商户方法
- The provisioning profile is expiring soon
- Windows 7系统盘清理
- 矩阵求逆操作的复杂度分析(逆矩阵的复杂度分析)
- keil编译代码Program Size详解
- 卓普zp900s手机root和data大小调整经验
- 开源安全审计系统漏洞扫描工具lynis
- 三种方式实现网页二级菜单
- matlab中load y,matlab load的函数用法是什么
- 转大佬--C++语言Qt实现控件拖拽和连线类似可视化操作Simulink仿真类软件 电路仿真软件 和模型驱动等软件
热门文章
- 一个修改RAC REDO引起的DATAGUARD错误 的处理
- linux bash shell中,单引号、 双引号,反引号(``)的区别及各种括号的区别
- android 获取ArrayList的Capacity
- Linux 下gedit编辑器的使用
- DotNetTextBox V2.0 Web Control(ASP.NET2.0 增强型TextBox控件,完全支持AJAX.NET)
- FFmpeg转OpenCV Mat显示
- Vue—基础概念—实例
- Java面试总结汇总
- 学习笔记之-java8的新特性-函数式接口,lambda表达式,方法引用,Stream API,Optional类
- Luogu3092 [USACO13NOV]没有找零No Change (状压DP)