Spring集成JDBC:提供了一些方便我们使用JDBC的工具类;

query(String,ResultSetHandler handler,Object..parm){
Connection connect=dataSource.getConnection();
connect.preparedStatement();
for(){
ps.setObject();
}
ResultSet rs=ps.executeQuery();
List ret=handler.handle(rs);
return ret;
} update(String sql,Object..param){
Connection connect=dataSource.getConnection();
connect.preparedStatement();
for(){
ps.setObject();
}
int rs=ps.executeUpdate();
return rs;
}

1,在Spring中,主要使用JDBCTemplate来完成我们的JDBC代码;
2,使用SpringJDBC
  1),在Spring中配置一个dataSource;
  2),完成DAO:
    1),dao中需要一个jdbcTemplate对象;
    2),不需要setJdbcTemplate,而是使用setDataSource;用传入的dataSource去new JdbcTemplate(dataSource);
    3),使用jdbcTemplate上的方法来完成JDBC代码;
    4),jdbcTemplate.update(String,Object..params):一般用来DML;
    5),jdbcTemplate.query(String,ResultSetExtractor/RowMapper,Object..parmas):一般用来查询;
      1,ResultSetExtractor:需要自己手动遍历结果集;
      2,RowMapper:spring榜我们遍历结果集,我们只需要在这个对象中映射每一行数据;

SpringJDBC补充:
1,Spring提供了JdbcDaoSupport类,在这个类里面帮我们封装了jdbcTemplate的创建过程,我们的DAO只需要继承JdbcDaoSupport类,就可以了,
  1),使用this.getJdbcTemplate()获得jdbcTemplate;
  2),在Spring配置文件中,还是要为dao设置dataSource:

2,使用占位符的方式 把数据库连接信息放到额外的配置文件中;
  1),把xml配置文件中的值改成类似EL表达式的方式,
  2),创建一个配置文件x.properties,要求,properties文件中的key值需要和spring中配置的占位符的名字匹配
  3),在XML配置文件中导入占位符配置文件;

    <!-- 配置连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="driverClassName" value="${db.driverClassName}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</bean>
    <!-- 导入占位符配置文件${jdbc.xxx}
location:配置文件地址,可以使用前缀
-->
<context:property-placeholder location="classpath:db.properties"/>
//db.properties
#key=value
db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/spring
db.username=root
db.password=admin

3,spring配置文件的继承;
  1),抽象的类是不能直接配置在spring中的,需要在bean元素上面添加abtract=true属性;
  2),子类要继承父类的配置,必须要在bean元素上面添加parent属性,指向父bean的引用;
  3),在spring配置文件中,其实是没有继承的概念;
    1,一个bean是可以不需要class属性的,但是如果一个bean没有class属性,那么一定要添加abstract=true;代表这个bean是不需要去实例化的,这个bean是用来给其他的配置文件做继承的;
    2,parent属性并不是代表对象的继承关系,它代表的是配置文件的拷贝;

    <!-- 不能实例化的对象想配置在Spring里面,
abstract="true":代表这个类是抽象的,不用实例化
因为这个bean不需要实例化,所以不用编写class属性
-->
<bean id="baseDAO" abstract="true">
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 在子类中要配置parent属性,指向父类bean的引用 -->
<bean id="employeeDAO" class="com.rk1632._01_jdbc.EmployeeDAOImpl" parent="baseDAO"/> <!-- 在子类中要配置parent属性,指向父类bean的引用 -->
<bean id="deptDAO" class="com.rk1632._01_jdbc.DepartmentDAOImpl" parent="baseDAO"/>

Spring中事务的管理:
1,事务要开在service上;
2,PlatformTranscationManager:Spring中的事务管理器;
  1),TransactionStatus getTransaction():开启事务;
  2),void commit(TransactionStatus status):提交事务;
  3),void rollback(TransactionStatus status):回滚事务;
3,TransactionStatus:可以简单理解为创建的事务对象;

4,Spring中提供的常用的事务管理器;
我们需要注意的:
  1),DataSourceTranscationManager:针对JDBC;
  2),HibernateTranscationManager:针对Hibernate(版本);
  3),JpaTransactionManager:针对JPA;

spring管理事务:
1,配置一个和我们的持久化方式匹配的事务管理器;

    <!-- 配置事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

2,因为我们使用的是JDBC,所以选择DataSourceTranscationManager;
  1),在这个txManager中一定要传入一个DataSource;
  2),由这个dataSource来得到连接,管理事务;
  3),注意,这个传入的dataSource已经被spring代理过了,在调用getConnection的时候,实际上得到的是当前线程中的Connection;
3,配置事务

  1),配置datasource
  2),配置baseDAO和transactionManager(使用同一个datasource);
  3),配置service;
  4),配置事务通知(tx:advice)
    1),名字(id):被切面引用;
    2),transaction-manager:在事务通知中,真正的执行开启事务,提交事务,回滚;
    3),配置事务属性:控制拦截到的不同的方法,具体怎么处理事务
  5),配置aop:
    1),配置切入点(aop:point-cut);
    2),配置aop:advisor(pointCut-ref/advice-ref)(把通知和切入点连起来)

配置事务属性:

1,tx:method是从上向下匹配的,一般最后一个tx:method的name="*",用来匹配上面方法匹配不到的其他方法的事务处理方式;
2,read-only:开启一个只读的事务,只读的事务性能较高,不能在只读的事务中做DML操作;
3,isolation:隔离级别
  1),DEFAULT:使用数据库默认的隔离级别;
  2),注意,这个属性一般填写为DEFAULT(默认),这个事务隔离级别是spring模拟出来;
