四、Spring的数据库访问

1、DAO模式

 /**
* 抽取的一个类
* @author zhy
*
*/
public class JdbcDaoSupport { private QueryRunner qr = new QueryRunner(DBCPUtil.getDataSource()); public int update(String sql,Object...params){
try{
return qr.update(sql,params);
}catch(Exception e){
throw new RuntimeException(e);
}
} public <T> T query(String sql,ResultSetHandler<T> rsh,Object...params){
try{
return qr.query(sql,rsh,params);
}catch(Exception e){
throw new RuntimeException(e);
}
}
}
 /**
* 前提:不考虑事务问题。因为有AOP的存在,我们可以把事务配置起来
* @author zhy
*
*/
public class AccountDaoImpl extends JdbcDaoSupport implements IAccountDao { public Account findAccountByName(String sourceName) {
return query("select * from account where name = ? ",new BeanHandler<Account>(Account.class),sourceName);
} public void updateAccount(Account sourceAccount) {
update("update account set name=?,money=? where id=? ",sourceAccount.getName(),sourceAccount.getMoney(),sourceAccount.getId()) ;
} }

2、Spring提供的数据库访问的模板工具类

2.1、JDBC环境搭建

2.1.1、拷贝jar包

数据库驱动

spring-jdbc-3.2.0.RELEASE.jar:访问JDBC的一个非常基本jar包

spring-orm-3.2.0.RELEASE.jar:通过ORM框架(Hibernate、MyBatis)支持jar包

spring-tx-3.2.0.RELEASE.jar:事务有关的支持jar包(如果使用的JDBC,数据库自动提交事务的前提下,此包不是必须的)

2.1.2、JdbcTemplate的基本使用

JdbcTemplate:用于直接通过JDBC访问数据用的

HibernateTemplate:用于通过Hibernate框架访问数据库用的

a、初级版本,硬编码问题
 public class JdbcTemplateDemo1 {

     public static void main(String[] args) throws DataAccessException {
//spring中提供了一个内置的数据源:该数据源没有性能问题,可以使用
DriverManagerDataSource ds = new DriverManagerDataSource();
//给数据源提供必需的参数
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/ee0413_spring_day36");
ds.setUsername("root");
ds.setPassword("1234");
//创建一个新的springjdbc模板
JdbcTemplate jt = new JdbcTemplate();
//给模板赋值数据源
jt.setDataSource(ds);
jt.execute("insert into account(name,money)values('ddd',1000)");
} }
b、改进版
     <!-- 配置一个JdbcTemplate的bean -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="driverManagerDataSource"></property>
</bean>
 public class JdbcTemplateDemo2 {

     public static void main(String[] args) throws DataAccessException {
//加载Spring配置文件,创建spring容器
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//根据id获取jdbc模板
JdbcTemplate jt = (JdbcTemplate)ac.getBean("jdbcTemplate");
jt.execute("insert into account(name,money)values('eee',1000)");
} }
c、增删改查操作
 public class JdbcTemplateDemo3 {

     public static void main(String[] args) throws DataAccessException {
//加载Spring配置文件,创建spring容器
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//根据id获取jdbc模板
JdbcTemplate jt = (JdbcTemplate)ac.getBean("jdbcTemplate"); //保存
jt.update("insert into account(name,money)values(?,?)", "fff",300); //更新
jt.update("update account set money = ? where id = ? ",5000,6); //删除
jt.update("delete from account where id = ? ",6); //查询一个
Account account = jt.query("select * from account where id = ?",new MyResultSetExctractor(),1);
List<Account> list = jt.query("select * from account where id = ?",new AccountRowMapper(),1);
Account account = null;
if(list.size() == 1){
account = list.get(0);
}
System.out.println(account); //查询所有
List<Account> list = jt.query("select * from account", new AccountRowMapper());
System.out.println(list); //查询返回一行一列的情况:比如count(*)
int totalRecords = jt.queryForObject("select count(*) from account", Integer.class);
System.out.println(totalRecords);
}
}
 class AccountRowMapper implements RowMapper<Account>{

     /**
* 它是每次遍历都会调用一次此方法
* List<Account> list = new ArrayList<Account>();
* while(rs.next){
* Account account = mapRow(rs);
* list.add(acount);
* }
* return list;
*/
public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
Account account = new Account();
account.setId(rs.getInt("id"));
account.setName(rs.getString("name"));
account.setMoney(rs.getFloat("money"));
return account;
}
} class MyResultSetExctractor implements ResultSetExtractor<Account>{ public Account extractData(ResultSet rs) throws SQLException, DataAccessException {
Account account = null;
//1.判断是否有结果集
if(rs.next()){
account = new Account();
account.setId(rs.getInt("id"));
account.setName(rs.getString("name"));
account.setMoney(rs.getFloat("money"));
}
return account;
}
}

