http://blog.163.com/muyexin@126/blog/static/39968083201081910321513/
1.1. 注册JDBC驱动程序
1. Class.forName("oracle.jdbc.driver.OracleDriver");< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />
2. Class.forName("oracle.jdbc.driver.OracleDriver");
3. java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver com.FirstJDBC
1.2. 创建数据库连接(获取Connection的方法)
1. 通过DriverManager获取
Connection conn = DriverManager.getConnection(url,“username",“password");
1) JDBC的URL=协议名+子协议名+数据源名。
a 协议名总是“jdbc”。
b 子协议名由JDBC驱动程序的编写者决定。
c 数据源名也可能包含用户与口令等信息;这些信息也可单独提供。
2) 几种常见的数据库连接
-------------------------------jdbc-odbc---------------
驱动:sun.jdbc.odbc.JdbcOdbcDriver
URL:jdbc:odbc:datasource_name
-------------------------------oracle------------------
驱动:oracle.jdbc.driver.OracleDriver
URL:jdbc:oracle:thin:@<machine_name><:port>:dbname
注:machine_name:数据库所在的机器的名称;
port:端口号,默认是1521
-------------------------------mysql-------------------
驱动:org.gjt.mm.mysql.Driver
or: com.mysql.jdbc.Driver
URL:jdbc:mysql://<machine_name><:port>/dbname
注:machine_name:数据库所在的机器的名称;
port:端口号,默认3306
---------------------------SQL Server------------------
驱动:com.microsoft.jdbc.sqlserver.SQLServerDriver
URL:jdbc:microsoft:sqlserver://<machine_name><:port>;DatabaseName=<dbname>
注:machine_name:数据库所在的机器的名称;
port:端口号,默认是1433
--------------------------DB2--------------------------
驱动:com.ibm.db2.jdbc.app.DB2Driver
URL:jdbc:db2://<machine_name><:port>/dbname
注:machine_name:数据库所在的机器的名称;
port:端口号,默认是5000
-------------------------------------------------------
2. 通过Driver直接获取(不推荐使用)
public static Connection getConnection() {
String url = "jdbc:mysql://localhost:3306/tarena";
String userName = "narci";
String password = "11";
Properties user = new Properties();
//key为user,password,不同的数据库的driver的key不是固定的
//视乎driver的实现者
user.setProperty("user", userName);
user.setProperty("password", password);
Driver driver=null;
Connection conn=null;
try {
driver = new com.mysql.jdbc.Driver();
conn = driver.connect(url, user);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
1.3. 创建SQL(存储过程)语句的对象
2.3.1. 创建Statement对象
1. Statement stm = con.createStatement();
2. 主要方法
1) 执行查询SQL语句(返回结果集)
ResultSet executeQuery(String sql) throws SQLException;
2) 执行更新SQL语句(返回受影响的行数)
int rows = executeUpdate(String sql) throws SQLException
3) 万能执行SQL语句(如果第一个结果为 ResultSet对象,则返回true;如果其为更新计数或者不存在任何结果,则返回false)
boolean flag=stmt.execute(sql);
ResultSet rs=null;
int rows=0;
if(flag){
rs=stmt.getResultSet();
}
else{
rows=stmt.getUpdateCount();
}
2.3.2. PreparedStatement
1. 用来处理SQL结构、关键部分相同的SQL语句
2. pstmt=conn.prepareStatement(sql);
3. 例子
String sql = "SELECT * FROM student WHERE stu_sex=?";
//?代表一个占位符合,它的值是待定的。
pstmt=conn.prepareStatement(sql);
//下面的语句设置?的值
//第一参数是?的索引位置
//第二参数:把?的值设置成这个参数
pstmt.setString(1,“f");
rs=pstmt.executeQuery();
String sql = "INSERT INTO student(stu_name,stu_sex,stu_age,stu_desc,stu_grade) VALUES(?,?,?,?,?)";
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, "LILY");
pstmt.setString(2, "F");
pstmt.setInt(3, 23);
pstmt.setString(4, "***");
pstmt.setString(5, "sd0702");
pstmt.executeUpdate();
2.3.3. CallableStatement
1. 用来执行存储过程
2. CallableStatement cstmt=con.prepareCall(sql);
3. 例子
String sql = "CALL getTotalStudent(?,?)";
CallableStatement cstmt=con.prepareCall(sql);
// 设置OUT和IN参数
cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
cstmt.setString(2, "xxx");
创建一个存储过程
in:参数从Java程序传到数据库的存储过程
out:反过来
SQl语句中创建存储过程:
1) delimiter //
2)
CREATE PROCEDURE getTotalStudent(OUT totalStudent integer(11),IN sex char(2))
BEGIN
SELECT count(*) INTO totalStudent FROM
student
WHERE stu_sex LIKE sex;
END//
3) delimiter ;
2.3.4. Statement接口的比较
Statement接口的比较
Statement PreparedStatement CallableStatement
代码创建 客户端 客户端 服务器端
代码存储 客户端 服务器端 服务器端
语言 Java、SQL Java、SQL 服务器端特定数据库语言
可配置性 灵活 较差 差
可移植性 高 高(支持) 差
效率 低 第一次低,以后高 高
选择:没有最好,只有最合适!
建议:可以移植性好首先考虑的条件!然后再考虑性能问题!
1.4. How to handle resultset
1. 通过index获取字段的值。
String getString(int columnIndex) //int类型的参数
SELECT * FROM student;//默认顺序按表里的定义顺序
rs.getString(3);//stu_sex
SELECT stu_name,stu_sex,stu_desc FROM student;
rs.getString(3);//stud_desc
columnIndex:select子句中该字段的索引位置
2. 通过字段名获取字段的值。
String getString(String columnName) //String类型的参数
以 Java 编程语言中 String 的形式检索此 ResultSet 对象的当前行中指定列的值。
rs.getString("stu_name");//stu_name
rs.getInt("stu_id");//stu_id
3. Java类型到SQL类型的映射。
1.5. 关闭JDBC资源
1. 首先关闭记录集;
2. 其次关闭Statement;
3. 最后关闭连接对象。
if(rs !=null){
try{rs.close();}catch(SQLException e){e.printStackTrace();}}
if(stm!=null){try{stm.close();}catch(SQLException e){e.printStackTrace();}}
if(con!=null){try{con.close();}catch(SQLException e){e.printStackTrace();}}