类加载器&反射&JDBC

目录

 

1 Properties类

2 类加载器:用于把类装载进JVM中

3 反射

4 JDBC

5 事务

6 批处理

7 数据库的优化方法

8 JDBC的优化方法


1 Properties类

    作为配置文件;
    配置文件中不支持汉字,用的是Unicode,读取时会转为对应汉字。

2 类加载器:用于把类装载进JVM中

    类加载器的加载先后顺序:无法看见的系统类加载器Bootstrap→平台类加载器PlatformClassLoader→应用程序加载器AppClassLoader→自定义类加载器
    系统类中的类加载器都是根据CLASSPATH路径进行类加载的,而自定义的类加载器,就可以由开发者任意指派类的加载位置。
    双亲委派模型
        如果一个类加载器需要加载类,那么首先它会把这个类请求委派给父类加载器去完成,每一层都是如此。一直递归到顶层,当父加载器无法完成这个请求时,子类才会尝试去加载。
        采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载。如Object类由启动类加载器加载,所以在程序的各种类加载器环境中都是同一个类。

//利用类加载器加载Properties类配置文件
    public class Test {
        public static void main(String[] ardgs) {
            Properties p = new Properties();
            //加载配置文件
            Class<Test> c = Test.class;
            ClassLoader cl = c.getClassLoader(); //三层类加载器
            InputStream is = c1.getResourceAsStream("");
            p.load(is);
            System.out.println(p.get(key));
        }
    }

3 反射

常用方法:
        //根据类名获取类对象
        Class c = Class.forName("com.demo.bean");
        //对象实例化
        object o = c.newInstance();
        //获取类对象方法
        Method m = c.getMethod(“methodName”,null); //参数是 方法名和方法返回值类型。String.Class
        //执行方法,执行结果是对象类型
        Object result = m.invoke(o,null) //参数是 对象实例和方法返回值类型。

        //获取属性
        Field f = getField("name");
        //设置属性值
        f.set(o,"list");
        //获取属性值
        f.get(o);

    一个类在JVM中只会有一个Class实例,在Java中任意一个类都是由这个类本身和加载这个类的类加载器来确定这个类在JVM中的唯一性。

    获取Class对象的方式
        Class clazz = String.class; //通过类的class属性获取,性能高
        Class clazz = “java”.getClass(); //通过调用对象的getClass()方法
        Class clazz = Class.forName("java.lang.String"); //通过Class类的静态方法,会抛出异常

4 JDBC

OracleUtils类

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public final class OracleUtils {
    private static String driver="com.mysql.cj.jdbc.Driver";
    private static String url="jdbc:oracle:thin:@localhost:1521:orcl";
    private static String user="SCOTT";
    private static String password="";
    
    private OracleUtils(){}
    
    static {
        /**
         * 驱动注册
         */
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            throw new ExceptionInInitializerError(e);
        } 
    }
    /**
     * 获取 Connetion
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException{
        return DriverManager.getConnection(url, user, password);
    }
    
    /**
     * 释放资源
     * @param conn
     * @param st
     * @param rs
     */
    public static void colseResource(Connection conn,Statement st,ResultSet rs) {
        closeResultSet(rs);
        closeStatement(st);
        closeConnection(conn);
    }
    
    /**
     * 释放连接 Connection
     * @param conn
     */
    public static void closeConnection(Connection conn) {
        if(conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //等待垃圾回收
        conn = null;
    }
    
    /**
     * 释放语句执行 Statement
     * @param st
     */
    public static void closeStatement(Statement st) {
        if(st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //等待垃圾回收
        st = null;
    }
    
    /**
     * 释放结果 ResultSet
     * @param rs
     */
    public static void closeResultSet(ResultSet rs) {
        if(rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //等待垃圾回收
        rs = null;
    }
}

    并发问题
        脏读:读了更新却未被提交的字段
        不可重复度:两次读取的字段值不同
        幻读:两次读取同一张表,行数不同
    隔离级别
        读未提交数据READ UNCOMMITTED
        读已提交数据READ COMMITED
        可重复读REPEATABLE READ
        串行化SERIALIZABLE

5 事务

    JDBC事务默认是关闭的
    开启:conn.setAutoCommit(false);
    提交:conn.commit();
    回滚:conn.rollback();
    
    事务的ACID(acid)属性
         ① 原子性(Atomicity)
        原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
         ②一致性(Consistency)
        事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
        ③ 隔离性(Isolation)
        事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
        ④持久性(Durability)
        持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响

6 批处理

    stmt.addBatch(sql);
    stmt.addBatch(sql);

7 数据库的优化方法

    ①选取最适合的字段属性。长度合适,尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库就不用比较NULL值。  
    ②使用连接(JOIN)来代替子查询。因为使用连接MySQL不需要在内存中创建临时表来完成逻辑上需要两个步骤的查询工作。

    ③使用外键(保证数据的关联性),索引(提升数据库查询速度)。    
    ④使用事务,保证数据中数据的一致性与完整性

8 JDBC的优化方法

    ①提升读取数据的性能,可以通过对结果集(ResultSet)对象调用setFetchSize()方法指定每次抓取的记录数(时间换空间策略)。Fetch相当于读缓存,默认FetchSize的值为10,即rs.next()的操作第一次会从数据库服务器读取10条记录存于内存,下一次rs.next()就直接到内存中读取。

    ②提升更新数据的性能可以使用PreparedStatement语句构建批处理,将若干SQL语句置于一个批处理中执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值