数据库普通连接与连接池连接数据库的数据比较,mysql5和8的一些区别,反射获取class的三种方法

182 阅读2分钟

一、数据库普通连接与连接池连接数据库的数据比较

需要的MySQL8驱动以及c3p0连接池,已经上传百度网盘需要的同学可以下载哦!

链接:pan.baidu.com/s/1OEGuZdhn… 提取码:kdd9

1.1 连接池

目的为了数据库的连接效率

这里使用的是:c3p0连接池

因为是javaweb项目,所以在导入jar的时候有些要求,具体看一下图片就清楚了

连接池的目录结构.png

普通数据库连接:

package com.zking.study;
​
import java.sql.*;
​
public class DBUtil {
​
    public static final String DRIVER="com.mysql.cj.jdbc.Driver";
    public static final String URL="jdbc://mysql:///db0926";
    public static final String USERNAME="root";
    public static final String PASSWORD="lzq123";
​
    Connection conn;
    PreparedStatement ps;
    ResultSet rs;
​
    public Connection getConn() {
        try {
            Class.forName(DRIVER);
            conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
​
    public void close() {
        try {
            if(conn!=null) conn.close();
            if(ps!=null) ps.close();
            if(rs!=null) rs.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    public boolean executeUpdate(String sql, Object... obj) {
        getConn();
        int count = 0;
        try {
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < obj.length; i++) {
                ps.setObject((i + 1), obj[i]);
            }
            count = ps.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            close();
        }
        return count > 0;
    }
​
    public ResultSet executQuery(String sql, Object... obj) {
        getConn();
        try {
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < obj.length; i++) {
                ps.setObject((i + 1), obj[i]);
            }
            rs = ps.executeQuery();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return  rs;
    }
}
​

连接池C3p0 连接:

package com.zking.study;
​
import com.mchange.v2.c3p0.ComboPooledDataSource;
​
import java.sql.*;
​
public class DBUtilC3p0 {
​
    public static final ComboPooledDataSource cpds;
    static {
        cpds = new ComboPooledDataSource();
    }
​
    Connection conn;
    PreparedStatement ps;
    ResultSet rs;
​
    public Connection getConn() {
        try {
           cpds.getConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
​
    public void close() {
        try {
            if(conn!=null) conn.close();
            if(ps!=null) ps.close();
            if(rs!=null) rs.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    public boolean executeUpdate(String sql, Object... obj) {
        getConn();
        int count = 0;
        try {
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < obj.length; i++) {
                ps.setObject((i + 1), obj[i]);
            }
            count = ps.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            close();
        }
        return count > 0;
    }
​
    public ResultSet executQuery(String sql, Object... obj) {
        getConn();
        try {
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < obj.length; i++) {
                ps.setObject((i + 1), obj[i]);
            }
            rs = ps.executeQuery();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return  rs;
    }
​
}
​

测试类:

package com.zking.study;
​
import com.zking.dao.DBUtil;
​
import java.sql.Connection;
​
public class Test {
    public static void main(String[] args) {
​
        DBUtil dbUtil = new DBUtil();
        DBUtilC3p0 dbUtilC3p0 = new DBUtilC3p0();
//        获取系统当前时间
        long begin = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            Connection conn = dbUtilC3p0.getConn();
            System.out.println("这是第" + i + "连接" + conn);
            dbUtilC3p0.close();
        }
        long end = System.currentTimeMillis();
        System.out.println("耗时" + (end - begin));
​
    }
}
​

运行结果:
使用 c3p0连接池: c3p0结果.png


** 普通连接结果 **

普通连接结果.png

二、MySQL5和8的一些区别

  1. mysql5 和MySQL8 在配置数据库连接地址的时候

5版本: jdbc:mysql://localhost:3306/数据库?cahracterEncoding=utf8; 

8版本: jdbc:mysql://localhost:3306/数据库?serverTimezone=UTC;

  1. varchar 的区别
  1. 5版本: varchar(10) 存储10个英文或者5个中文
  2. 8版本:varchar(10) 存储10个英文或者10个中文

三、通过反射获取类中的 方法和属性

知识点: 反射获取class 的三种方法

  1. 类名.Class
  2. Class.forName("类的限定名")
  3. 对象.getClass()

案例: 通过反射获取String中的方法和属性

代码:

package com.zking.study;
​
import java.lang.reflect.Field;
import java.lang.reflect.Method;
​
public class FanShe {
    public static void main(String[] args) {
​
//        反射获取属性
        System.out.println("String属性如下: ");
        Class<String> stringAttribute = String.class;
        Field[] fields = stringAttribute.getDeclaredFields();
        for (Field field: fields) {
            System.out.println(field.getName());
        }
​
        System.out.println("=============================================\nString属性如下: ");
//        通过反射获取String中的方法
        Method[] methods = stringAttribute.getDeclaredMethods();
        for (Method method: methods) {
            System.out.println(method.getName());
        }
    }
}
​

结果:

通过反射获取String方法和属性.png