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