大家好,又见面了,我是你们的朋友全栈君。
1.JDBC连接的连接步骤(Statement和PrepareStatement)
(2)建立连接(Connection)
(3)创建执行SQL的语句(Statement)
(4)执行语句
(5)处理执行结果(ResultSet)
(6)释放资源
1.1注册驱动
推荐这种方式,不会对具体的驱动类产生依赖。
(2)DriverManager.registerDriver(com.mysql.jdbc.Driver);
会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。
(3)System.setProperty(“jdbc.drivers”, “driver1:driver2”);
虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用
。
1.2 建立连接
(1)url格式:JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…
(2)User,password可以用“属性名=属性值”方式告诉数据库;
1.3 创建执行SQL的语句
Statement st = conn.createStatement();
ResultSet rs =st.executeQuery(sql)
PreparedStatement ps = conn.preparedStatement(sql);
ps.setString(1, “col_value”); //将第一个?替换成col_value
ResultSet rs = ps.executeQuery();
1.4 处理执行结果(ResultSet) //只有查询需要处理结果
rs.getString(“col_name”);
rs.getInt(“col_name”);
//…
}
1.5 释放资源
(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总结
查询用Statement.executeQuery来完成,返回的是ResultSet对象,ResultSet中包含了查询的结果;查询相对与增、删、改要复杂一些,因为有查询结果要处理。
3. SQL注入,PreparedStatement和Statement
PreperedStatement(从Statement扩展而来)相对Statement的优点:
1.没有SQL注入的问题。
2.Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。
3.数据库和驱动可以对PreperedStatement进行优化(只有在相关联的数据库连接没有关闭的情况下有效)。
4. 代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mysql.jdbc.Statement;
public final class JdbcUtils {
private static String url = "jdbc:mysql://localhost:3306/mydatabase";
private static String user = "root";
private static String password = "123";
private JdbcUtils() {
}
/**
* 注册驱动
*/
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 建立连接
*
* @return
*/
public static Connection getConnection() {
Connection conn = null;
try {
conn = (Connection) DriverManager.getConnection(url, user, 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.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放Statement
try {
if (st != null)
st.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放Connection
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
工具类(单例模式)JdbsUtilsSing.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mysql.jdbc.Statement;
public final class JdbcUtilsSing {
private String url = "jdbc:mysql://localhost:3306/mydatabase";
private String user = "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("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 建立连接
*
* @return
*/
public Connection getConnection() {
Connection conn = null;
try {
conn = (Connection) DriverManager.getConnection(url, user, 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 {
if (rs != null)
rs.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放Statement
try {
if (st != null)
st.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放Connection
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
public static JdbcUtilsSing getInstance() 来创建实例,从而调用类中的其他成员方法。
采用Statement建立连接(采用的是单例模式JdbcUtilsSing)
static void template() { Connection conn = null; Statement st = null; ResultSet rs = null; try { // 建立连接 // conn = (Connection) JdbcUtils.getConnection(); conn = (Connection) JdbcUtilsSing.getInstance().getConnection(); // 创建语句 st = (Statement) conn.createStatement(); // 执行语句 String sql = null; // sql = "select * from my_class"; sql = "insert into my_class"; rs = st.executeQuery(sql); // 处理结果 while (rs.next()) { System.out.println(rs.getObject("id") + "\t" + rs.getObject("c_name") + "\t" + rs.getObject("room")); } } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtilsSing.getInstance().free(rs, st, conn); //关闭资源 } }
static void query(String name) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { // 建立连接 // conn = (Connection) JdbcUtils.getConnection(); conn = (Connection) JdbcUtilsSing.getInstance().getConnection(); // 创建语句 String sql = "select id,Number,name,age from my_Student where name =?"; ps = (PreparedStatement) conn.prepareStatement(sql); ps.setString(1, name); // 代替第一个? // 执行语句 rs = ps.executeQuery(); // 处理结果 while (rs.next()) { System.out.println(rs.getObject("id") + "\t" + rs.getObject("Number") + "\t" + rs.getObject("name") + "\t" + rs.getObject("age")); } } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtilsSing.getInstance().free(rs, ps, conn); //关闭资源 } }
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141904.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...