• Spring对不同持久化技术进行支持

    • JDBC

      • 导入spring-jdbc-4.3.5.RELEASE.jar、spring-tx-4.3.5.RELEASE.jar
      • 创建对象,设置数据库信息
      • 创建jdbcTemplate对象,设置数据源
      • 调用jdbcTemplate对象里面对方法实现操作
        public class TestDao {
        
              /**
        * 添加指定数据表的数据
        */
        public void insertUser() { try {
        //导入配置文件
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("db.properties");
        Properties properties = new Properties();
        properties.load(inputStream);
        //获取参数
        String driver = properties.getProperty("jdbc.driver");
        String url = properties.getProperty("jdbc.url");
        String username = properties.getProperty("jdbc.username");
        String password = properties.getProperty("jdbc.password");
        //
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
        driverManagerDataSource.setJdbcUrl(driver);
        driverManagerDataSource.setJdbcUrl(url);
        driverManagerDataSource.setUser(username);
        driverManagerDataSource.setPassword(password);
        //数据库语句
        String sql = "insert into user (username,password,email,root,register_time) values (?,?,?,?,?) ";
        //
        JdbcTemplate jdbcTemplate = new JdbcTemplate(driverManagerDataSource);
        int rows = jdbcTemplate.update(sql,"rabbit","rabbit","rabbit@qq.com",1,"2019-3-2"); System.out.println("rows="+rows);
        } catch (IOException e) {
        e.printStackTrace();
        } } /**
        * 更新指定数据表的数据
        */
        public void updateUser() { try {
        //导入配置文件
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("db.properties");
        Properties properties = new Properties();
        properties.load(inputStream);
        //获取参数
        String driver = properties.getProperty("jdbc.driver");
        String url = properties.getProperty("jdbc.url");
        String username = properties.getProperty("jdbc.username");
        String password = properties.getProperty("jdbc.password");
        //
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
        driverManagerDataSource.setJdbcUrl(driver);
        driverManagerDataSource.setJdbcUrl(url);
        driverManagerDataSource.setUser(username);
        driverManagerDataSource.setPassword(password);
        //数据库语句 String sql = "update user set phone = ? where username = ?";
        //
        JdbcTemplate jdbcTemplate = new JdbcTemplate(driverManagerDataSource); int rows = jdbcTemplate.update(sql,"13812392132","rabbit");
        System.out.println("rows=" + rows);
        } catch (IOException e) {
        e.printStackTrace();
        } }
        /**
        * 查询全部数据
        */
        public void selectAllUser() { try {
        //导入配置文件
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("db.properties");
        Properties properties = new Properties();
        properties.load(inputStream);
        //获取参数
        String driver = properties.getProperty("jdbc.driver");
        String url = properties.getProperty("jdbc.url");
        String username = properties.getProperty("jdbc.username");
        String password = properties.getProperty("jdbc.password");
        //
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
        driverManagerDataSource.setJdbcUrl(driver);
        driverManagerDataSource.setJdbcUrl(url);
        driverManagerDataSource.setUser(username);
        driverManagerDataSource.setPassword(password);
        //数据库语句 String sql = "select * from user";
        //
        JdbcTemplate jdbcTemplate = new JdbcTemplate(driverManagerDataSource); List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
        System.out.println("maps=" + maps);
        } catch (IOException e) {
        e.printStackTrace();
        } }
        /**
        * 删除指定数据
        */
        public void deleteUser() { try {
        //导入配置文件
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("db.properties");
        Properties properties = new Properties();
        properties.load(inputStream);
        //获取参数
        String driver = properties.getProperty("jdbc.driver");
        String url = properties.getProperty("jdbc.url");
        String username = properties.getProperty("jdbc.username");
        String password = properties.getProperty("jdbc.password");
        //
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
        driverManagerDataSource.setJdbcUrl(driver);
        driverManagerDataSource.setJdbcUrl(url);
        driverManagerDataSource.setUser(username);
        driverManagerDataSource.setPassword(password);
        //数据库语句 String sql = "delete from user where username = ?";
        //
        JdbcTemplate jdbcTemplate = new JdbcTemplate(driverManagerDataSource); int row = jdbcTemplate.update(sql, "rabbit");
        System.out.println("row=" + row);
        } catch (IOException e) {
        e.printStackTrace();
        } } /**
        * 查询指定数据表的记录数
        */
        public void selectCountUser() {
        try {
        //导入配置文件
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("db.properties");
        Properties properties = new Properties();
        properties.load(inputStream);
        //获取参数
        String driver = properties.getProperty("jdbc.driver");
        String url = properties.getProperty("jdbc.url");
        String username = properties.getProperty("jdbc.username");
        String password = properties.getProperty("jdbc.password");
        //
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
        driverManagerDataSource.setJdbcUrl(driver);
        driverManagerDataSource.setJdbcUrl(url);
        driverManagerDataSource.setUser(username);
        driverManagerDataSource.setPassword(password);
        //数据库语句 String sql = "select count(*) from user";
        //
        JdbcTemplate jdbcTemplate = new JdbcTemplate(driverManagerDataSource);
        //第一个参数sql语句,第二个参数返回的数据类型
        Integer count = jdbcTemplate.queryForObject(sql,Integer.class);
        System.out.println("count=" + count);
        } catch (IOException e) {
        e.printStackTrace();
        } } public void selectUser();() { try {
        //导入配置文件
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("db.properties");
        Properties properties = new Properties();
        properties.load(inputStream);
        //获取参数
        String driver = properties.getProperty("jdbc.driver");
        String url = properties.getProperty("jdbc.url");
        String username = properties.getProperty("jdbc.username");
        String password = properties.getProperty("jdbc.password");
        //
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
        driverManagerDataSource.setJdbcUrl(driver);
        driverManagerDataSource.setJdbcUrl(url);
        driverManagerDataSource.setUser(username);
        driverManagerDataSource.setPassword(password);
        //数据库语句 String sql = "select * from user where username = ?"; User user = jdbcTemplate.queryForObject(sql, new NewRowMapper(), "rabbit");
        JSONObject jsonObject = JSONObject.fromObject(user);
        System.out.println(jsonObject + "");
        } catch (IOException e) {
        e.printStackTrace();
        } } /**
        * 处理查询结果集
        */
        class NewRowMapper implements RowMapper<User> { @Override
        public User mapRow(ResultSet resultSet, int i) throws SQLException { try {
        Class<?> newClass = Class.forName("cn.muriel.auto.pojo.User");
        Object o = newClass.newInstance();
        for (int j = 1; j <= resultSet.getMetaData().getColumnCount(); j++) {
        String name = resultSet.getMetaData().getColumnName(j);
        String type = resultSet.getMetaData().getColumnTypeName(j);
        //针对只有一次_的情况,多次则可用递归
        if (name.contains("_")) {
        int position = name.indexOf("_");
        String smailChar = name.substring(position + 1, position + 2).toUpperCase();
        name = name.substring(0, position) + smailChar + name.substring(position + 2, name.length());
        }
        Field declaredField = newClass.getDeclaredField(name);
        if (declaredField != null) {
        declaredField.setAccessible(true);
        if (type.equals("INT"))
        declaredField.set(o, resultSet.getInt(name));
        else if (type.equals("VARCHAR"))
        declaredField.set(o, resultSet.getString(name));
        } }
        return (User) o; } catch (ClassNotFoundException e) {
        e.printStackTrace();
        } catch (IllegalAccessException e) {
        e.printStackTrace();
        } catch (InstantiationException e) {
        e.printStackTrace();
        } catch (NoSuchFieldException e) {
        e.printStackTrace();
        } return null;
        }
        } } /**
        * 测试代码
        */
        public static void main(String[] args) { Test01 test01 = (Test01) applicationContext.getBean("test01");
        test01.test01();*/ TestDao dao = new TestDao();
        dao.insertUser();
        dao.updateUser();
        dao.selectAllUser();
        dao.selectUser();
        dao.selectCountUser();
        }
      • spring配置c3p0连接池
        • 导入mchange-commons-java-0.2.11.jar、c3p0-0.9.5.2.jar
        • 连接连接池
          • 代码实现

              InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("db.properties");
            Properties properties = new Properties();
            try {
            properties.load(inputStream);
            //获取参数
            String driver = properties.getProperty("jdbc.driver");
            String url = properties.getProperty("jdbc.url");
            String username = properties.getProperty("jdbc.username");
            String password = properties.getProperty("jdbc.password");
            ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
            comboPooledDataSource.setDriverClass(driver);
            comboPooledDataSource.setJdbcUrl(url);
            comboPooledDataSource.setUser(username);
            comboPooledDataSource.setPassword(password);
            } catch (IOException e) {
            e.printStackTrace();
            } catch (PropertyVetoException e) {
            e.printStackTrace();
            }
          • 注入实现
            <?xml version="1.0" encoding="UTF-8" ?>
            <!--
            http://www.springframework.org/schema/context/spring-context.xsd:用于注解的约束
            -->
            <beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 自动注入
            <context:component-scan base-package="cn.muriel.auto.dao"/> --> <context:property-placeholder location="db.properties"/>
            <!-- 配置注入 -->
            <bean id="userDao" class="cn.muriel.auto.dao.UserDao"/> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="${jdbc.driver}"></property>
            <property name="jdbcUrl" value="${jdbc.url}"></property>
            <property name="user" value="${jdbc.username}"></property>
            <property name="password" value="${jdbc.password}"></property>
            </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource"/>
            </bean> <bean id="testDao" class="cn.muriel.auto.dao.TestDao">
            <property name="jdbcTemplate" ref="jdbcTemplate"/>
            </bean> </beans>
    • Hibernate
    • Ibatis(MyBatis)
    • JPA
  • Spring的事务管理
    • 什么是事务
    • 事务的特性
    • 不考虑隔离性产生读问题
    • 解决读问题
      • 设置隔离级别
    • spring事务管理两种方式
      • 编程式事务管理
      • 声明式事务管理
        • 基于xml配置文件实现

           <!-- 配置事务管理器 -->
          <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <!-- 注入dataSource -->
          <property name="dataSource" ref="dataSource"/>
          </bean>
          <!-- 配置事务增强 -->
          <tx:advice id="txadvice" transaction-manager="transactionManager">
          <!-- 做事务操作 -->
          <tx:attributes>
          <!--
          设置进行事务操作的方法匹配规则
          name:匹配名字
          propagation:默认。
          -->
          <tx:method name="insert*" propagation="REQUIRED"/>
          </tx:attributes>
          </tx:advice>
          <!-- 配置切面 -->
          <aop:config>
          <!-- 切入点 -->
          <aop:pointcut id="pointcut1" expression="* (cn.muriel.auto.service.TestService.*)(..)"/>
          <!-- 切面 -->
          <aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1"/>
          </aop:config>
        • 基于注解实现
            <!-- 配置事务管理器 -->
          <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <!-- 注入dataSource -->
          <property name="dataSource" ref="dataSource"/>
          </bean>
          <!-- 配置事务注解 -->
          <tx:annotation-driven transaction-manager="transactionManager"/> /**
          * 使用事务的方法所在类上面添加注解
          */
          @Transactional
          public class TestService { }
    • spring事务管理高层抽象主要包括3个接口
      • PlatformTransactionManager(事务管理器)

        • spring针对不同的dao层框架,提供接口不同的实现类
        • 首先都要配置事务管理器
      • TransactionDefinition(事务定义信息(隔离、传播、超时、只读))
      • TransactionStatus(事务具体运行状态)

