培训第3天----JDBC的事务管理问题

    在用预处理对象PreparedStatement 来封装sql后,用对象.方法 的方式来执行sql语句:

PreparedStatement prepareStatement = connection.prepareStatement(sql);

ResultSet resultSet = prepareStatement.executeQuery();

这是查询操作,对数据库中的数据没有影响,不会产生事务的问题。但是如果是更新操作(比如:insert 、update、delete),

那么sql语句的执行就会对数据库产生影响。这里要说的是,如果A给B转账100元,如果把B的账户输入错了,那么A仍会少100元,

但是B不会接收到100元,这就会产生问题。在这里我们可以用事务的方式来管理,就不会出现这样的问题。一个事务其中的所有

操作要么全部成功,要么全部失败。

    怎么样来管理事务呢?

    数据库中有事务,而在Java中并没有事务,但在Java中可以模拟事务。Java的模拟事务是通过连接对象 Connection 来控制的,

在Java中默认的模拟事务是自动提交的,也就是当执行完更新操作后,会自动将更新的部分保存到数据库中(持久层中)。

    Connection 的setAutoCommit()默认是true,如果设为false就相于开启事务。例如:

    connection.setAutoCommint(false);       //表示事务已经开启。

    ...........                                                          //业务逻辑,比如A减少100元,B增加100元

    connection.commit();                                  //提交事务,将实体类对象转换为持久化对象(也可以成为复制,因为实体类对

                                                                        象还存在)

    如果发生异常,那么将会在catch块中回滚事务,并且无论事务成功与否,都要在finally块中将连接对象关闭,释放资源:

    try{

//业务逻辑

}catch(SQLException e){

e.printStackTrace();
try {
empDAO.baseDAO.dbUtil.getConnection().rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

}finally {
try {
empDAO.baseDAO.dbUtil.getConnection().close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

    上面所说的事务,是基于连接对象的,所以要想两个事务相关联,就需要共用一个连接对象(事务操作的基本)。

    怎么样保证所获得的连接对象始终是一个呢?

    这里肯定会封装很多的方法,这里就不在书写。但是每一次方法的调用都会生成一些新的东西,如果想要唯一,可以

把生成的东西抽取出来,作为成员属性,再在方法里写继续调用的方法:

     public BaseDAO baseDAO=new BaseDAO();

@Override
public boolean ins_one_emp(Emp emp) throws SQLException 
{
//关于添加的sql语句
String sql = "insert into emp(ename,mgr,sal)values(?,?,?)";
//定义参数数组
Object [] args = {emp.getEname(),emp.getMgr(),emp.getSal()};
return baseDAO.commonUpdate(args, sql);

}

    这里我们可以看到,成员属性定义为public,这是因为可以通过对象.的方式来直接得到成员属性,也就是对象。如果

是defalt包权限就不可以,包权限必须在同一个包下,导包的方式是不可以的:

    empDAO.baseDAO.dbUtil.getConnection().setAutoCommit(false);

    这就是JDBC的事务管理。下面是遇到的一些基础知识:

   1. 什么是RAM?

    随机存取存储器,也称作”随机存储器“,是与CPU直接交换数据的内部存储器,也叫主存(内存)。存储的内容可以随意

的取出或存入,而与存储单元的位置无关的存储器。这种存储器会在断电时丢失存储内容。而ROM称为”只读存储器“,我

们可以将它看作硬盘。

    2.数组类型是Object的用法?

    当我们传入的数据类型不确定时,就可以定义一个Object[ ]。

   3. 单元测试的用法?

    当我们有方法进行测试时,就可以自动生成一个测试类,注意这个测试类的类型不能是Test,因为这样会与@Test注解

冲突,会产生编译错误。用@Test注解注释的方法,返回值一定要是无返回值void,并且没有方法的参数列表为空。

    4.用接口类型接收实现类的好处是什么?

    private  EmpDAO  empDAO = new EmpDAOImpl();

    当需要更改实现类的类型的时候,就可以直接更改”=“后面的代码,而不需要改变前面的代码。

    接口类型可以调用方法,但是不可以直接访问实现类的属性。(重点)

    5.连接对象关闭之后的问题?

    当进行更新操作后会返回一个int类型的值,来代表影响的数据库中的行数。如果连接关闭后,仍能得到int值,因为sql语句

的操作完事了。但是,如果是查询操作,结果是一个ResultSet,将结果集返回是没有任何问题的,连接关闭后,要遍历结果集

就不可以了,因为遍历操作仍要用到连接对象。

    6.Java中实现类必须要实现接口中的所有方法吗?

    一个类如果要实现一个接口或者继承一个抽象类,那么这个类一定要重写接口的所有方法或者重写抽象类中的所有抽象方法。

因为,一旦没有全部重写,那么类中就会有抽象方法,含有抽象方法的类叫做抽象类。

    


猜你喜欢

转载自blog.csdn.net/qq_41160264/article/details/80976700