声微饭否

博客园 首页 新随笔 联系 订阅 管理

事务:

  在数据库执行一组操作(执行多条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方法。

 
   










posted on 2020-08-06 11:56  声微饭否  阅读(130)  评论(0编辑  收藏  举报