tceic.com
学霸学习网 这下你爽了
赞助商链接
当前位置:首页 >> 计算机软件及应用 >>

汤阳光


1. 访问数据库

1.1. Spring+JDBC 组合开发

1.1.1. 准备测试用的数据库与表
一、建库: create database spring_jdbc; 二、建表: CREATE TABLE jdbcUser ( id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(45), age INTEGER UNSIGNED, PRIMARY KEY (`id`) )

1.1.2. 配置数据源(c3p0)
使用 c3p0 连接池,需要先把 c3p0 的 jar 包添加到工程中。我们在配置时把数据库连接信 息放到外面单独的 jdbc.properties 文件中。

<!-- 使用外部的properties配置文件 --> <context:property-placeholder location="classpath:jdbc.properties" /> <!-- 定义c3p0数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 数据库连接信息 --> <property name="jdbcUrl" value="${jdbcUrl}"></property> <property name="driverClass" value="${driverClass}"></property> <property name="user" value="${username}"></property> <property name="password" value="${password}"></property> <!-- 其他配置 --> <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> <property name="initialPoolSize" value="3"></property> <!--连接池中保留的最小连接数。Default: 3 --> <property name="minPoolSize" value="3"></property> <!--连接池中保留的最大连接数。Default: 15 --> <property name="maxPoolSize" value="5"></property> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> <property name="acquireIncrement" value="3"></property> <!--最大空闲时间,1800秒内未使用则连接被丢弃,若为0则永不丢弃。Default: 0 --> <property name="maxIdleTime" value="1800"></property> </bean>

jdbc.properties:
jdbcUrl = jdbc:mysql://localhost:3306/jdbc driverClass = com.mysql.jdbc.Driver username = root password = 1234

1.1.3. 配置 JdbcTemplate
JdbcTemplate 是线程安全的,所以可以使用单例的模式。
<!-- 定义JdbcTemplate --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean>

使用 JdbcTemplate 可以方便 JDBC 开发,他使用了“模板方法模式”与“回调接口”的技巧。

1.1.4. JdbcTemplate 的 execute(..)方法

public void addUser(final User user) { jdbcTemplate.execute(new ConnectionCallback() { public Object doInConnection(Connection con) throws SQLException, DataAccessException { String sql = "insert into t_user(name, age) values(?,?)"; PreparedStatement ps = con.prepareStatement(sql); ps.setString(1, user.getName()); ps.setInt(2, user.getAge()); ps.execute(); ps.close(); return null; } }); }

对于增删改查,我们一般还是使用他提供的其他的方实现,比使用这个方法更方便。

1.1.5. 使用 JdbcTemplate 做增删改操作

// insert操作 public void addUser(final User user) { jdbcTemplate.update("insert into t_user(name, age) values(?,?)", new Object[] { user.getName(), user.getAge() }); // 有null值也没问题 } // update操作 public void updateUser(User user) { jdbcTemplate.update("update t_user set name=?, age=? where id=?", // new Object[] { user.getName(), user.getAge(), user.getId() }); } // delete操作 public void deleteUser(Integer id) { jdbcTemplate.update("delete from t_user where id=?", new Object[] { id }); }

因为 Connection 默认 autoCommit=true, 所以可以提交事务, 从数据库中可以看到

数据更改了。

1.1.6. 使用 JdbcTemplate 做查询操作

// 查询一条记录 public User queryById(final Integer id) { String sql = "select name,age from t_user where id=?"; public Object mapRow(ResultSet rs, int rowNum) throws SQLException { String name = rs.getString("name"); int age = rs.getInt("age"); return new User(id, name, age); } }); } // 查询数据列表 public List<User> queryAll() { String sql = "select id,name,age from t_user"; return jdbcTemplate.query(sql, new RowMapper() { public Object mapRow(ResultSet rs, int rowNum) throws SQLException { Integer id = rs.getInt(1); String name = rs.getString(2); Integer age = rs.getInt(3); return new User(id, name, age); } }); } // 查询记录总数量 public int queryCount() { String sql = "select count(*) from t_user"; return jdbcTemplate.queryForInt(sql); }

