首页 > 其他分享 >Spring — JdbcTemplate

Spring — JdbcTemplate

时间:2023-06-18 11:44:20浏览次数:34  
标签:事务 jdbc Spring args resultSet JdbcTemplate mysql id

Spring — JdbcTemplate

JdbcTemplate做持久层的操作

  • 导入包

    • aop、ccbe ( 四核心 )、spring-jdbc、 c3p0、mysql-connector-java
  • 配置数据源

    • 编写数据库配置文件 db.properties ( driver、url、user、pwd )

      mysql5:Class.forName("com.mysql.jdbc.Driver");
      String url = "jdbc:mysql://localhost/mysqldb?&useUnicode=true&characterEncoding=utf-8";

      mysql8:Class.forName("com.mysql.cj.jdbc.Driver");
      String url = "jdbc:mysql://localhost/mysqldb?&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkong";

    • 配置文件

      <!--  配置包自动扫描  -->
          <context:component-scan base-package="com.qut.jdbcTemplate"></context:component-scan>
      <!--  导入数据库配置文件  -->
          <context:property-placeholder location="classpath:db.properties" />
      <!--  配置数据源  -->
          <bean id="ds" class="com.mchange.v2.c3p0.ComboPooledDataSource">
              <property name="driverClass" value="${driver}"></property>
              <property name="jdbcUrl" value="${url}"></property>
              <property name="user" value="${user}"></property>
              <property name="password" value="${pwd}"></property>
          </bean>
      
  • dao 层实现类

    @Component
    // 实现类:
    @Autowired
    private JdbcTemplate jt;  // 通过xml得到jt方式
    // 增:
    		String sql = "insert into user(name,pwd,money) value (?,?,?)";
            Object[] args = {u.getName(),u.getPwd(),u.getMoney()};
            return jt.update(sql,args) > 0;
    // 删:delete from user where id = ?
    // 改:update user set name = ?, pwd = ?, money = ? where id = ?
    // 查:
    public User queryById(int id) {
            String sql = "select * from user where id = ?";
            Object[] args = {id};  // 查询所有的话就不用写args了
            return jt.queryForObject(sql, args, new RowMapper<User>() {
                public User mapRow(ResultSet resultSet, int i) throws SQLException {
                    User u = new User();
                    u.setId(resultSet.getInt("id"));
                    u.setName(resultSet.getString("name"));
                    u.setPwd(resultSet.getString("pwd"));
                    u.setMoney(resultSet.getInt("money"));
                    return u;
                }
            });
        }
    

事务

  • 事务是数据库操作的最基本单元,逻辑上的一组操作,要么都成功,如果有一个失败所有都失败

  • 特性:ACID

    • 即:原子性 —— 要么都成功,要么都失败
    • 一致性 —— 操作前与操作后的数据总量不变
    • 隔离性 —— 多事务操作时,彼此间不相互影响
    • 持久性 —— 事务提交后,表中的数据真正改变
  • ACID、常见的数据失效

    • 脏读 —— 事务回滚导致数据失效,即一个事务看到了另一个事务未提交的更新数据

    • 幻读 —— 从数据量看问题

      • 一个事务在执行过程中读取到了另一个事务已提交的插入数据,即:

          第一步:第一个事务刚开始时读取到一批数据,
        
          第二步:第二个事务插入了新数据并提交,
        
          第三步:第一个事务又读取这批数据,发现多了一条,好像发生幻觉一样。
        
    • 不可重复读 —— 从数据值看问题

      • 在同一事务中,多次读取同一数据却返回不同的结果;即有其他事务更改了这些数据

过程

  • 如上,在配置文件基础上再添加:

    <!-- xml在原有基础上配上tx的xmlns、xsi等 -->
    <!--  配置JdbcTemplate  -->
        <bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate">
            <!--   ref使用ds数据源   -->
            <property name="dataSource" ref="ds"></property>
        </bean>
            
    <!--  数据源的事务管理器  -->
        <bean id="txman" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="ds"> </property>  // 基于数据源ds
        </bean>
            
    <!--  通过注解方式加入的事务标签起作用  -->
    	<tx:annotation-driven transaction-manager="txman"></tx:annotation-driven>
    
  • 对需要加以事务的方法以注解:@Transactional

  • 写到类上就是对类中所有方法织入事务

