JDBC高级编程笔记

建立数据库连接的步骤

注册驱动(只做一次)通常通过静态代码块

建立连接(Connection)

创建执行sql语句(Statement)

执行语句

处理执行结果ResultSet

释放资源


注册驱动的方式

Class.forName("com.mysql.jdbc.Driver");//注册mysql驱动

推荐这种方式,不会对具体的驱动类产生依赖

DriverManager.registerDriver(com.mysql.jdbc.Driver)

会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖

System.setProperty("jdbc.drivers","driver1:driver2");

虽然不会对具体的驱动类产生依赖,但注册太不方便,所以很少使用

mysql的url和驱动

//mysql
//jdbc:mysql://<hostname>[<:3306>]/<dbname>
//com.mysql.jdbc.Driver
sqlserver2005的url和驱动
//sqlserver2005
//jdbc:sqlserver://<server_name>:<port>[;databaseName=<dbname>]
//com.microsoft.sqlserver.jdbc.SQLServerDriver


Connection负责连接数据库并担任传送数据的任务

DriverManager.getConnection(url, username, password)


例子:


package com.lizhenhua.jdbc;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;


public class TestJDBC {


public static void main(String[] args) {
ResultSet rs = null;
Statement statement = null;
Connection con = null;
try {
//第一步:加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//第二步:通过驱动管理获得数据库连接
String url="jdbc:mysql://localhost:3306/test";
String user="root";
String password="root";
con = DriverManager.getConnection(url, user, password);
//第三步:获取基本语句对象
statement = con.createStatement();
//第四步:提供相应查询语句
String sql="select * from user";
//第五步:获取结果集
rs = statement.executeQuery(sql);
//第六步:迭代结果集
ArrayList<User> users = new ArrayList<User>();
while (rs.next()) {
//根据列名获取
User temp = new User();
temp.setUser_id(rs.getInt("user_id"));
temp.setUser_name(rs.getString("user_name"));
temp.setUser_pass(rs.getString("user_pass"));
//第七步:输出获取数据
System.out.println(temp);
//添加到用户线性表中
users.add(temp);
}

} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("找不到驱动包");
} catch (SQLException e) {
e.printStackTrace();
}finally{
//第八步:释放资源
try {
if(rs!=null){
rs.close();
}
if(statement!=null){
statement.close();
}
if(con!=null){
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}


PreperedStatement相对Statement的优点

1。没有sql注入问题

2.Statement会始数据库频繁编译SQL,可能造成数据库缓冲区溢出

3.数据库和驱动可以对PreperedStatement进行优化(只有在相关联的数据库连接没有关闭的情况下有效)


PerparedStatement应用


package com.lizhenhua.jdbc;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public final class JDBCUtil {
//数据库访问URL
private static String url="jdbc:mysql://localhost:3306/test";
//数据库用户名
private static String username="root";
//数据库密码
private static String password="root";

//私有的构造方法,单例设计模式
private JDBCUtil(){
}
//静态代码块加载驱动
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获得数据库连接
* @return 
* @throws SQLException
*/
public static Connection getConnection() throws SQLException{
return DriverManager.getConnection(url, username, password);
}
/**
* 释放连接资源
* @param rs
* @param st
* @param conn
*/
public static void free(ResultSet rs,Statement st,Connection conn){
try {
if(rs!=null){
rs.close();
}
if(st!=null){
st.close();
}
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}


package com.lizhenhua.jdbc;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class TestJDBCDemo {


/**
* 读取指定用户名信息
* @param username
* @throws SQLException 
*/
public static void read(String username) throws SQLException{
String sql = "select * from user where user_name = ?";
Connection conn = JDBCUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, username);
ResultSet rs = pstmt.executeQuery(sql);
while(rs.next()){
//通过索引取结果集中的数据索引从1开始
User user = new User(rs.getInt(1), rs.getString(2), rs.getString(3));
System.out.println(user);
}
JDBCUtil.free(rs,pstmt,conn);
}
public static void main(String[] args) {
try {
read("dd");
} catch (SQLException e) {
e.printStackTrace();
}
}

}


ResultSetMetaData接口 :元数据信息。即表结构相关的信息

常用方法

getColumCount();获取该结果集有多少列

getColumName();相当于获取列名

getColumType()相当于获取列的数据类型


CallableStatement接口

//调用存储过程生成CallableStatement对象

CallableStatement cstmt = conn.prepareCall("{call GetEmail(?,?)}");

//设置第一个参数

cstmt.setString(1,username);

//设置第二个参数为输出参数类型

cstmt.registerOutParameter(2,java.sql.Types.VARCHAR);

//执行

cstmt.execute();

//取值

String email = cstmt.getString(2);






你可能感兴趣的:(JDBC高级编程笔记)