java暑期学习笔记(14)

# 2018/07/26 #
* **1.mysql事务**
    * 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。
    * MySQL手动控制事务
        * 开启事务:start transaction | begin
        * 提交事务:commit
        * 回滚事务:rollback
    * JDBC如何控制事务
        * conn.setAutoCommit(false);
        * conn.commit;
        * conn.rollback;在异常中写
* **2.事务的特性**
    * 原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 
    * 一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。转账前和转账后的总金额不变。
    * 隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
    * 持久性:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
* **4.事务的隔离级别**
    * 赃读:指一个事务读取了另一个事务未提交的数据。
    * 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。一个事务读取到了另一个事务提交后的数据(update)
    * 虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致(insert)
    * 数据库通过设置事务的隔离级别防止以上情况的发生:
        * 1.READ UNCOMMITTED: 赃读、不可重复读、虚读都有可能发生。
        * 2.READ COMMITTED: 避免赃读。不可重复读、虚读都有可能发生。(oracle默认的)
        * 4.REPEATABLE READ:避免赃读、不可重复读。虚读有可能发生。(mysql默认)
        * 8.SERIALIZABLE: 避免赃读、不可重复读、虚读。
        * 级别越高,性能越低,数据越安全。
        * conn.setTransactionIsolation(int level);
* **5.数据库连接池**
    * 提高性能    
    * 编写标准的数据源
        * javax.sql.DataSource接口,一般都叫数据源
    * 装饰设计模式:使用频率很高  
        * 目的:改写已存在的类的某个方法或某些方法,装饰设计模式(包装模式)
        * 口诀:
            * 1、编写一个类,实现与被包装类相同的接口。(具备相同的行为)
            * 2、定义一个被包装类类型的变量。
            * 3、定义构造方法,把被包装类的对象注入,给被包装类变量赋值。
            * 4、对于不需要改写的方法,调用原有的方法。
            * 5、对于需要改写的方法,写自己的代码。
    * 默认适配器:装饰设计模式一个变体 
* **6.常用的数据源配置**
    * DBCP:Apache推出的Database Connection Pool
        * 使用步骤:
            * 添加jar包  commons-dbcp-1.4.jar & commons-pool-1.5.6.jar
            * 添加属性资源文件(放在src下边)dbcpconfig.properties
            * 编写数据源工具类
                 getconnection里边return BasicDataSourseFatory.createDataSource(p);
                 p.load(DBCPUtils.class.getClassLoader().getReSourceAsStream("dbcpconfig.properties");
    * C3P0
        * 使用步骤:
            * 1、添加jar包 
            * 2、编写配置文件:c3p0-config.xml,建一个Lib文件夹,放在classpath中,或classes目录中
                //得到一个数据源
                private static DataSource dataSource = new ComboPooledDataSource();
                
                //从数据源中得到一个连接对象
                public static Connection getConnection(){
                    try {
                        return dataSource.getConnection();
                    } catch (SQLException e) {
                        throw new RuntimeException("服务器错误");
                    }
                }
* **7.用JavaWeb服务器管理数据源:Tomcat**
    * 添加context.xml放到应用文件里或直接在tomcat的conf/context.xml里边添加内容(可以同时多个应用一起)
    * Context initContext = new InitialContext();
      DataSource ds = (DataSource)initContext.lookup("java:/comp/env/jdbc/itheima");
      Connection conn = ds.getConnection();
* **8.DBUtils**
    * DBUtils封装了对JDBC的操作,简化了JDBC操作。可以少写代码。
    * 三个核心对象
        * QueryRunner类
            * QueryRunner中提供对sql语句操作的API.
            * 主要的三个方法
                * query() 用于执行select 
                * update() 用于执行insert update delete
                * batch() 批处理
        * ResultSetHandler接口:用于定义select操作后,怎样封装结果集
        * DBUtils类:一个工具类,定义了关闭资源与事务处理的方法
    * 使用
        * 导包
        * QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
          List<User> list = qr.query("select * form users",new BeanListHandler<User>(User.class));
* **9.QueryRunner对象**
    * 构造函数:
        * new QueryRunner(); 它的事务可以手动控制。也就是说此对象调用的方法(如:query、update、batrch)参数中要有Connection对象。
        * new QueryRunner(DataSource ds); 它的事务是自动控制的。一个sql一个事务。此对象调用的方法(如:query、update、batrch)参数中无需Connection对象。
    * 方法: 
        * 返回<T> T;query(String sql,ResultSet<T> rsh,Object...params);最后一个可变参数0 -> 无穷
        * 返回<T> T;query(Connection conn,String sql,ResultSet<T> rsh,Object...params);
        * 返回int(修改的行数) update(String sql,Object ...params)
        * 返回int(修改的行数) update(Connection conn,String sql,Object ...params)
        * 只能执行相同的SQL语句,批量修改;返回int[] ;batch(String sql,Object[][]params)二维数组第一个中括号是指执行多少次语句,第二个是有问号的值得个数。
        * batch(Connection conn,String sql,Object[][]params)
* **10.ResultSetHandler接口**
    * ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object[]
    * ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中
    * ColumnListHandler(int key):取某一列的数据。封装到List中。
    * KeyedHandler(int key):取多条记录,每一条记录封装到一个Map中,再把这个Map封装到另外一个Map中,key为指定的字段值。
        * 返回Map<Object,Map<String,Object>> map = qr.query("select * form users",new KeyedHandler(1));
         for(Map.Entry<Object,Map<String,Object>> m : map.entrySet()){
            for(Map.Entry<String,Object> mm : m.getValue().entrySet()){
                System.out.println(mm.getKey()+"\t"+mm.getValue());
            }
        }
    * MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中
    * MapListHandler:适合取多条记录。把每条记录封装到一个Map中,再把Map封装到List中
    * ScalarHandler:适合取单行单列数据
    * BeanListHandler<T>(T.class)返回list集合
    * BeanHandler<T>(T.class)返回一个对象,适合单行单列

猜你喜欢

转载自www.cnblogs.com/yaopeiyun/p/9557171.html