zoukankan      html  css  js  c++  java
  • JDBC事务

    JDBC事务控制
    1.什么时事务:一个包含多个步骤或者业务操作。如果这个业务或者多个步骤被事务管理,则这多个步骤要么同时成功,要么回滚
    (多个步骤同时执行失败),这多个步骤时一个整体,不可分割的。
    2.操作:
    开启事务:mysql--->start transaction
    提交事务:commit
    回滚事务:rollback
    3.使用Connection对象来管理事务
    开启事务:setAutoCommit(boolean autoCommit);执行该方法里面传入false值,手动开启事务再执行sql语句之前开启事务
    提交事务:commit()--->当所有的sql语句执行完毕才提交事务
    回滚事务:rollback();---->当事务中发生异常时回滚事务 回滚事务放在catch语句
    4.实例:以银行转账为例:让张三给李四转账10000块钱
    //含有事务的转账
    public static void transform02() {
    double momey = 10000;
    String username01 ="张三";
    String username02 = "李四";

    	//张三给李四转账10000钱
    	//定义实现转账的两条sql语句
    	String sql01 ="update account set balance = balance-? where username=?";
    	String sql02 ="update account set balance = balance+? where username=?";
    	//使用Connection对象手动开启事务 setAutoCommit
    	Connection con=DBUtil.getConnection();
    	try {
    		con.setAutoCommit(false);
    		//通过con获取预处理对象,先让张三的钱减少10000块钱
    		 ps01 = con.prepareStatement(sql01);
    		ps01.setDouble(1, momey);
    		ps01.setString(2, username01);
    		//执行sql语句
    		int count = ps01.executeUpdate();
    		//手动制造一个异常
    		//int i=1/0;
    		//再让李四的钱增加1完
    		 ps02 = con.prepareStatement(sql02);
    		ps02.setDouble(1, momey);
    		ps02.setString(2, username02);
    		//执行sql语句
    		int count02 = ps02.executeUpdate();
    		//提交事务
    		con.commit();
    		System.out.println("转账成功!");
    	} catch (SQLException e) {
    		// TODO Auto-generated catch block
    		//事务回滚
    		try {
    			System.out.println("转账失败!");
    			con.rollback();
    		} catch (SQLException e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}
    		e.printStackTrace();
    	}finally {
    		//把打开的各种链接对象释放掉
    		try {
    			ps01.close();
    			ps02.close();
    			con.close();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }
    

    链接池
    1.什么时链接池:其实就是一个容器,再这个容器当中存放着多个链接对象
    当系统开始运行时,可以让系统提前创建多个链接对象,放到容器中(连接池),当客户端需要链接对象时
    ,可以从连接池中申请一个链接,去访问数据库,当该链接使用完毕时,不再释放归还给系统,而是把这个链接对象归还给连接池
    2.好处:
    可以大大节省系统开销
    可以提高访问的速度
    3.实现操作
    javax.sql 连接池
    JNDL---> java naming and Directory Interface Java命名和目录接口
    使用JNDI降低程序和数据库的耦合度,使你的程序更加方便配置和维护以及部署
    是javaEE规范中的重要规范之一。是EJB的相关的知识。
    DataSource接口它里面并不提高具体的实现,而是由驱动程序供应商(数据库厂商)提供
    1.C3P0:它是数据库连接池的一套技术
    2.druid:也是一套数据库连接池的技术,由阿里巴巴提供的。
    4.C3P0数据库连接池技术
    步骤:
    1.去官网下载两个jar包:c3p0-0.9.5.2.jar、mchange-commons-java-0.2.12.jar
    植入到工程的classpath类路径下,不要忘记导入mysql驱动jar包mysql-connector-java.jar
    定义配置文件:
    文件类型:c3p.properties 或者 c3p0-config.xml
    路径:放到classpath类路径下 对于工程来说直接放到src下面即可
    获取DataSource对象:数据库链接池对象 通过实例化ComboPoolDataSource来获取从连接池中获取链接对象
    5.Druid 德鲁伊链接池技术
    步骤:
    1.去官网下载一个德鲁伊的jar包--->druid-1.0.9.jar
    2.定义配置文件:使用properties文件类型的,名字随便起
    3.手动加载配置文件信息:Properties集合
    4.获取DataSource对象:通过工厂方式来实现的,DruidDataSourceFactory
    5.从连接池中获取链接对象:getConnection()
    JDBCTemplate
    Spring框架提供了对JDBC操作的简单封装,使用JDBCTemplate对象来简化JDBC开发流程
    步骤:
    从官网下载对于的Spring-jdbc相关的jar包,导入到工程类路径下,放到lib文件夹下即可
    创建JDBCTemplate对象中的api方法实现crud操作
    DML操作:update()
    DQL操作:查询不用select 使用query
    query();讲查询的结果集封装成javaBean对象
    queryForMap();讲查询的结果集封装成map集合,只能封装一条记录:键key是字段,值value是字段值,结果集记录数只能是1
    queryForList();将结果集封装成List集合,再list集合中有多条记录,每一条记录都是一个map集合
    List<Map<Object,Obejct>>list;
    queryFoObject();将结果集封装成一个对象,一般用于聚合函数查询总记录数 int count();

  • 相关阅读:
    dp有哪些种类
    hibernate 双向n-n
    TextView——setCompoundDrawables说明
    Codeforces Round #FF (Div. 2)
    波折yosemite下载过程
    谁,例如下列方法区的指导下
    [LeetCode] 032. Longest Valid Parentheses (Hard) (C++)
    TCP/IP的经典网络编程
    NYOJ353 3D dungeon 【BFS】
    Ubuntu 14.04 grub2 温馨提示
  • 原文地址:https://www.cnblogs.com/lulubenlei/p/14249045.html
Copyright © 2011-2022 走看看