JavaWeb——Spring 系列

四、Spring AOP的 DAO

1、DAO 介绍

  • DAO,Data Access Object,顾名思义适用于操作数据库的。Spring 的 DAO 是 O/R Mapping 技术的一种实现。
  • Spring DAO 提供了如下几种抽象类:
  • 1)jdbcDaoSupport:JDBC DAO 抽象类,当设置好数据源之后,通过子类可以获得 jdbcTemplate 来访问数据库。
  • 2)HibernateDaoSupport:Hibernate DAO 抽象类,同样的配置号 Hibernate SessionFactory 后,通过子类可以获得 Hibernate 实现。
  • 3)jdoDaoSupport:JDO DAO 抽象类,同样需要配置 PersistenceManagerFactory,通过子类可以获得 jdoTemplate。

2、Spring DAO 简单实例

  • 首相建立一个 User 类,代码如下:

    //IntelliJ IDEA
    //Sprin01
    //User
    //2020/1/15
    // Author:御承扬
    //E-mail:2923616405@qq.compackage com.myCode.DAOCode;public class User {private Integer id;private String name;private Integer age;private String sex;public void setId(Integer id) {this.id = id;}public Integer getId() {return id;}public void setName(String name) {this.name = name;}public String getName() {return name;}public void setAge(Integer age) {this.age = age;}public Integer getAge() {return age;}public void setSex(String sex) {this.sex = sex;}public String getSex() {return sex;}
    }
    
  • 根据 User 的属性,在 MySQL 的是当数据库建立一个 user 表。
  • 新建一个接口抽象类和一个实现类,代码如下:
    package com.myCode.DAOCode;public interface UserDAOImpl {public void insertUser(User user);
    }
    
    package com.myCode.DAOCode;import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.sql.Statement;public class UserDAO implements UserDAOImpl {private DataSource dataSource;public DataSource getDataSource() {return dataSource;}public void setDataSource(DataSource dataSource) {this.dataSource = dataSource;}@Overridepublic void insertUser(User user) {String name = user.getName();Integer age = user.getAge();String sex = user.getSex();Connection conn = null;Statement stmt = null;try {conn = dataSource.getConnection();stmt = conn.createStatement();stmt.execute(String.format("INSERT INTO user(name,age,sex)VALUES( '%s',%d,'%s')", name, age, sex));} catch (SQLException e) {e.printStackTrace();}finally {if(stmt!=null){try{stmt.close();}catch (SQLException e){e.printStackTrace();}}if(conn != null){try{conn.close();}catch (SQLException e){e.printStackTrace();}}}}
    }
    
  • 接着在 ApplicationContext.xml 中配置:
     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8"/><property name="username" value="root"/><property name="password" value="******"/>
    </bean>
    <bean id="userDAO" class="com.myCode.DAOCode.UserDAO"><property name="dataSource" ref="dataSource"/>
    </bean>
    
  • 最后建立一个 Manager 类
    package com.myCode.DAOCode;import org.springframework.beans.factory.BeanFactory;
    import org.springframework.beans.factory.xml.XmlBeanFactory;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.core.io.Resource;public class DAOManager {public static void main(String[] args) {Resource resource = new ClassPathResource("applicationContext.xml");BeanFactory factory = new XmlBeanFactory(resource);User user = new User();user.setName("张三");user.setAge(20);user.setSex("男");UserDAO userDAO = (UserDAO)factory.getBean("userDAO");userDAO.insertUser(user);System.out.println("添加数据成功!!!");}
    }
    

3、基于 AOP的DAO 模式的 Spring 事务

  • Spring 的事务基于 AOP 实现的,由于 Spring 的 AOP 是以方法为单位的,所以 Spring 的事务属性就是对事务应用到方法上的策略描述。
  • 事务的管理分为:编程式事务管理和声明式事务管理。

