JDBC链接数据库的五种方法

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值