四、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. OC/Swift第三方添加出错解决方法

    (未经同意,不得转载!) ------------------------华丽分割线-----------------------

  2. Android Studio 编译不通过,报错“找不到org.apache.http

    如果你使用的 target sdk是23请在build.gradle加入 android{ useLibrary ‘org.apache.http.legacy‘ }

  3. LetterView实现载入全国各地城市

    近期更具eoe论坛上的letteView案例(   eoe)自己做了一个LetterView载入全国城市的案例,欢迎大家互相学习和交流, 相对于eoe那个案例稍微修改了一下,利用json存储全国城市数 ...

  4. OSI七层模型具体解释

    OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最基本的功能就是帮助不同类型的主机实现传输数据 . 完毕中继功能的节点通常称为中继系统.在OSI七层模型中,处于 ...

  5. pomelo windows 安装笔记

    1.安装nodejs http://nodejs.org/download/...这个简单.. 2.下载pomelo..并且 安装所需要的包.未能加载visual c++组件 “VCBuild.exe ...

  6. 信号之alarm和pause函数

    使用alarm函数可以设置一个计时器,在将来某个指定的时间,该计时器会超时.当计时器超时时,产生SIGALRM信号.如果不忽略或不捕捉此信号,则其默认动作是终止调用该alarm函数的进程. #incl ...

  7. PAT 1011

    1011. World Cup Betting (20) With the 2010 FIFA World Cup running, football fans the world over were ...

  8. (原)nginx 源码编译

    要在nginx上开发,所以先了解下这个是干嘛的..百度一下很多 编译源码需要的组件 1.zlib 2.pcre 3.openssl 使用ubuntu的话.可以直接使用 sudo apt-get ins ...

  9. CSS字体大小设置时的参考(转)

    from:http://blog.sina.com.cn/s/blog_51cd580b0100gg6y.html font-size 设置的绝对关键字: 以下几个绝对字体大小的设置是有效的.当然他们 ...

  10. VMware:虚拟机磁盘空间不足怎么办

    前言: 虚拟机里一般我们用的虚拟磁盘,在电脑上是一个或多个文件,随着软件和数据的增多,有时也会提示磁盘空间不足. 那么,虚拟机磁盘空间不足如何处理呢?   一:调整磁盘分区大小; 若只是提示相应磁盘分 ...