return (User)jdbcTemplate.queryForObject(sql, new Object[] {id}, new RowMapper()

1.2. 事务管理
1.2.1. 事务的概念
事务是一组操作的执行单元,相对于数据库操作来讲,事务管理的是一组 SQL 指令,比 如增加,修改,删除等,事务的一致性,要求,这个事务内的操作必须全部执行成功,如果

在此过程种出现了差错,比如有一条 SQL 语句没有执行成功,那么这一组操作都将全部回滚 仅用四个词解释事务(ACID) atomic(原子性):要么都发生,要么都不发生。 consistent(一致性):数据应该不被破坏。 Isolate(隔离性):用户间操作不相混淆 Durable(持久性):永久保存,例如保存到数据库中等

1.2.2. 数据库系统的四种事务隔离级别
隔离级别 READ_UNCOMMITED READ_COMMITTED REPEATABLE_READ SERIALIZABLE 含义 允许你读取还未提交的改变了的数据。可能导致脏、幻、不可 重复读 允许在并发事务已经提交后读取。可防止脏读,但幻读和 不可 重复读仍可发生 对相同字段的多次读取是一致的,除非数据被事务本身改变。 可防止脏、不可重复读,但幻读仍可能发生。 完全服从 ACID 的隔离级别,确保不发生脏、幻、不可重复读。 这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在 事务中涉及的数据表来完成的。

? ? ? ?

Read Uncommited:读未提交数据(会出现脏读,不可重复读和幻读)。 Read Commited:读已提交数据(会出现不可重复读和幻读) Repeatable Read:可重复读(会出现幻读) Serializable:串行化 使用后端数据库默认的隔离级别(spring 中的的选择项)

DEFAULT

脏读: 一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚, 则读到的数据 是无效的。 不可重复读: 在同一事务中,多次读取同一数据返回的结果有所不同。换句话说就是,后续读取可以 读到另一事务已提交的更新数据。相反,“可重复读”在同一事务中多次读取数据时,能够保 证所读数据一样,也就是,后续读取不能读到另一事务已提交的更新数据。 幻读: 一个事务读取了几行记录后, 另一个事务插入一些记录, 幻读就发生了。 再后来的查询中, 第一个事务就会发现有些原来没有的记录。

不同的隔离级别采用不同的锁类型来实现,在四种隔离级别中,Serializable 的隔离 级别最高,Read Uncommited 的隔离级别最低。 ? ? ? 大多数据库默认的隔离级别为 Read Commited,如 SqlServer 当然也有少部分数据库默认的隔离级别为 Repeatable_Read ,如 Mysql, Oracle 数据库支持 READ COMMITTED 和 SERIALIZABLE 两种事务隔离性级别,不支 持 READ UNCOMMITTED 和 REPEATABLE READ 这两种隔离性级别。虽然 SQL 标准定义 的默认事务隔离性级别是 SERIALIZABLE,但是 Oracle 数据库默认使用的事务隔离性 级别却是 READ COMMITTED.

标准中定义的有 4 种,MySQL 支持 4 种,Oracle 只支持 2 种。默认值也不一样。

1.2.3. Spring 对事务管理的支持
Spring 提供了两种事务管理方式: 编程式事务管理: 编写程序式的事务管理可以清楚的定义事务的边界,可以实现细粒度的事务控制,比如 你可以通过程序代码来控制你的事务何时开始,何时结束等,与后面介绍的声明式事务管理 相比,它可以实现细粒度的事务控制。 声明式事务管理: 如果你并不需要细粒度的事务控制,你可以使用声明式事务,在 Spring 中,你只需要 在 Spring 配置文件中做一些配置, 即可将操作纳入到事务管理中, 解除了和代码的耦合, 这 是对应用代码影响最小的选择。当你不需要事务管理的时候,可以直接从 Spring 配置文件 中移除该设置

如果使用 Spring, 我们就不再需要手工控制事务:

1.2.4. 事务传播规则(传播行为)

传播行为:定义关于客户端和被调用方法的事物边界 传播行为 REQUIRED (默认值) 意义 业务方法需要在一个事务中运行。如果方法运行时,已经处在一个 事务中,那么加入到该事务,否则为自己创建一个新的事务 它开启事务。如果方法在一个事务中被调用,该事务会被挂起,在 方法调用结束后,原先的事务便会恢复执行 REQUIRESNEW 属性表明不管是否存在事务,业务方法总会为自己发起一个新的事 务。如果方法已经运行在一个事务中,则原有事务会被挂起,新的 事务会被创建,直到方法执行结束,新事务才算结束,原先的事务 才会恢复执行 该属性指定业务方法只能在一个已经存在的事务中执行,业务方法 不能发起自己的事务。如果业务方法在没有事务的环境下调用,容 器就会抛出例外。

NOT_SUPPORTED 声明方法不需要事务。如果方法没有关联到一个事务,容器不会为

MANDATORY

SUPPORTS

这一事务属性表明,如果业务方法在某个事务范围内被调用,则方 法成为该事务的一部分。如果业务方法在事务范围外被调用,则方 法在没有事务的环境下执行 指定业务方法绝对不能在事务范围内执行。如果业务方法在某个事 务中执行,容器会抛出例外,只有业务方法没有关联到任何事务, 才能正常执行 如果一个活动的事务存在, 则运行在一个嵌套的事务中. 如果没有 活动事务, 则按 REQUIRED 属性执行.它使用了一个单独的事务, 这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部 事务造成影响。 它只对 DataSourceTransactionManager 事务 管理器起效

Never

NESTED

1.2.5. 事务管理器
spring 没有直接管理事务, 而是将管理事务的责任委托给 JTA 或相应的持久性机制所提 供的某个特定平台的事物实现

事务管理器实现

目标

org.springframework.jdbc.datasource.DataSourceTransaction 在 单 一 的 JDBC Manager Datasourc e 中的管理 事务 org.springframework.orm.hibernate3.HibernateTransactionMa 当 持 久 化 机 nager 制 是 hibernate 时,用它来 管理事务 org.springframework.jdo.JdoTransactionManager 当持久化机 制 是 Jdo 时,用它来 管理事务。

org.springframework.transaction.jta.JtaTransactionManager 使 用 一 个 JTA 实现来 管理事务。 在一个事务 跨越多个资 源时必须使 用

org.springframework.orm.ojb.PersistenceBrokerTransactionM 当 apache anager 的 ojb 用作 持久化机制 时,用它来 管理事务。

1.2.6. 声明式事务管理——基于 XML 配置
1.2.6.1. 在 spring 配置文件中引入 tx 命名空间

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

1.2.6.2. 在 spring 配置文件中做关于事务管理的配置

<!-- 1,配置事务管理器(应根据情况使用合适的事务管理器) --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 2,配置管理事务的“通知” --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <!-- 配置哪些方法要使用什么样的事务配置,没有匹配到的方法不会为其管理事务 --> <tx:attributes> <!-- 指定所有以add,delete,update开头的方法都使用事务, 默认read-only="false" --> <tx:method name="add*" /> <tx:method name="delete*" /> <tx:method name="update*" /> <!-- 指定所有以query开头的方法都是使用只读的事务 --> <tx:method name="query*" read-only="true" /> </tx:attributes> </tx:advice> <!-- 3,配置切面 --> <aop:config> <!-- 指定拦截所有Dao中的方法 --> <aop:advisor advice-ref="txAdvice" pointcut="execution(* *..*Dao*.*(..))" /> </aop:config>

<!-- the transactional advice (what 'happens'; see the <aop:advisor/> bean below) -->
<tx:advice id="txAdvice" transaction-manager="txManager">

<!-- the transactional semantics... -->
<tx:attributes>

<!-- all methods starting with 'get' are read-only -->
<tx:method name="get*" read-only="true"/>

<!-- other methods use the default transaction settings (see below) -->
<tx:method name="*"/> </tx:attributes> </tx:advice>

1.2.7. 声明式事务管理——基于注解配置
1.2.7.1. 在 spring 中要做的配置

1.2.7.2. 在类上写注解声明要使用事务

// 添加数据操作,readOnly默认为false @Transactional public void addUser(final User user) { jdbcTemplate.update("insert into t_user(name, age) values(?,?)", new Object[] { user.getName(), user.getAge() }); } // 查询记录总数量,查询时可以设置为只读的 @Transactional(readOnly = true) public int queryCount() { String sql = "select count(*) from t_user"; return jdbcTemplate.queryForInt(sql); }

1.2.7.3. @Transactional 注解说明
方法的事务设置将被优先执行。 例如: UserServiceImpl 类在类的级别上被注解为只 读事务,但是,这个类中的 addUser(User uesr) 方法的@Transactional 注解的事务 设置将优先于类级别注解的事务设置。 @Transactional 注解可以被继承,即:在父类上声明了这个注解,则子类中的所有 public 方法也都是会开事务的。

2. 与 Hibernate3 整合
2.1. 分别添加 Hibernate3 与 Spring 的开发环境
略。

2.2. 在 Spring 中配置 SessionFactory
<!-- 配置SessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"/> <property name="dataSource"> <bean class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 数据库连接信息 --> <property name="jdbcUrl" value="${jdbcUrl}"></property> <property name="driverClass" value="${driverClass}"></property> <property name="user" value="${username}"></property> <property name="password" value="${password}"></property> <!-- 其他配置信息 --> <property name="initialPoolSize" value="3"></property> <property name="maxPoolSize" value="5"></property> <property name="minPoolSize" value="3"></property> <property name="acquireIncrement" value="2"></property> <property name="maxIdleTime" value="20"></property> </bean> </property> </bean>

2.3. 在 Spring 中配置声明式事务管理

<!-- 自动扫描与装配bean --> <context:component-scan base-package="cn.itcast"></context:component-scan> <!-- 配置Hibernate用的事务管理器,需要注入SessionFactory对象 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 采用基于注解的方式配置事务 --> <tx:annotation-driven transaction-manager="transactionManager" />

2.4. 在 DaoImpl 中使用 Hibernate 做数据库操作并配置 事务
2.4.1. 方法一:使用 HibernateTemplate
2.4.1.1. 配置 HibernateTemplate

<!-- 配置HibernateTemplate --> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean>

2.4.1.2. 使用 HibernateTemplate 做增删改查操作


2.4.2. 方法二:使用注入的 SessionFactory(推荐)

// 在类上声明@Transactional注解,表示所有public方法都需要事务 @Transactional @Repository("userDao") public class UserDaoImpl implements UserDao { // 注入sessionFactory @Resource private SessionFactory sessionFactory; // 一定要使用SessionFactory.getCurrentSession()才可以 public void save(User user) { sessionFactory.getCurrentSession().save(user); } // 一定要使用SessionFactory.getCurrentSession()才可以 public void delete(Long id) { Object obj = getSession().get(User.class, id); getSession().delete(obj); } // 一定要使用SessionFactory.getCurrentSession()才可以 // 在方法上也定义了@Transactional,设为只读的事务 @Transactional(readOnly = true) public User getById(Long id) { return (User) getSession().get(User.class, id); } }

这种方式不依赖 Spring 的 API,所以推荐使用。

2.5. 使用 Spring 的 OpenSessionInViewFilter 解决 在 Web 应用中 Hibernate 懒加载异常的问题
一、懒加载问题与解决方案说明:

二、在 web.xml 中配置 Spring 的 OpenSessionInViewFilter 以解决这个问题:
<!-- 配置Spring的OpenSessionInViewFilter,以解决懒加载异常的问题 --> <filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class> <init-param> <!-- 配置SessionFactory这个bean的名称,如果不指定,默认为sessionFactory --> <param-name>sessionFactoryBeanName</param-name> <param-value>sessionFactory</param-value> </init-param> </filter> <!-- 配置要拦截的资源特征 --> <filter-mapping> <filter-name>OpenSessionInViewFilter</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping>

3. SSH 整合



推荐相关:

汤阳光_Oracle课程文档(四)_图文

汤阳光_Oracle课程文档(四)_计算机软件及应用_IT/计算机_专业资料。1. 存储过程和存储函数 1.1. 存储过程与存储函数说明指存储在数据库中供所有用户程序调用的子...


汤阳光_Oracle课程文档(一)_图文

汤阳光_Oracle课程文档(一)_计算机软件及应用_IT/计算机_专业资料。数据库 1. Oracle 基础 1.1. Oracle 简介 Oracle 是殷墟(yīn Xu)出土的甲骨文(oracle bone...


汤阳光_Spring2.5课程文档(一)

汤阳光_Spring2.5课程文档(一)_计算机软件及应用_IT/计算机_专业资料。1. Spring 基础 1.1. 开发应用时的一些问题 1.1.1. 问题一:依赖在程序中要分层,且层...


汤阳光_Lucene3.0课程

汤阳光_Lucene3.0课程_计算机软件及应用_IT/计算机_专业资料 暂无评价|0人阅读|0次下载|举报文档 汤阳光_Lucene3.0课程_计算机软件及应用_IT/计算机_专业资料。传智...


汤阳光_Oracle课程文档(四)

汤阳光_Oracle课程文档(四)_计算机软件及应用_IT/计算机_专业资料。1. 存储过程和存储函数 1.1. 存储过程与存储函数说明指存储在数据库中供所有用户程序调用的子...


hibernate课程文档(全)

hibernate课程文档(全)_计算机软件及应用_IT/计算机_专业资料。传智播客汤阳光的hibernate课程文档1 1. Java 对象持久化概述 1.1. 应用程序的分层体系结构 1.1....


汤阳光_Oracle课程文档(三)

汤阳光_Oracle课程文档(三) 隐藏>> 1. PL/SQL 程序设计 1.1. 什么是 PL/SQL ? ? ? PL/SQL(Procedure Language/SQL) PLSQL 是 Oracle 对 sql 语言的过...


FCKeditor学习笔记

传智播客 fckeditor 学习笔记 教师:汤阳光 1_演示使用了 FCKeditor 的论坛 (1) 官方网站:http://www.fckeditor.net (2) 所见即所得的编辑器 2_资料下载及...


java推荐

更多内容需要参照 Spring 官方的 reference,写的比书还好 o 参考书籍:《Spring in Practice》 Hibernate o 参考视频:传智汤阳光(推荐)、尚学堂马士兵(经典但太老)...


软工JAVA课程设计

北京:电子工业出版社, 2013.11 2 汤阳光. 智播客贪食蛇游戏项目开发 3 耿祥义 .JAVA 大学实用教程 . 北京:清华大学出版社, 2009 附录 A 源代码 //GreedSnake...

网站首页 | 网站地图
All rights reserved Powered by 学霸学习网 www.tceic.com
copyright ©right 2010-2021。
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@126.com