• JDBC(二)


    事务:

      在数据库执行一组操作(执行多条sql)保证这个操作 要么同时成功 要么同时执行失败

      事务的原子性。。。。

      事务的四大原则

      A:事务的原子性:执行操作  要么通知成功要么同时失败  (最小的原子单位)

      C:事务的一致性:事务要么是执行前的状态,要么是执行后的状态

      D:事务的隔离性:每一个事务都是相互独立 互不影响。

      L:事务的持久性:只要是commit后数据就永远保存在数据库中

           1.(mysql数据库是自动提交事务 ,操作时必须修改为手动)

        指令:set autocommit=0(手动) 1(自动)

      2.开启事务:start transaction

      3.回滚:rollback       savepoint 名字  rollback to 回滚点 (设置回滚点)

    事务的原理:事务开启  执行sql将结果写入临时文件中  只有commit提交后 数据才会保存到数据库中。

          调用commit和rollback回清除临时文件

    使用java代码操作事务:数据库中提交提交设置为自动

       要点:设置为手动提交 setAutoCommit()方法 commit()方法 rollback()回滚方法   对象都是连接对象

    public class Test01 {
    public static void main(String[] args) {
    Connection con =null;
    try {
    Class.forName("com.mysql.jdbc.Driver");
    con= DriverManager.getConnection("jdbc:mysql://localhost:3306/day09?characterEncoding=utf-8","root","root");
    con.setAutoCommit(false);
    change(con,"张三",1500);
    change(con,"李四",3500);
    // System.out.println(1/0);
    con.commit();
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    try {
    con.rollback();
    } catch (SQLException ex) {
    ex.printStackTrace();
    }
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    //转账方法
    public static void change(Connection con , String mname ,int mmoney ){
    try {
    String str ="update money set mmoney =? where mname=?";
    PreparedStatement ps = con.prepareStatement(str);
    ps.setInt(1,mmoney);
    ps.setString(2,mname);
    int a = ps.executeUpdate();
    } catch (SQLException e) {e.printStackTrace();

    }
    }
    }
    事务在高并发会产生问题:使用事务的隔离级别:
    1<2<3<4
    1.未提交读:一个事务读取到另一个事务未提交的数据(脏读:读取到垃圾数据)
    2.已提交读:事务只能读取已经提交的数据
    3.可重复读:在读取事务时 其他事务不能够进行修改操作 可以执行增加操作:出现幻读
    4.可串化:锁数据库表 只能一个数据库事务来进行操作
    连接池:
    1.不要手动创建连接,减轻服务器压力
    2.避免反复创建和销毁 重复利用
    3.连接不够 ,创建新连接 不会超过最大量
    4.连接过多,销毁一定量连接
    5.连接都由连接池管理
    接口:DataSource 连接池
    1.dbcp:tomcat服务器内置连接池
    创建输入流 读取dbcp的proities文件 创建propites对象 调用load方法传入输入流对象
    DataSource对象
    FileInputStream is =new FileInputStream("dbcpconfig.properties");
    Properties properties =new Properties();
    properties.load(is);
    DataSource ds = BasicDataSourceFactory.createDataSource(properties);
    2.c3p0:Spring框架内置连接池
    private static DataSource ds =new ComboPooledDataSource();//创建连接池()里可以传入classname获取不同的连接 
     ds.getConnection();//获取连接对象
    3.druip:阿里
    javaBean:就是一个实体类,一般是与数据表对应 属性==列名 帮助实现业务逻辑
          标配:私有属性 两个构造(必须写无参构造)set()get()方法 toString(可选)
    dbUtils包:来实现数据库操作:
          apeach公司框架 对jdbc的封装 提供了一些静态方法来使用进行操作数据库。
        核心对象:QueryRunner对象------>需要实例化
             QueryRunner qr =new QueryRunner(传入连接池对象)
             qr的核心方法Query()查询 update()增删改
      private DataSource fs =new ComboPooledDataSource();//c3p0创建连接池
      private QueryRunner qr =new QueryRunner(fs); 创建QueryRunner对象
    ---先导入dbutils的jar包,将jar包添加依赖, 获得核心类对象 之前先创建一个连接池对象
    ---以c3p0为例 DataSource ds = new ComboPoolDataSource();获得连接池对象,再 获取
    ---dbUtils的核心对象QueryRunner new时需要将连接池作为参数传进去 对象调用的方法也需要传入参数
    ---sql语句和数组
    查询结果返回的是一个ResultSet结果集 dbUtils对其进行了封装
    1.查询单个数据:Query()需要两个参数 参数一:sql语句  参数二:
    2.查询多条数据
    1.封装成实体类对象

             2.封装到Object[]数组中  

             3.封装入多个数组存储在list集合
    查单条数据:把查询的单条数据存入map集合中

    MVC:模式
    将项目分为三部分 dao层:编写接口编写接口的实现类 用于操作数据库
             service层:
    编写接口编写接口的实现类 实现系统逻辑
            view层:视图层将数据返回显示在页面上
            注意:需要建立与数据库相匹配的实体类组成:私有属性对应数据库表的列
              提供两个构造构造方法 无参构造是必要的 get和set方法。
    
    
     
       










  • 相关阅读:
    ABAP学习(26):ZIP打包Excel
    ABAP学习(30):生成随机数
    ABAP学习(28):HTML内容生成
    esp 8266 连接DHT22温室度传感器
    树莓派 连接 5.65inch ePaper Module (F)
    ESP8266NodeMCU 连接 5.65inch ePaper Module (F)
    1. ESP8266NodeMCU 开发环境配置
    2.esp 8266 连接oledqt 显示器
    plt设置savefig的图大小
    tf2.0 实现transformer小改
  • 原文地址:https://www.cnblogs.com/frhl/p/13445424.html
Copyright © 2020-2023  润新知