2.1.3、Spring提供的数据库访问的DAO工具类

JdbcDaoSupport:JdbcTemplate的Dao模式的抽取类

HibernateDaoSupport:HibernateTemplate的Dao模式的抽取类

a、原始版本: DAO中直接使用JdbcTemplate

b、改进版:DAO实现类继承JdbcDaoSupport,注入数据源即可

    <!-- 配置一个JdbcTemplate的bean -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="driverManagerDataSource"></property>
</bean> <!-- 配置数据源 -->
<bean id="driverManagerDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/ee0413_spring_day36"></property>
<property name="username" value="root"></property>
<property name="password" value="1234"></property>
</bean>
 public class AccountDaoImpl2 extends JdbcDaoSupport implements IAccountDao {

     public void saveAccount(Account account) {
getJdbcTemplate().update("insert into account(name,money)values(?,?)",account.getName(),account.getMoney());
} }
c、关于原始版本和改进版的选择问题:

如果是基于XML的配置,则可以使用改进版,也就是Dao抽取类。

如果是基于注解的配置,我们需要在JdbcTemplate上添加注解,由Spring注入。但是JdbcTemplate对象的定义是在JdbcDaoSupport类中,是spring官方jar包里面的,我们修改不了。所以还要使用原始版本。

2.3、数据源

2.3.1、DBCP数据源 BasicDataSource

a、拷贝DBCP的必要jar包:

commons-dbcp.jar commons-pool.jar

b、配置基本的属性

2.3.2、C3P0数据源 ComboPooledDataSource

a、拷贝C3P0的必要jar包:

c3p0-0.9.1.2.jar

b、配置基本的属性

2.3.3、Spring内置数据源DriverManagerDataSource

    <!-- 配置数据源 -->
<bean id="driverManagerDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/ee0413_spring_day36"></property>
<property name="username" value="root"></property>
<property name="password" value="1234"></property>
</bean>

2.3.4、对于原生JDBC配置的支持

把配置信息存到一个.properties文件中。