Spring框架基础(中)的更多相关文章

  1. Spring框架基础2

    Spring框架基础2 测试Spring的AOP思想和注解的使用 导包(在前面的基础上添加) SpringAOP名词解释 AOP编程思想:横向重复代码,纵向抽取:就是说多个地方重复的代码可以抽取出来公 ...

  2. Spring学习指南-第二章-Spring框架基础(完)

    第二章 Spring框架基础 面向接口编程的设计方法 ​ 在上一章中,我们看到了一个依赖于其他类的POJO类包含了对其依赖项的具体类的引用.例如,FixedDepositController 类包含 ...

  3. 4-1 Spring框架基础知识

    Spring框架基础知识 1.Spring 框架作用 主要解决了创建对象和管理对象的问题. 自动装配机制 2.Spring 框架 (Spring容器,JavaBean容器,Bean容器,Spring容 ...

  4. Spring框架基础知识

    本人博客文章网址:https://www.peretang.com/basic-knowledge-of-spring-framework/ Spring框架简介 Spring , 一个开源的框架 , ...

  5. Spring框架基础

    1         Spring框架 1.1           Spring的基本概念 是一个轻量级的框架,提供基础的开发包,包括消息.web通讯.数据库.大数据.授权.手机应用.session管理 ...

  6. Spring 框架基础(04):AOP切面编程概念,几种实现方式演示

    本文源码:GitHub·点这里 || GitEE·点这里 一.AOP基础简介 1.切面编程简介 AOP全称:Aspect Oriented Programming,面向切面编程.通过预编译方式和运行期 ...

  7. Spring框架基础解析

    Spring是一个轻量级的.非侵入式的容器框架:对Bean对象的生命周期进行管理. Spring框架的核心:IOC(控制反转).DI(依赖注入).AOP(面向切面编程). (1) IOC:控制反转. ...

  8. Spring 框架基础(06):Mvc架构模式简介,执行流程详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.SpringMvc框架简介 1.Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集 ...

  9. Spring 框架基础(03):核心思想 IOC 说明,案例演示

    本文源码:GitHub·点这里 || GitEE·点这里 一.IOC控制反转 1.IOC容器思想 Java系统中对象耦合关系十分复杂,系统的各模块之间依赖,微服务模块之间的相互调用请求,都是这个道理. ...

  10. Spring 框架基础(02):Bean的生命周期,作用域,装配总结

    本文源码:GitHub·点这里 || GitEE·点这里 一.装配方式 Bean的概念:Spring框架管理的应用程序中,由Spring容器负责创建,装配,设置属性,进而管理整个生命周期的对象,称为B ...

随机推荐

  1. node koa2 玩起来都是中间件啊

    玩的我想吐 !!! 整理下常用的中间件吧! 先列在这有空把这些中间件的使用技巧也写出来分享一下koa-router 路由中间件koa-bodyparser   POST数据处理的中间件koa-stri ...

  2. hadoop源码分析(2):Map-Reduce的过程解析

    一.客户端 Map-Reduce的过程首先是由客户端提交一个任务开始的. 提交任务主要是通过JobClient.runJob(JobConf)静态函数实现的: public static Runnin ...

  3. Shadow Copying导致ASP.NET应用启动很慢的解决办法

    What's Shadow Copying? 我们安装一个应用程序并启动后,我们是无法更新应用程序安装目录中程序集文件的.如果强制替换会提示文件正在使用,如下图所示. 那你可能会问,为什么会无法更新呢 ...

  4. 值得收藏!!javascript数组中多条对象去重方式,很实用!!!

    在数组中都是数字的时候很好去重,例如:var  arr=[1,2,2,2,3,4,5,4,5,3,6]:可以用两层for循环或者其他方式进行去重 我在这里也给出一个方法吧: Array.prototy ...

  5. Java笔试题:给定一个ReadOnlyClass的对象roc,能否把这个对象的age值改成30?

    在Java笔试面试中,经常会遇到代码题,今天我们就来看一则Java代码笔试题. 有如下代码: Class ReadOnlyClass { private Integer age=20; public ...

  6. [Swift]LeetCode37. 解数独 | Sudoku Solver

    Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy  ...

  7. [Swift]LeetCode137. 只出现一次的数字 II | Single Number II

    Given a non-empty array of integers, every element appears three times except for one, which appears ...

  8. [Swift]LeetCode267.回文全排列 II $ Palindrome Permutation II

    Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empt ...

  9. [Swift]LeetCode520. 检测大写字母 | Detect Capital

    Given a word, you need to judge whether the usage of capitals in it is right or not. We define the u ...

  10. server.properties 文件详解

    [转载]:server.properties 文件详解 # 每一个Broker在集群中的唯标识.即使Broker的IP地址发生了变化,broker.id只要没变,则不会影响consumers的消息情况 ...