3.1、编程式事务管理

  • Spring 中通过 PlatformTransactionManager 接口的事务管理器或 TransactionTemplate 实现编程式事务管理;后者更为符合 Spring 的模板模式。
  • 示例
  • 首先新建一个 TransactionExample,其代码如下:
    package com.myCode.DAOCode.transaction;
    import org.springframework.jdbc.datasource.DataSourceUtils;
    import org.springframework.transaction.PlatformTransactionManager;
    import org.springframework.transaction.TransactionStatus;
    import org.springframework.transaction.support.TransactionCallback;
    import org.springframework.transaction.support.TransactionTemplate;import javax.annotation.Resource;
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.sql.Statement;@Resource(name = "transactionManager")
    public class TransactionExample {DataSource dataSource;  //注入数据源PlatformTransactionManager transactionManager; //注入事务管理器TransactionTemplate transactionTemplate; //注入TransactionTemplate 模板public void setDataSource(DataSource dataSource) {this.dataSource = dataSource;}public DataSource getDataSource() {return dataSource;}public void setTransactionManager(PlatformTransactionManager transactionManager) {this.transactionManager = transactionManager;}public PlatformTransactionManager getTransactionManager() {return transactionManager;}public void setTransactionTemplate(TransactionTemplate transactionTemplate) {this.transactionTemplate = transactionTemplate;}public TransactionTemplate getTransactionTemplate() {return transactionTemplate;}public void transactionOperation(){transactionTemplate.execute(new TransactionCallback() {@Overridepublic Object doInTransaction(TransactionStatus transactionStatus) {Connection conn = DataSourceUtils.getConnection(dataSource);//获得数据库连接try{Statement stmt = conn.createStatement();stmt.execute("insert into user(name,age,sex) values('小强',26,'男')");int a=0;    //制造异常测试事务是否配置成功a=9/a;stmt.execute("insert into user(name,age,sex) values('Tonny',24,'女')");System.out.println("执行成功");}catch (Exception e){transactionManager.rollback(transactionStatus);System.out.println("操作执行失败,事务回滚!");System.out.println("原因:"+e.getMessage());}return null;}});}
    }
    
  • 接着进行配置,配置代码如下:
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8"/><property name="username" value="root"/><property name="password" value="********"/>
    </bean>
    <!--定义 TransactionTemplate模板-->
    <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"><property name="transactionManager" ref="transactionManager"/><property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/>
    </bean>
    <!-- 定义事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- 为TransactionExample注入数据源 、事务管理器、TransactionTemplate模板-->
    <bean id="transactionExample"class="com.myCode.DAOCode.transaction.TransactionExample"><property name="dataSource" ref="dataSource"/><property name="transactionManager" ref="transactionManager"/><property name="transactionTemplate" ref="transactionTemplate"/>
    </bean>
    
  • 在建立一个 Manager类:
    package com.myCode.DAOCode.manager;import com.myCode.DAOCode.transaction.TransactionExample;
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.context.support.ClassPathXmlApplicationContext;public class TransactionManage {public static void main(String[] args) {BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");TransactionExample example = (TransactionExample)factory.getBean("transactionExample");example.transactionOperation();}
    }
    

3.2、声明式事务管理

  • Spring 用 TransactionProxyFactoryBean 完成声明式事务管理,示例如下:
  • 首先建立一个事务类,用于向 user 表插入数据,代码如下:
    package com.myCode.DAOCode.DAO;
    import com.myCode.DAOCode.bean.User;
    import org.springframework.jdbc.core.support.JdbcDaoSupport;public class AddDAO extends JdbcDaoSupport{public void addUser(User user){String sql = String.format("insert into user(name,age,sex) values('%s',%d,'%s')",user.getName(),user.getAge(),user.getSex());try{assert getJdbcTemplate() != null;getJdbcTemplate().execute(sql);}catch (Exception e){System.out.println("执行失败,原因:"+e.getMessage());}}
    }
    
  • 在 applicationContext.xml 文件中进行相关配置,如下:
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8"/><property name="username" value="root"/><property name="password" value="*******"/>
    </bean>
    <!-- 定义TransactionProxy -->
    <bean id="transactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"><property name="transactionManager" ref="transactionManager"/><property name="target"><bean class="com.myCode.DAOCode.DAO.AddDAO"><property name="dataSource" ref="dataSource"/></bean></property><property name="proxyTargetClass" value="true"/><property name="transactionAttributes"><props><prop key="add*">PROPAGATION_REQUIRED</prop></props></property>
    </bean>
    
  • 创建一个 Manager 类应用刚刚的配置
    package com.myCode.DAOCode.manager;import com.myCode.DAOCode.DAO.AddDAO;
    import com.myCode.DAOCode.bean.User;
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.context.support.ClassPathXmlApplicationContext;public class ProxyManager {public static void main(String[] args) {BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");AddDAO addDAO = (AddDAO)factory.getBean("transactionProxy");User user = new User();user.setName("秋月白");user.setAge(27);user.setSex("未知");addDAO.addUser(user);}
    }
    

上一篇
下一篇

JavaWeb——Spring 的操作数据库的 DAO模式相关推荐

  1. Spring Boot操作数据库学习之整合JDBC

    文章目录 一 Spring Data简介 二 Spring Boot集成JDBC 2.1 项目创建步骤 2.2 测试的SQL脚本 2.3 编写yaml配置文件连接数据库 2.4 IDEA连接数据库步骤 ...

  2. MyBatis是持久化层框架(SQL映射框架)-操作数据库

    MyBatis是持久化层框架(SQL映射框架)-操作数据库 1.环境搭建 1).创建一个java工程: 2).创建测试库,测试表,以及封装数据的javaBean,和操作数据库的dao接口 创建表:自己 ...

  3. JavaWeb:用JDBC操作数据库

    JDBC系列阅读 JavaWeb:用JDBC操作数据库 JavaWeb:JDBC之事务 JavaWeb:JDBC之数据库连接池 使用JDBC实现水果超市管理系统 1. 什么是JDBC JDBC的全称是 ...

  4. 使用Spring JDBC框架连接并操作数据库

    在前一篇博文JAVA通过JDBC连接并操作MySQL数据库中,我们知道如何通过JDBC连接并操作数据库,但是请看程序,整个程序连接数据库和关闭数据库占了很大一部分代码量,而且每次我们执行一下数据库操作 ...

  5. boot spring test 文档_SpringBoot入门建站全系列(五)使用Spring-data-jpa操作数据库

    SpringBoot入门建站全系列(五)使用Spring-data-jpa操作数据库 SpringBoot操作数据库有多种方式,如 JDBC直接操作:太古老了,没人愿意这样玩 Mybatis插件:比较 ...

  6. Java Dao模式通过JDBC连接数据库的操作

    Java程序访问数据库: 1.获取数据库厂商提供的驱动(jdbc接口的实现类) 如ojdbc14.jar--Oracle数据库驱动jar包 mysql-connector-java-5.1.8-bin ...

  7. 关于 spring 使用 mongodb 的 mongotemplate 对象操作数据库,对象注入问题(即该对象能否正常的调用相应的CRUD方法来处理数据)...

    通过 spring 框架,直接调用一些处理对象的方法和数据库交互, http 接口从 controller 层调用开始, 如果是:controller --> service --> da ...

  8. java泛型dao,泛型DAO模式在JavaWeb开发中的应用_孟晨.pdf

    泛型DAO模式在JavaWeb开发中的应用_孟晨 29 1 Vol. 29 No. 1 第 卷第 期 计算机应用与软件 20 12 1 Computer Applications and Softwa ...

  9. 编写DAO,通过JdbcTemplate操作数据库的实践

    目的:编写DAO,通过Spring中的JdbcTemplate,对数据库中的学生数据进行增删改查操作. 要操作的数据库表结构为: 一.大体框架 1.要利用JdbcTemplate,首先要添加Sprin ...