Java实战之03Spring-04Spring的数据库访问的更多相关文章

  1. Java知多少(107)几个重要的java数据库访问类和接口

    编写访问数据库的Java程序还需要几个重要的类和接口. DriverManager类 DriverManager类处理驱动程序的加载和建立新数据库连接.DriverManager是java.sql包中 ...

  2. java提高数据库访问效率代码优化

    package com.jb.jubmis.comm; import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQL ...

  3. Java 数据库访问层

    最近项目中需要对mysql进行操作,数据库的知识早在本科毕业那会就忘光了,这几年开发都没接触到数据库的操作. 借这个机会重新学习,数据库访问层是对数据库操作的一个封装,屏蔽底层的数据操作细节,通过使用 ...

  4. Java基于数据源的数据库访问

    ☞ 概述 最早接触的Java访问数据库,是通过jdbc接口.后来工作之后,一般是在服务器(如weblogic)配置数据源,通过JNDI使用数据源:最近需要在程序中动态构造数据源,查了些资料,备录于此. ...

  5. 2017.11.5 Java Web ----案例:数据库访问JavaBean的设计

    (12)案例----数据库访问JavaBean的设计 例题:数据库操作在一个Web应用程序中的后台处理中占有大比重,设计一组JavaBean封装数据库的基本操作供上层模块调用,提高程序的可移植性. [ ...

  6. Java实战:教你如何进行数据库分库分表

    摘要:本文通过实际案例,说明如何按日期来对订单数据进行水平分库和分表,实现数据的分布式查询和操作. 本文分享自华为云社区<数据库分库分表Java实战经验总结 丨[绽放吧!数据库]>,作者: ...

  7. 数据库访问性能优化 Oracle

    特别说明: 1.  本文只是面对数据库应用开发的程序员,不适合专业DBA,DBA在数据库性能优化方面需要了解更多的知识: 2.  本文许多示例及概念是基于Oracle数据库描述,对于其它关系型数据库也 ...

  8. Java知多少(112)数据库之删除记录

    删除数据表也有3种方案 一.使用Statement对象 删除数据表记录的SQL语句的语法是: delete from 表名 where 特定条件 例如 : delete from ksInfo whe ...

  9. Java知多少(111)数据库之修改记录

    修改数据表记录也有3种方案. 一.使用Statement对象 实现修改数据表记录的SQL语句的语法是:    update表名 set 字段名1 = 字段值1,字段名2 = 字段值2,……where特 ...

随机推荐

  1. 【Stage3D学习笔记续】山寨Starling(三):Starling核心渲染流程

    这篇文章我们剔除Starling的Touch事件体系和动画体系,专门来看看Starling中的渲染流程实现,以及其搭建的显示列表结构. 由于Starling是模仿Flash的原生显示列表,所以我们可以 ...

  2. 剑指OFFER之二叉树中和为某一值的路径(九度OJ1368)

    题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 输入: 每个测试案例包括n+1行: 第一行为2 ...

  3. Go2Shell

    1.背景 windows系统可以轻而易举地拿到文件所在目录, 但是mac显得想拿文件目录有点蛋疼.而Go2Shell可以快速定位到文件所在的目录. 2.安装配置 选择默认打开的终端软件 3.使用 进入 ...

  4. iOS8 CLLocationManager 、CLGeocoder获取地理位置

    最近在ios8.0使用CLLocationManager定位服务,发现老不能定位,查看设置菜单中的项也是处于未知状态.想起之前都有一个弹出框提示用户是否允许定位,这次一直没有出现了.原来ios8.0下 ...

  5. iBatis调用存储过程以及MySQL创建存储过程

    首先是MySQL中创建存储过程的SQL -- 列出全部的存储过程 SHOW PROCEDURE STATUS; -- 查看一个已存在的存储过程的创建语句,假设此存储过程不存在,会提示SQL错误(130 ...

  6. Samba Linux和Windows互访

    之前一直用的sshfs manager,但是会出现造成电脑黑屏的情况.网上也没找到其它类似的软件. 后面打算用Samba 直接搜到一篇很强大的文章. 1.  下载及安装Samba 推荐用yum来安装, ...

  7. node.js在windows下的学习笔记(5)---用NODE.JS创建服务器和客户端

    //引入http模块 var http = require('http'); //调用http的createServer的方法,这个方法有一个回调函数,这个回调数 //的作用是当有请求发送给服务器的时 ...

  8. Config

    Config Config App Auth Cache Database Languages Mail Modules Routing Session Config Settings for the ...

  9. Java基础知识强化之网络编程笔记20:Android网络通信之 Android常用OAuth登录和分享

    1.  申请百度开发者账号及百度OAuth简介. (1)申请开发者账号: http://developer.baidu.com/ (2)创建项目: http://developer.baidu.com ...

  10. Java基础知识强化之网络编程笔记14:TCP之多个客户端上传到一个服务器的思考(多线程改进)

    1. 多个客户端上传到一个服务器的思考 通过while循环可以改进一个服务器接收多个客户端. 但是这个是有问题的.如果是这种情况,假设我还有张三,李四,王五这三个人分别执行客户端  张三:好好学习.a ...