4,rollback-for:遇到什么异常事务要回滚(默认情况下,spring只有遇到RuntimeException才会回滚);
5,propagation:事务的传播方式(默认是REQUIRED);
  1),常用:REQUIRED,REQUIRES_NEW;
  2),一般来说,tx:method最后一个方法都写作REQUIRED

使用Annotation配置事务:
1,在service方法或者类上面添加@Transactional标签;
  1),如果在类上面,相当于为类中的所有方法创建了一个默认的事务控制方式;
  2),如果要覆盖掉默认的方式,只需要在方法上面再重新写一次@Transactional
2,在spring的配置文件中,使用<tx:annotation-drivern>标签来引入用于解析@Transactional标签的第三方应用;

选择:建议使用配置文件的方式;

Spring-day03的更多相关文章

  1. Spring day03笔记

    spring day02回顾 AOP :切面编程 切面:切入点 和 通知 结合 spring aop 编程 <aop:config> 方法1: <aop:pointcut expre ...

  2. 开放源代码的设计层面框架Spring——day03

    spring第三天     一.AOP的相关概念         1.1AOP概述             1.1.1什么是AOP                 AOP:全称是Aspext Orie ...

  3. Spring day04笔记(SVN讲解和回顾昨天知识)

    spring day03回顾 事务管理 基于xml配置 1.配置事务管理器 jdbc:DataSourceTransactionManager hibernate:HibernateTransacti ...

  4. Spring day01笔记

    struts:web层,比较简单(ValueStack值栈,拦截器) hibernate:dao层,知识点杂 spring:service层,重要,讲多少用多少 --> [了解]   sprin ...

  5. spring框架入门day01

    struts:web层,比较简单(ValueStack值栈,拦截器) hibernate:dao层,知识点杂 spring:service层,重要,讲多少用多少  --> [了解] spring ...

  6. Spring-Day03-注解注入&AOP入门-作业

    IOC(DI) —— 注解 注解入门: 在applicationContext.xml中引入context约束 打开spring-framework-4.2.4.RELEASE\docs\spring ...

  7. Spring Boot 注解配置 day03

    一.SpringBoot注解 @PropertySource 和 @ImportResource和@Bean 1.@PropertySource 加载指定位置的配置文件(只能是properties文件 ...

  8. 传智播客JavaWeb day03

    ServletContext 这堂课主要讲ServletContext这个web域(可以看得见范围的)对象,web在启动的时候会创建唯一的ServletContext域对象. 作用:1.用来web域共 ...

  9. SSM-Spring-02:Spring的DI初步加俩个实例

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- DI:依赖注入 第一个DEMO:域属性注入 java类:(Car类和Stu类,学生有一辆小汽车) packag ...

  10. 课程5:Spring框架2016版视频--视频列表目录

    \day01视频\01-今天内容介绍.avi; \day01视频\02-spring的相关概念.avi; \day01视频\03-spring的ioc底层原理(一).avi; \day01视频\04- ...

随机推荐

  1. Vue技术内幕 出去看看吧 榨干部分小细节

    vue\src\platforms\web\entry-runtime-with-compiler.js /** * Get outerHTML of elements, taking care * ...

  2. django drf 基础学习5

    一 简介: 用户登录的验证 二 验证机制:    1 session session需要在服务端存储能够通过session_id而获取的信息,每次请求到达服务端时,需要根据session_id这个ke ...

  3. 网络(最大)流初步+二分图初步 (浅谈EK,Dinic, Hungarian method:]

    本文中  N为点数,M为边数: EK: (brute_force) : 每次bfs暴力找到一条增广路,更新流量,代码如下 : 时间复杂度:O(NM²): #include<bits/stdc++ ...

  4. 转 -Filebeat + Redis 管理 LOG日志实践

    Filebeat + Redis 管理 LOG日志实践 小赵营 关注 2019.01.06 17:52* 字数 1648 阅读 24评论 0喜欢 2 引用 转载 请注明出处 某早上,领导怒吼声远远传来 ...

  5. CKEditor5 + vue2.0 自定义图片上传、highlight、字体等用法

    因业务需求,要在 vue2.0 的项目里使用富文本编辑器,经过调研多个编辑器,CKEditor5 支持 vue,遂采用.因 CKEditor5 文档比较少,此处记录下引用和一些基本用法. CKEdit ...

  6. 服务器资源迁移到aliyun对象存储及oss的权限管理配置

    chinasoft-download增值服务的迁移和部署 需求: 增值服务网站需要从网宿迁移到阿里云,以前的增值服务历史软件存放在服务器中需要迁移到阿里云的oss中存放 需要改造程序给程序添加一个os ...

  7. 【原创】大数据基础之Impala(1)简介、安装、使用

    impala2.12 官方:http://impala.apache.org/ 一 简介 Apache Impala is the open source, native analytic datab ...

  8. JAVA 求数组中的最大值

    package Code411;//求数组的最大值public class CodeArrayMax { public static void main(String[] args) { int ar ...

  9. file_get_contents函数偶尔报错的抑制显示

    $result = @file_get_contents($url);可以使用@进行抑制file_get_contents()的报错 @是为了抑制错误显示,让用户看不到,提升用户体验.注意:只是抑制错 ...

  10. vue组件,通过props父组件给子组件传值,WTF, 子组件报错undefined???

    如果是正常操作,找了半天又找不到为什么undefined, 那很可能是props的命名出了问题: 不要用小驼峰式命名 例如这种childrenData 这种形式就会报错undefined  请尽量用全 ...