(1)
package day20151102JDBC;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/**
* 测试使用JDBC连接oracle数据库
*
* JDBC工作过程:
-加载驱动,建立连接
(加载驱动靠driverManager,并且通过driverManager获取连接connection)
-创建语句对象
通过connection创建statement。用于执行sql语句
-执行sql语句
-处理结果集
若执行的是Select语句,会产生结果集resultSet
-关闭连接
调用connection的close方法
*/
public class JDBCDemo {
public static void main(String[] args) {
try{
//加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
/*
*当出现了:
*java.lang.ClassNotFoundException:
* oracle.jdbc.driver.OracleDriver
*
* 这个异常时,索命数据库的驱动jar包没有导入到项目中
*
* 若导入了jar包还报这个错,大部分原因是书写驱动有错误
*/
/*
* 通过DriverManager获取数据库连接
* 注意导入的包都在java.sql.*
*
* DriverManager连接oracle时的路径格式
* jdbd:oracle:thin:@1<host>:<port>:<sid>
*
* Mysql的路径:
* jdbc:mysql://<host>:<port>/<dbname>
* mySql端口号port通常是3306
* dbname:数据库的名字
*
* (mysql的jar包 mysql-connection-java-5.0.4-bin.jar)
* mysql加载驱动:class.forname("com.mysql.jdbc.Driver");
*/
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:xe",
"username",
"password");
/*
* 通过Connection创建Statement
* 用来执行sql语句
*/
Statement state = conn.createStatement();
/*
* boolean flag = state.excute(sql)
* 用于执行ddl语句(创建表删除表等),
* 返回结果为DDL语句是否执行成功
*
* ResultSet rs = state.executeQuery(sql)
* executeQuery用于执行Select语句
*
* int num =state.executeUpdate(sql)
* 用于增删改(DML语句)
* 返回值是影响了多少条数据
*/
/*
*通过Statement执行查询语句
*查询emp表中的信息
*SELECT empno,ename,sal,deptno FROM emp_ls;
*/
String sql = "SELECT empno,ename,sal,deptno FROM emp";
//输出sql,用于检查拼写是否有错
System.out.println(sql);
/*
* 使用executeQuery来执行DQL语句
* 并且会得到结果集
*/
ResultSet rs = state.executeQuery(sql);
/*
* 需要注意的是,ResultSet表示的
* 是查询结果,但实际上查询的结果集
* 在oracle数据库服务器上,并没有全部
* 保存在本地,所以,关闭连接不可放在此处
*/
while(rs.next()){
int empno = rs.getInt("empno");
String name = rs.getString("ename");
double salary = rs.getDouble("sal");
int deptno = rs.getInt("deptno");
System.out.println(empno+","+name+","+salary+","+deptno);
}
//关闭连接
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
———————————————->>>
config.properties
#井号后是注释,驱动
driver=oracle.jdbc.driver.OracleDriver
#数据库地址
url=jdbc:oracle:thin:@localhost:1521:xe
#用户名
user=username
#密码
psw=password
initsize=1
maxactive=1
maxwait=5000
maxidle=1
minidle=1
Demo2
package day20151102JDBC;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
/**
* 测试配置文件的读取
* config.properties
*/
public class JDBCDemo2 {
public static void main(String[] args) {
try{
//java.util.Properties;
/*
* Properties类用于读取properties文件
* 使用该类可以以类似map的形式读取配置
* 文件中的内容
*
* properties文件中的内容格式类似:
* user=userid
* 等号左边就是key,右边就是value
*/
Properties prop = new Properties();
/*
* 使用Properties去读取配置文件
*/
// ./src/day01/config.properties在tomcat中不好用,这里暂时这么用
FileInputStream fis = new FileInputStream("./src/day20151102JDBC/config.properties");
/*
* 当通过Properties读取文件后,那么这个
* 流依然保持打开状态,我们应当自行关闭
*/
prop.load(fis);
fis.close();
System.out.println("成功加载完毕配置文件");
/*
* 当加载完毕后,就可以根据文本文件中
* 等号左边的内容key来获取等号右边的
* 内容value了
* 可以变相的把Properties看做是一个Map
*/
String driver = prop.getProperty("driver");
String url = prop.getProperty("url");
String user = prop.getProperty("user");
String psw = prop.getProperty("psw");
System.out.println(driver+","+url+","+user+","+psw);
Class.forName(driver);
Connection conn = DriverManager.getConnection(
url,
user,
psw);
Statement state = conn.createStatement();
String sql = "SELECT empno,ename,sal,deptno FROM emp";
ResultSet rs = state.executeQuery(sql);
while(rs.next()){
int empno = rs.getInt("empno");
String name = rs.getString("ename");
double salary = rs.getDouble("sal");
int deptno = rs.getInt("deptno");
System.out.println(empno+","+name+","+salary+","+deptno);
}
//关闭连接
conn.close();
}catch(Exception e){
}
}
}
DBUtil类
package day20151102JDBC;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
/**
* 使用配置文件来配置JDBC连接数据库 该类用来管理数据库的连接
*/
public class DBUtil {
//连接数据库的路径
private static String url;
//用户名
private static String user;
//密码
private static String psw;
//用于管理不同线程所获取的连接
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
//map
//private static Map<Thread,Connection> map= new HashMap<Thread,Connection>();
// 静态块
static {
try {
// 读取配置文件
Properties prop = new Properties();
// 此处默认src为当前目录,适合tomcat,推荐使用
InputStream is = DBUtil.class.getClassLoader()
.getResourceAsStream("day20151102JDBC/config.properties");
prop.load(is);
is.close();
String driver = prop.getProperty("driver");
url = prop.getProperty("url");
user = prop.getProperty("user");
psw= prop.getProperty("psw");
System.out.println(driver+","+url+","+user+","+psw);
//注册驱动
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取一个连接
* @return
*/
public static Connection getConnection() throws Exception{
try{
//Thread t = Thread.currentThread();
//System.out.println("util Connection所在的进程:"+t);
/*
* 通过DriverManager创建数据库的连接
* 并返回
*/
Connection conn = DriverManager.getConnection(url,user,psw);
//map.put(t, conn);
/*
* ThreadLocal的set方法
* 会将当前线程作为key,并将给定的值
* 作为value存入内部map中保存
*/
tl.set(conn);
return conn;
}catch(Exception e){
e.printStackTrace();
throw e;
}
}
/**
* 关闭给定的连接
*/
public static void closeConnection(){
try{
//Thread t = Thread.currentThread();
//System.out.println("utilclose:"+t);
//Connection conn=map.get(t);
/*
* 用ThreadLocal来获取Connection
*/
Connection conn=tl.get();
if(conn != null){
conn.close();
//不再使用了,删除ThreadLocal中此map元素
tl.remove();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
DBUtil2
package day20151102JDBC;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.commons.dbcp.BasicDataSource;
/*
* 使用连接池技术管理数据库连接
*/
public class DBUtil2 {
//连接池
private static BasicDataSource ds;
//为不同线程管理连接
private static ThreadLocal<Connection> tl;
static{
try{
// 读取配置文件
Properties prop = new Properties();
// 此处默认src为当前目录,适合tomcat,推荐使用
InputStream is = DBUtil.class.getClassLoader()
.getResourceAsStream("day20151102JDBC/config.properties");
prop.load(is);
is.close();
//初始化连接池
ds= new BasicDataSource();
//设置驱动(Class.forName())
ds.setDriverClassName(prop.getProperty("driver"));
//设置url
ds.setUrl(prop.getProperty("url"));
//设置数据库用户名
ds.setUsername(prop.getProperty("user"));
//设置数据库密码
ds.setPassword(prop.getProperty("psw"));
//设置初始连接数
ds.setInitialSize(Integer.parseInt(prop.getProperty("initsize")));
//设置连接池最大连接数
ds.setMaxActive(Integer.parseInt(prop.getProperty("maxactive")));
//设置最大等待时间
ds.setMaxWait(Integer.parseInt(prop.getProperty("maxwait")));
//设置最小空闲线程数
ds.setMinIdle(Integer.parseInt(prop.getProperty("minidle")));
//设置最大空闲线程数
ds.setMaxIdle(
Integer.parseInt(
prop.getProperty("maxidle")));
//初始化线程本地
tl = new ThreadLocal<Connection>();
}catch(Exception e){
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException{
Connection conn = ds.getConnection();
tl.set(conn);
return conn;
}
//关闭数据库连接
public static void closeConnection(){
try{
Connection conn = tl.get();
if(conn != null){
/*
* 通过连接池获取的Connection
* 的close方法实际上兵灭有将连接关闭,
* 而是将该连接归还
*/
conn.close();
tl.remove();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
Demo3
package day20151102JDBC;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCDemo3 {
/**
* 通过DBUtil获取连接,并执行sql
*/
public static void main(String[] args) {
try{
//Connection conn = DBUtil.getConnection();
Connection conn = DBUtil2.getConnection();
System.out.println("数据库已连接");
Statement state = conn.createStatement();
String sql = "SELECT * FROM emp";
//执行sql,得到结果集
ResultSet rs = state.executeQuery(sql);
while(rs.next()){
int empno = rs.getInt("empno");
String ename = rs.getString("ename");
double sal = rs.getDouble("sal");
int deptno = rs.getInt("deptno");
System.out.println(empno+",,,"+ename+","+sal+","+deptno);
}
/*
* 当不再使用statement执行其他sql时,
* 应即使关闭statement
* 以释放JDBC与数据库的资源占用
*/
state.close();
//使用后关闭连接
//DBUtil.closeConnection();
DBUtil2.closeConnection();
}catch(Exception e){
e.printStackTrace();
}
}
}