JDBC连接(Statement和PrepareStatement)
来源:互联网 发布:马踏棋盘 栈 贪婪算法 编辑:程序博客网 时间:2024/04/30 23:54
1.JDBC连接的连接步骤(Statement和PrepareStatement)
(1)注册驱动 (只做一次)
(2)建立连接(Connection)
(3)创建执行SQL的语句(Statement)
(4)执行语句
(5)处理执行结果(ResultSet)
(6)释放资源
(2)建立连接(Connection)
(3)创建执行SQL的语句(Statement)
(4)执行语句
(5)处理执行结果(ResultSet)
(6)释放资源
1.1注册驱动
(1)Class.forName(“com.mysql.jdbc.Driver”);
推荐这种方式,不会对具体的驱动类产生依赖。
(2)DriverManager.registerDriver(com.mysql.jdbc.Driver);
会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。
(3)System.setProperty(“jdbc.drivers”, “driver1:driver2”);
虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用。
推荐这种方式,不会对具体的驱动类产生依赖。
(2)DriverManager.registerDriver(com.mysql.jdbc.Driver);
会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。
(3)System.setProperty(“jdbc.drivers”, “driver1:driver2”);
虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用。
1.2 建立连接
Connection conn = DriverManager.getConnection(url, user, password);
(1)url格式:JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…
(2)User,password可以用“属性名=属性值”方式告诉数据库;
(1)url格式:JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…
(2)User,password可以用“属性名=属性值”方式告诉数据库;
1.3 创建执行SQL的语句
(1)Statement类的创建执行sql语句:
String sql = “select * from table_name where col_name=‘李四’”;
Statement st = conn.createStatement();
ResultSet rs =st.executeQuery(sql)
Statement st = conn.createStatement();
ResultSet rs =st.executeQuery(sql)
(2)PreparedStatement类的创建执行sql语句:
String sql = “select * from table_name where col_name=?”;
PreparedStatement ps = conn.preparedStatement(sql);
ps.setString(1, “col_value”); //将第一个?替换成col_value
ResultSet rs = ps.executeQuery();
PreparedStatement ps = conn.preparedStatement(sql);
ps.setString(1, “col_value”); //将第一个?替换成col_value
ResultSet rs = ps.executeQuery();
1.4 处理执行结果(ResultSet) //只有查询需要处理结果
While(rs.next()){
rs.getString(“col_name”);
rs.getInt(“col_name”);
//…
}
rs.getString(“col_name”);
rs.getInt(“col_name”);
//…
}
1.5 释放资源
(1)释放ResultSet, Statement,Connection.
(2)数据库连接(Connection)是非常稀有的资源,用完后必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机。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)增、删、改用Statement.executeUpdate来完成,返回整数(匹配的记录数),这类操作相对简单。
(2)查询用Statement.executeQuery来完成,返回的是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;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) {// 释放ResultSettry {if (rs != null)rs.close();} catch (SQLException e) {e.printStackTrace();} finally {// 释放Statementtry {if (st != null)st.close();} catch (SQLException e) {e.printStackTrace();} finally {// 释放Connectiontry {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) {// 释放ResultSettry {if (rs != null)rs.close();} catch (SQLException e) {e.printStackTrace();} finally {// 释放Statementtry {if (st != null)st.close();} catch (SQLException e) {e.printStackTrace();} finally {// 释放Connectiontry {if (conn != null)conn.close();} catch (SQLException e) {e.printStackTrace();}}}}}
(1)单例模式是通过静态方法 public static JdbcUtilsSing getInstance() 来创建实例,从而调用类中的其他成员方法。
(2)工具类是直接类名调用相应的静态方法。
采用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); //关闭资源}}
采用PreparedStatement建立连接(采用的是工具类JdbcUtils)
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); //关闭资源}}
1 0
- JDBC连接(Statement和PrepareStatement)
- JDBC PrepareStatement 和 Statement
- JDBC(二)Statement,PrepareStatement和ResultSet
- jdbc Statement和PrepareStatement操作
- JDBC Statement 和 PrepareStatement的用法
- JDBC中prepareStatement 和Statement 的区别
- jdbc连接数据库演示(Statement、PrepareStatement,CallableStatement的演示)
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- jdbc操作数据库Statement和prepareStatement的区别
- div中class和id有什么区别?
- 每天一个Linux命令(23):Linux目录结构
- vc tcp端口是否被占用
- 强制断电引起的vmware无法启动
- 多个线程之间共享数据
- JDBC连接(Statement和PrepareStatement)
- Flex 布局
- 浏览器事件对象详解
- mfc icon转位图
- ext基本属性
- 【P1880】石子合并(环形)
- MFC拆分字符串方法
- SQL语句的内连接、左外连接、右外连接、全连接
- Android MPAndroidChart 直方图,曲线这,折线图的运用。