JDBC连接(Statement和PrepareStatement)
1.JDBC连接的连接步骤(Statement和PrepareStatement)
(1)注册驱动 (只做⼀次)
(2)建⽴连接(Connection)
(3)创建执⾏SQL的语句(Statement)
(4)执⾏语句
(5)处理执⾏结果(ResultSet)
(6)释放资源
1.1注册驱动
(1)Class.forName(“sql.jdbc.Driver”);
推荐这种⽅式,不会对具体的驱动类产⽣依赖。
(2)sql.jdbc.Driver);
会造成DriverManager中产⽣两个⼀样的驱动,并会对具体的驱动类产⽣依赖。
(3)System.tProperty(“jdbc.drivers”, “driver1:driver2”);
虽然不会对具体的驱动类产⽣依赖;但注册不太⽅便,所以很少使⽤。
1.2 建⽴连接
Connection conn = Connection(url, ur, password);
(1)url格式:JDBC:⼦协议:⼦名称//主机名:端⼝/数据库名?属性名=属性值&…
(2)Ur,password可以⽤“属性名=属性值”⽅式告诉数据库;
1.3 创建执⾏SQL的语句
(1)Statement类的创建执⾏sql语句:
String sql = “lect * from table_name where col_name=‘李四’”;
Statement st = ateStatement();
ResultSet rs =st.executeQuery(sql)
(2)PreparedStatement类的创建执⾏sql语句:
String sql = “lect * from table_name where col_name=?”;
PreparedStatement ps = conn.preparedStatement(sql);
ps.tString(1, “col_value”); //将第⼀个?替换成col_value
ResultSet rs = ps.executeQuery();
1.4 处理执⾏结果(ResultSet) //只有查询需要处理结果
()){
蒲公英的功效rs.getInt(“col_name”);
/
/…
}
1.5 释放资源
(1)释放ResultSet, Statement,Connection.
(2)数据库连接(Connection)是⾮常稀有的资源,⽤完后必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机。Connection的使⽤原则是尽量晚创建,尽量早的释放。
2. 基本的CRUD(创建、读取、更新、删除)
2.1模板代码
Connection conn = null;
Statement st=null;
ResultSet rs = null;
try {
//获得Connection
//创建Statement
//处理查询结果ResultSet
} finally {
//释放资源ResultSet, Statement,Connection
}
2.2 CRUD总结
(1)增、删、改⽤uteUpdate来完成,返回整数(匹配的记录数),这类操作相对简单。
(2)查询⽤uteQuery来完成,返回的是ResultSet对象,ResultSet中包含了查询的结果;查询相对与增、删、改要复杂⼀些,因为有查询结果要处理。
3. SQL注⼊,PreparedStatement和Statement
在SQL中包含特殊字符或SQL的关键字(如:' or 1 or ')时Statement将出现不可预料的结果(出现异常或查询的结果不正确),可⽤PreparedStatement来解决。
PreperedStatement(从Statement扩展⽽来)相对Statement的优点:
1.没有SQL注⼊的问题。
2.Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。
3.数据库和驱动可以对PreperedStatement进⾏优化(只有在相关联的数据库连接没有关闭的情况下有效)。
4. 代码
⼯具类JdbsUtils.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
爨体sql.jdbc.Statement;
public final class JdbcUtils {
private static String url = "jdbc:mysql://localhost:3306/mydataba";
private static String ur = "root";
private static String password = "123";
对称美
private JdbcUtils() {
}
/**
* 注册驱动
*/
static {
try {
Class.forName("sql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}燕是什么结构
}
/**
* 建⽴连接
*
* @return
*/
public static Connection getConnection() {
Connection conn = null;
try {
conn = (Connection) Connection(url, ur, password); } catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 释放资源
*
* @param rs
天不绝曹* @param st
* @param conn
*/
public static void free(ResultSet rs, Statement st, Connection conn) {
// 释放ResultSet
try {
if (rs != null)
rs.clo();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放Statement
try {
if (st != null)
st.clo();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放Connection
try {
if (conn != null)
conn.clo();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
⼯具类(单例模式)JdbsUtilsSing.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
sql.jdbc.Statement;
public final class JdbcUtilsSing {
private String url = "jdbc:mysql://localhost:3306/mydataba";
private String ur = "root";
private String password = "123";
private static JdbcUtilsSing instance = null;
private JdbcUtilsSing() {
}
public static JdbcUtilsSing getInstance() {
if (instance == null) {
synchronized (JdbcUtilsSing.class) {
if(null == instance){ //这步必须
instance = new JdbcUtilsSing();
}
}
}
return instance;
}
/
**
* 注册驱动
*/嘲鸫
static {
try {
Class.forName("sql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 建⽴连接
*
* @return
*/
public Connection getConnection() {
Connection conn = null;
try {
conn = (Connection) Connection(url, ur, password); } catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 释放资源
*
* @param rs
* @param st
* @param conn
*/
public void free(ResultSet rs, Statement st, Connection conn) {
// 释放ResultSet
try {如何剪五角星
try {
if (rs != null)
rs.clo();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放Statement
try {
if (st != null)
st.clo();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放Connection
try {
if (conn != null)
conn.clo();
} catch (SQLException e) {
煮饺
e.printStackTrace();
}
}
}
}
}
(1)单例模式是通过静态⽅法 public static JdbcUtilsSing getInstance() 来创建实例,从⽽调⽤类中的其他成员⽅法。(2)⼯具类是直接类名调⽤相应的静态⽅法。
采⽤Statement建⽴连接(采⽤的是单例模式JdbcUtilsSing)