JDBC(java数据库连接技术)和DBCP(数据库连接池)联合使用

1.配置文件

首先要创建创建db.properties配置文件(properties文件可以通过Properties对象读取文件内容,根据等号前的内容从而读取到等候后面的内容,有点类似map的key、value),文件内容:

oracle写法:

driver=oracle.jdbc.driver.OracleDriver

url=oracle:jdbc:thin:@127.0.0.1(本机数据库):1521:xe(10g为xe11g为orcl)

user=scott(数据库已有账户)

pwd=相应账户密码

mysql写法:

driver=com.mysql.jdbc.Driver

url=jdbc:mysql://127.0.0.1(本机数据库):3306:/test(相应数据库的名称)

user=root

pwd=安装数据库时设置的密码

2.DBUtil工具类

public class DBUtil{
	private static String driver;
	private static String url;
	private static String user;
	private static String pwd;
	//创建连接池对象
	private static BasicDataSource bds = new BasicDataSource(); 
	/*
	 * 静态代码块,在类加载的时候提前加载
	 */
	static{
		try {
			FileReader fr = new FileReader("db.properties");//读取配置文件
			Properties prop = new Properties();//创建Properties对象来读取文件中对应的内容
			prop.load(fr);//加载文件
			/*读取相关属性*/
			driver = prop.getProperty("driver");
			url = prop.getProperty("url");
			user = prop.getProperty("user");
			pwd = prop.getProperty("pwd");
			
			//给连接池设置参数
			bds.setDriverClassName(driver);
			bds.setUrl(url);
			bds.setUsername(user);
			bds.setPassword(pwd);
			
			//初始化连接数
			bds.setInitialSize(5);
			//最大活跃数,同一时间最多能活跃多少时间点
			bds.setMaxActive(8);
			//最大空闲连接数
			bds.setMaxIdle(4);
			//最小空闲连接数,两个数越接近,产生的开销越小
			bds.setMinIdle(4);
			//最大的等待时间,单位毫秒
			bds.setMaxWait(30);
			
			
			/*
			 * 使用JDBC步骤一:加载驱动
			 */
			Class.forName(driver);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	/**
	 * 创建连接方法创建数据库连接调用的方法
	 * @return  Connection数据库连接对象
	 */
	public static Connection getConn(){
		Connection conn = null;
		try {
			conn = bds.getConnection();
		} catch (Exception e) {
			// TODO: handle exception
		}
		return conn;
	}
	/**
	 * 数据库连接关闭方法
	 * @param conn   数据库连接对象
	 */
	public static void closeConn(Connection conn){
		try {
			if(conn!=null){
				//断开连接,归还给了连接池
				conn.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

3.DBUtil类的使用(eq为oracle数据库插入方法)

	public void addEmp(Emp emp) {
		// TODO Auto-generated method stub
		Connection conn = null;
		try {
			//1.创建连接和加载驱动
			conn = DBUtil2.getConn();
			//设置处理事务为手动
			conn.setAutoCommit(false);
			//2.要执行的sql语句
			String sql = "insert into emp values(?,?,?,?,?,?,?,?)";
			//3.创建PreparedStatement语句对象
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setInt(1, emp.getEmpno());
			ps.setString(2, emp.getEname());
			ps.setString(3, emp.getJob());
			ps.setInt(4, emp.getMgr());
			ps.setDate(5, emp.getHiredate());
			ps.setDouble(6, emp.getSal());
			ps.setDouble(7, emp.getComm());
			ps.setInt(8, emp.getDeptno());
			//4.执行sql语句对象,返回值为影响了多少行数据
			ps.executeUpdate();
			conn.commit();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			try {
				conn.rollback();				
			} catch (Exception e2) {
				// TODO: handle exception
				e.printStackTrace();
			}
		}finally{
			/*
			 * 5.连接使用完要关闭
			 */
			DBUtil2.closeConn(conn);
		}
	}

说明:为什么使用PreparedStatement不使用Statement作为sql语句执行的对象?

1.PerparedStatement执行的是动态的sql语句,使用?作为占位符,使用setDataType(1,x)作为赋值方法,而Statement是执行的是静态的sql语句

2.Statement有sql注入漏洞

3.PreparedStatement执行多个sql语句每次 只需要编译一次,Statement执行多个sql语句需要编译多此

4.单例模式:实现持久层代码的对象实现

使用单例模式的三个必须的条件:

1.属性为静态私有

2.要使用单例模式的类不能够被实例化,也就是构造方法私有化

3.有一个静态方法可以为属性赋值

说明:单例模式的两种模式:

        a.(懒汉模式):可以理解不愿意做,开始属性不进行赋值,需要方法进行赋值,并调用

	//1.私有化属性
	private static EmpDao dao = null;

	//2.构造器私有化
	private DaoFactory(){}
	
	//3.对象
	public static EmpDao getInstance(){
		if(dao == null){
			dao = new EmpDaoMysqlImpl();
			//dao = new EmpDaoImpl();
		}
		return dao;
	}

        b.(饿汉模式):可以理解迫切想要做,刚开始的时候属性就有值,不用方法再进行赋值,方法只是调用

	//1.私有化属性
	private static EmpDao dao = new EmpDaoMysqlImpl();

	//2.构造器私有化
	private DaoFactory(){}
	
	//3.对象
	public static EmpDao getInstance(){
		return dao;
	}


猜你喜欢

转载自blog.csdn.net/lg_49/article/details/79732438