JDBC连接(Statement和PrepareStatement)「建议收藏」

JDBC连接(Statement和PrepareStatement)「建议收藏」1.JDBC连接的连接步骤(Statement和PrepareStatement)(1)注册驱动(只做一次)(2)建立连接(Connection) (3)创建执行SQL的语句(Statement)(4)执行语句(5)处理执行结果(ResultSet)(6)释放资源1.1注册驱动(1)Class.forName(“com.mysql.jdbc.Drive

大家好,又见面了,我是你们的朋友全栈君。

1.JDBC连接的连接步骤(Statement和PrepareStatement)

(1)注册驱动 (只做一次)
(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”);
虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用



1.2 建立连接

Connection conn = DriverManager.getConnection(url, 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)  

(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();

1.4 处理执行结果(ResultSet)  //只有查询需要处理结果

While(rs.next()){

rs.getString(“col_name”);
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)增、删、改用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) {
		// 释放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();
				}
			}

		}

	}

}

(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); //关闭资源
		}
	}



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141904.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • NVIC库函数

    NVIC库函数1.voidNVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct)功能:根据NVIC_InitStruct结构体变量中的参数初始化NVIC外设注释:结构体中的NVIC_IRQChannel成员赋值要到stm32f10x.h中的IRQn_Type(STM32F10x中断数定义)去复制例如:NVIC_Init(&NVIC_InitStructur…

    2022年5月28日
    109
  • 阿里云上实现DDNS公网解析「建议收藏」

    阿里云上实现DDNS公网解析「建议收藏」目录阿里云官网购买域名服务器pip安装阿里云python-ddns库获取AccessKey复制DDNS代码创建定时任务验证DDNS是否成功阿里云官网购买域名注册阿里云账号,登录,进入控制台,点击域名进行购买,购买时会提示你登记身份信息。我的5年129元,不贵吧。不要买.com,.cn等等重要域名,因为非常贵。服务器pip安装阿里云python-ddns库因为有的人机器上同时有python2和python3,如果用pip安装就不起作用,所以以下六条命令都要执行一下,以防万一。pipins

    2022年5月29日
    462
  • 了解你的敌人:跟踪僵尸网络

    了解你的敌人:跟踪僵尸网络了解你的敌人:跟踪僵尸网络 利用蜜网对僵尸主机了解更多 蜜网项目组 & 蜜网研究联盟http://www .honeynet.org最后修改日期 : 2005 年 3 月 13 日 翻译者artemis:吴智发密罐是一种用来发现攻击工具,攻击策略与攻击者攻击动机的知名技术。在本文中,我们考虑一种特殊的安全威胁:运行僵尸网络的个人与组织。僵尸网络是一个可以由攻击者远程控制的已被攻陷主机组成的网络。由

    2022年7月25日
    9
  • 最小可用maven+springboot 项目(无法使用外网,但是有maven私库情况)

    最小可用maven+springboot 项目(无法使用外网,但是有maven私库情况)用的是ideal,jdk1.8具体操作,参考下面链接。致谢:感谢下面作者的博客https://blog.csdn.net/weixin_43293627/article/details/82877418https://blog.csdn.net/u011948899/article/details/78159027https://www.phpsong.com/3463.ht…

    2022年7月18日
    11
  • 如何得到给定序列的互补序列以及反向互补序列

    如何得到给定序列的互补序列以及反向互补序列用 python 实现如下 1 usr bin python2 Complementin dna ACTGATCGATTA 5 由于 python 区分大小写 所以先替换成小写可以有效避免后面重复替换的问题 6compleme

    2025年10月21日
    5
  • 数据库设计规范

    数据库设计规范数据库的重要性不言而喻。对程序员来说跟数据库打交道更是家常便饭。数据库给开发带来了巨大的便利。我们或多或少的知道一些数据库设计规范,但并不全面。今天我就简单整理一下,帮自己做个总结梳理,也希望可以帮到小伙伴们。数据库设计规范包括命名规范、库表基础规范、字段规范、索引规范和SQL设计规范。1.命名规范1.1库名、表名、字段名禁止使用MySQL保留字。1.2库名、表名、字段名使…

    2022年7月12日
    24

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号