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;
}