最新文章

  1. xcode上真机调试iphone4s出现“There was an internal API error.”解决方案
  2. 函数 —— memset() 将存放字符串的数组清空后再赋予该数组新的字符串
  3. 无线传感网3-2.高效率目标物监控
  4. 双目估计方法_教你提高双目立体视觉系统的精度!
  5. SQL Server IDENDITY 的用法
  6. 站长必知的八大社会心理学效应
  7. 《Android Jetpack》— Android 书籍
  8. Solaris Boot PROM 指令
  9. 音频测试方法(tiny)
  10. struts2通配符的使用
  11. 鲍斯科机器人_芜湖鲍斯柯机器人有限公司、上海富治机械科技有限公司服务合同纠纷二审民事判决书...
  12. 西安交大计算机系96年录取分数,西安交通大学2018年各省录取分数线
  13. C# 获取 ARP 映射
  14. 人员属性识别 PETA数据集下载
  15. 把你的面子撕下来扔到地上,狠狠踹几脚!
  16. python中文朗读_python语音朗读
  17. Android 仿抖音视频播放列表和评论列表
  18. eToro前高管出任INX首席技术官
  19. 现在的网页该不该兼容IE6/7
  20. Android之JVM基础

热门文章

  1. C#调用TSC条码打印机打印二维码
  2. Matlab App Designer自学笔记(七):对话框的使用(提示对话框、提问对话框、文件对话框)
  3. 钉钉和微信通过h5服务器对接,【案例】钉钉/企业微信/在线、工单等集成对接 | 网易七鱼...
  4. 【经营智慧】004.做一个善于发挥自己才智的人
  5. shell循环之for循环
  6. 计算机科学与技术考研报名属于哪一类,计算机在考研中属于什么类别
  7. 电商客服系统功能需求点-实现电商多商家客服系统
  8. 调整el-datetimepicker时间选择器的样式大小
  9. Python基础-2-数据类型文件操作
  10. spark sql优化:小表大表关联优化 union替换or broadcast join