标签:事务,jdbc,Spring,args,resultSet,JdbcTemplate,mysql,id
From: https://www.cnblogs.com/zhu-ya-zhu/p/17488918.html

相关文章

  • Spring Boot单体应用引入sleuth链路追踪
    文章目录前言一、问题模拟二、引入sleuth链路跟踪1、引入sleuth的maven依赖2、添加属性配置3、logback配置4、日志信息5、通过@NewSpan注解声明新的Span三、引入Sleuth链路跟踪的好处四、Sleuth概念说明五、Logback的MDC特性前言最近排查生产环境的异常时发现一个问题,虽然找到了......
  • Spring —— IOC
    Spring—IOC传统方式:先前service层调用dao实现类:常用new方式,高耦合(即依赖——模块与模块之间的联系)而好的程序应该是:高内聚(模块内部功能的联系)低耦合New的方式就是写死了,是硬编码(一般来说应该是要避免的)要改变的话就是改源代码将紧耦合变......
  • SpringBoot中跨域问题的处理
    跨越问题产生原因:产生跨域问题的原因是浏览器的同源策略,所谓同源是指:域名,协议,端口相同。如果不同,将会出现跨域问题。一、创建项目我们创建两个项目,一个命名为provider提供服务,一个命名为consumer消费服务,第一个项目端口配置为8080,第二个项目端口配置为8081,然后在provider中提供一个......
  • SpringBoot整合RocketMQ
    前提是必须已经安装了RocketMQ并配置好相关的环境变量(自行百度) 第一步: 第二步: 第三步:  第四步: ......
  • 手写SpringBoot启动器主要步骤
    这里写目录标题背景过程2.1自启动实现原理2.2手动实现SpringBoot自启动2.2.1宏观2.2.1微观2.2.1.1三个服务之间调用2.2.1.2自定义注解2.2.1.1业务组装2.2.1.3启动类升华自定义注解:手动装配组件:简化启动过程:自动化注入依赖:简化启动类:背景更好的理解框架:通过手写SpringBoot启动类,......
  • springboot中自定义注解在service方法中,aop失效
    问题描述写了个自定义注解,但是该注解只会出现在serviece层中的方法中。启动发现aop未拦截到问题原因:调用service中的xx()方法时,Spring的动态代理帮我们动态生成了一个代理的对象,暂且叫他$XxxxService。所以调用xx()方法实际上是代理对象$XxxxService调用的。但是在xx()方法内调用同......
  • springboot注册过滤器
    springboot注册过滤器需要使用过滤器的话,优先选择拦截器。因为拦截器符合aop思想。在springboot中使用过滤器有三种方式。分别如下方式一:传统web在传统javaweb、ssm中使用过滤器差不多类似,这里以java配置为例,实现Filter接口@WebFilter("/*")publicclassMyFilter01i......
  • SpringBatch从入门到实战(一):简介和环境搭建
    一:简介SpringBatch是一个轻量级的批处理框架,适合处理大批量的数据(如百万级别)。功能就是从一个地方读数据写到另一个地方去。一般都是系统之间不能直接访问同一个数据库,需要通过文件来交换数据。二:从文件中读然后写到数据库这代码谁都会写,那么为什么还要使用框架?try(BufferedReader......
  • 【框架源码】Spring源码解析之Bean创建源码流程
    问题:Spring中是如何初始化单例bean的?我们都知道Spring解析xml文件描述成BeanDefinition,解析BeanDefinition最后创建Bean将Bean放入单例池中,那么Spring在创建Bean的这个过程都做了什么。Spring核心方法refresh()中最最重要的一个方法finishBeanFactoryInitialization()方法,该方法......
  • Spring框架中的线程池
    Spring框架中的线程池使用Java的ExecutorService接口实现ExecutorService是Java提供的用于管理线程池的高级工具。下面是在Spring框架中使用线程池的一般步骤:导入所需的依赖首先,确保你的项目中包含了使用线程池所需的依赖。通常情况下,你可以使用SpringBoot来创建项目,它会自动包含......