第一节、复习
(1)注解 :可以对程序进行一定的说明,这点跟注释相似,但是比注释多的是可以在程序运行时被其它程序读取(反射技术)
ORM: 对象关系映射 以@interface 注解名称
(2)XML : W3C中结构的标准,作用:用于存储和传输数据(会编写)
(3)DOM4J :用于解析xml文件 (实际上解析的意思,就是程序运行时,从xml文件中读取数据)(了解作用)
(4)属性文件 :以 .properties结尾的文件,使用Properties属性对象读取属性文件中的内容
使用属性文件和属性对象对JDBCUtil进行了封装(会使用)
第二节、手写数据库连接池
一、没有连接池的程序
编写一个JDBC的应用程序,使用多线程,体会一下效率问题
功能:查询
一共有3个客户端,每个客户端的一次请求内有3个查询操作(模拟的是批量操作)
每一个请求进来都需要创建一个Connection对象,一共是3个,每个请求内又有三次操作数据库的动作,又有3个,一共是九个连接对象
问题:大量的创建和销毁对象,所以性能低下
解决方案:使用连接池
数据库连接池原理图
二、手写数据库连接池
实体类
package com.bjsxt.entity;
/**
* Dept类(实体类)
*/
public class Dept {
private int deptno;
private String dname;
private String loc;
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
public Dept(int deptno, String dname, String loc) {
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
}
public Dept() {
}
@Override
public String toString() {
return "Dept{" +
"deptno=" + deptno +
", dname='" + dname + '\'' +
", loc='" + loc + '\'' +
'}';
}
}
手写连接池的类 (在该类中的获取连接和归还连接的方法)
package com.bjsxt.util;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.LinkedList;
/**
*手写数据可连接池
*/
public class MyConnection {
private static LinkedList<Connection> list=new LinkedList<>();
static{
for (int i = 0; i <5 ; i++) {
Connection conn = JDBCUtil2.getConn();
System.out.println("创建连接对象,并放入连接池中-->"+conn);
list.add(conn);
}
}
//
public static Connection getConnection(){
if(list.size()!=0){
Connection connection = list.removeFirst();
System.out.println("正在使用的连接是"+connection);
return connection;
}else{
//等于0说明池中的对象都在使用,需要重新创建
Connection conn = JDBCUtil2.getConn();
System.out.println("池中的连接对象不够使用了,所以我新创建的连接:"+conn);
return conn;
}
}
//
public static void returnConnection(Connection connection){
try {
if(null!=connection && !connection.isClosed()){
if(list.size()<8){
System.out.println("池中未满,可以将连接对象归还"+connection);
list.add(connection);
}else {
System.out.println("池中已满,需要关闭连接");
connection.close();
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/*
public static void main(String[] args) {
System.out.println();
}
*/
}
JDBCUtil
package com.bjsxt.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
/**
*使用属性文件封装JDBCUtil
*/
public class JDBCUtil2 {
private static String DRIVER ;
private static String URL;
private static String USERNAME ;
private static String PWD ;
//static静态代码块,为类的静态变量赋值
static{
File file=new File("jdbc.properties"); //创建文件
Properties properties = new Properties(); //创建属性对象
if(!file.exists()){
//如果文件不存在,创建
//如果文件不存在,则需要初始化数据(数据库连接字符串的数据),默认连mysql数据库
properties.setProperty("mysqlDriver","com.mysql.jdbc.Driver");
properties.setProperty("mysqlURL","jdbc:mysql://localhost:3306/syl1105");
properties.setProperty("mysqlUserName","root");
properties.setProperty("mysqlPassWord&#