Spring — JdbcTemplate

发布时间 2023-06-18 11:44:42作者: 朱呀朱~

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

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