您的位置:首页 > 数据库

JDBC链接数据库的五种方法

2018-03-29 09:26 239 查看
1.用JDBC连接Oracle数据库,在连接数据库之前要把Oracle数据库的服务都开启、还有在所在工程中加载驱动jar包,有两种方法:1)用DBUtil来编写工具类  2)用properties文件来编写连接参数  3)用dbcp连接池连接数据库
2.①先介绍一下DBUtil来编写的方法,其实很简单就是我们最常用连接方式,简单来说就是将各种添加驱动的参数都直接填写到函数中;具体操作如下。我没写测试类大家可以写一个主函数进行测试public class DBUtil {
public static Connection getConn() {
Connection conn = null;
try {
//加载驱动(加载驱动时,参数直接写在forName()函数中)
                 Class.forName("oracle.jdbc.driver.OracleDriver");
            //建立连接(url、user、pwd都直接写在getConnection中)
 conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:xe", "scott", "scott");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
//关闭数据库
 public static void closeConn(Connection conn) {
try {
if(conn!=null){
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

②再介绍一下用properties文件来编写连接参数:先在项目名下建一个文件db.properties(db是文件名、properties是文件类型)



建一个类DBUtil2。具体实现如下: <textarea readonly="readonly" name="code" class="java">
public class DBUtil2 {
private static String driver;
private static String url;
private static String user;
private static String pwd;

static {
try { //(1)文件字符流默认当前文件路径为:工程名下(将db.properties放在工程下)
FileReader fr = new FileReader("db.properties");
Properties pt = new Properties();
                        //(2)(将将db.properties放在src目录下),此方法的默认位置是scr目录
                    //   通过当前类的类加载器所获取的流读取配置文件类加载器获取的流:默认当前路径为src下
 //                   InputStream is =
//                    DBUtil.class.getClassLoader()
//            .getResourceAsStream("db.properties");   
//            prop.load(fr);
                          //加载文件
                         pt.load(fr);
//别忘赋值,加引号
                        //加载文件中的参数
                         driver=pt.getProperty("driver");
url = pt.getProperty("url");
user = pt.getProperty("user");
pwd = pt.getProperty("pwd");
Class.forName(driver);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConnection(){
Connection conn = null;
try {
conn = DriverManager.getConnection(url,user,pwd);

} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
public static void main(String[] args) {
System.out.println(getConnection());
}
}
</textarea>在db.properties中分别对url、user、pwd、driver进行赋值。//注意后面不加“”,直接赋值
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
user=scott
pwd=scott保存之后就可以运行了。
3.那么这两种方法有什么区别呢?我个人认为第二个这种用文本连接会比较好,更改不同的数据库时比较方便,因为后台我们在java程序中已经封装好了连接数据库的方法,所以直接改动文件就可以了,这样客户就能方便使用。

4.③用dbcp连接池连接数据库。
       先介绍一下用连接池的好处:正常我们完成一个数据库操作都会,对数据库进行连接和断开操作,这个操作很占内存,所以我们用连接池的话就会好许多。
连接池作用:连接池会在程序启动时、数据库连接时,创建好一定数量的连接。
      dbcp连接,具体如下:public class DBUtil2 {
private static String driver;
private static String url;
private static String user;
private static String pwd;

//创建连接池对象BasicDataSource 类是固定的
private static BasicDataSource bds = new BasicDataSource();

static{
try {
FileReader fr = new FileReader("p"+File.separator+"db.properties");
Properties prop = new 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);

Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
Connection conn = null;
try {
conn = bds.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}

public static void closeConnection(Connection conn){
try {
if(conn!=null){
//断开连接,归还给连接池
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
System.out.println(getConnection());
}

}
5.④第四种方法是一个相对之前的三个来说最安全的一个连接方法,因为它用到了线程池的控制,具体如下:public class DBUtil3 {
private static String driver;
private static String url;
private static String user;
private static String pwd;

private static BasicDataSource bds = new BasicDataSource();//建一个数据连接池对象
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();//建一个线程池对象

static{

try {
FileReader fr = new FileReader("db.properties");
Properties pt = new Properties();
pt.load(fr);
driver=pt.getProperty("driver");
url = pt.getProperty("url");
user = pt.getProperty("user");
pwd = pt.getProperty("pwd");
bds.setDriverClassName(driver);
bds.setUrl(url);
bds.setUsername(user);
bds.setPassword(pwd);

bds.setMaxActive(4 );
bds.setMaxIdle(8);

Class.forName(driver);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
public static synchronized Connection getConnection(){
Connection conn = null;
try {

if(conn==null){
conn = bds.getConnection();//一个连接对象,一个线程
tl.set(conn);
}
conn = tl.get();

} catch (Exception e) {
e.printStackTrace();
}
return conn;

}

public static synchronized void closeConnection(){
Connection conn=null;
try {
conn = tl.get();
if(conn!=null){
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
System.out.println(getConnection());
}

}
6.⑤用PreparedStatement当连接池,PreparedStatement比Statement更安全,它的优点是:只编译一次是动态修改sql语句,可以有效防止sql注入(预编译sql语句之后不能更改sql语句的结构),消耗内存少更方便。public void testPreparedStat(){
Connection conn = null;
try {
conn = DBUtil2.getConnection();
String sql = "select * from emp where ename=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, "WARD");//setString 看的是问号属性的类型
ResultSet rs = ps.executeQuery();
while(rs.next()){
int empno = rs.getInt("empno");
System.out.println(empno);

}

} catch (Exception e) {
e.printStackTrace();
}finally{
DBUtil2.closeConnection(conn);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息