MySQL -----> JDBC编程
Posted ohana!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL -----> JDBC编程相关的知识,希望对你有一定的参考价值。
目录
一,什么是JDBC
- JDBC,即Java Database Connectivity,java数据库连接
- 是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范
- 这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成
- API为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问
二,JDBC工作原理及优势
JDBC 为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包含一些通用的接口类
JDBC优势:
- Java语言访问数据库操作完全面向抽象接口编程
- 开发数据库应用不用限定在特定数据库厂商的API
- 程序的可移植性大大增强
三,JDBC使用总结
1. 创建数据库连接Connection
Connection connection = DriverManager.getConnection("URL");
mysql数据连接的URL参数格式如下:
jdbc:mysql://服务器地址:端口/数据库名?参数名=参数值
2. 创建操作命令Statement
Statement statement = connection.createStatement();
3. 使用操作命令来执行SQL
ResultSet resultSet= statement.executeQuery
("select id, sn, name, qq_mail, classes_id from student");
4. 处理结果集ResultSet
while (r.next())
int id = r.getInt("id");
int sn = r.getInt("sn");
String name = r.getString("name");
String qqMail = r.getString("qq_mail");
int classesId = r.getInt("classes_id");
System.out.printf("id=%s,sn=%s,name=%s,qqMail=%s,classesId=%s\\n",
id, sn, name, qqMail, classesId);
5. 释放资源
if(r != null)
r.close();
if(s != null)
s.close();
if(conn != null)
conn.close();
具体实现代码:
package com.bit.jdbc;
import java.sql.*;
public class QueryTest
public static void main(String[] args) throws ClassNotFoundException, SQLException
Connection conn = null;
Statement s = null;
ResultSet r = null;
try
//反射的方式,加载一个类(类加载:执行静态变量,静态代码块)
//数据库驱动包就可以在这种操作下,执行对应的初始化工作(驱动)
Class.forName("com.mysql.jdbc.Driver");
//获取数据库连接:Connection接口,需要使用jdbc中的,不要使用mysql中的
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java43?user=root&password=123456&useUnicode=true&characterEncoding=UTF-8&useSSL=false");
System.out.println(conn);
//通过连接对象创建操作命令对象Statement(使用jdbc中的),该对象是用于操作sql的一个抽象的对象
s = conn.createStatement();
//查询:
// (1)调用Statement操作命令对象的executeQuery(sql)
// (2)返回一个ResultSet结果集对象(查询sql执行的结果集)
r = s.executeQuery("select id,sn,name,qq_mail,classes_id from student where id>3");
//处理结果集:结果集可能是多行数据,需要遍历来获取
// 调用next就移动到下一行,返回true代表该行有数据,返回false代表该行没有数据
while (r.next()) //一直遍历到最后
//进入循环,代表操作遍历的一行数据
int id = r.getInt("id");
String sn = r.getString("sn");
String name = r.getString("name");
String qqMail = r.getString("qq_mail");
int classesId = r.getInt("classes_id");
System.out.printf("id=%s, sn=%s, name=%s, qqMail=%s, classesId=%s\\n",
id, sn, name, qqMail, classesId);
finally //无论如何,都要释放资源
//释放资源:
//(1)无论什么情况(异常)
//(2)释放的顺序,和创建的顺序要相反(结果集对象,操作命令对象,数据库连接对象)
if(r != null)//出现异常的时候,对象可能还没有赋值(初始化),调用close就会出现空指针异常
r.close();
if(s != null)
s.close();
if(conn != null)
conn.close();
四,JDBC常用接口和类
1.JDBC API
在Java JDBC编程中对数据库的操作均使用JDK自带的API统一处理,通常与特定数据库的驱动类是完全解耦的。所以掌握Java JDBC API (位于 java.sql 包下) 即可掌握Java数据库编程
2.数据库连接(Connection)
Connection接口实现类由数据库提供,获取Connection通常有两种方式
- 一种是通过DriverManager(驱动管理类)的静态方法获取:
// 加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 创建数据库连接
Connection connection = DriverManager.getConnection(url);
- 一种是通过DataSource(数据源)对象获取。实际应用中会使用DataSource对象
DataSource ds = new MysqlDataSource();
((MysqlDataSource) ds).setURL("jdbc:mysql://localhost:3306/ttl");
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("111111");
((MysqlDataSource) ds).setUseUnicode(true);
((MysqlDataSource) ds).setCharacterEncoding("UTF-8");
((MysqlDataSource) ds).setUseSSL(false);
以上两种方式的区别:
- DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源时,通过connection.close()都是关闭物理连接。
- DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将Conncetion连接对象回收
3.Statement对象
三种类型:
- Statement简单的操作命令对象
- PrepareStatement预编译操作的命令对象
- CallableStatement存储过程的操作命令(就是写一段代码,里面有变量,判断,循环)
预编译命令相对于原来简单操作命令的好处(优势):
- 防止SQL注入,就是字符串去替换占位符的时候,会把单引号转义(替换的字符串里面的单引号会被当做字符串的一部分)
- 预编译,效率高(除了占位符的地方,其余的地方都一样,提前编译后可以提高效率)
4.ResultSet对象
- ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供了对这些行中数据的访问
- ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环
5.代码示例
package com.bit.jdbc;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.*;
public class AdvanceQueryTest
public static void main(String[] args) throws ClassNotFoundException, SQLException
Connection conn = null;
Statement s = null;
ResultSet r = null;
try
//先创建数据库连接池,再通过连接池获取数据库连接对象
DataSource ds = new MysqlDataSource();
//创建数据库连接池:初始化时,就会创建一定数量的数据库连接,这些连接对象是可以重复使用,效率更高
//整个url带参数可以只使用setURL方法,也可以将参数调用方法的方式来设置
((MysqlDataSource) ds).setURL("jdbc:mysql://localhost:3306/java43");
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("123456");
((MysqlDataSource) ds).setUseUnicode(true);
((MysqlDataSource) ds).setCharacterEncoding("UTF-8");
((MysqlDataSource) ds).setUseSSL(false);
conn = ds.getConnection();
//要解决以上安全问题,需要调整以上操作命令对象为PreparedStatement
String queryName = "skdjsj' or '1'='1";
int queryId = 6;
//准备一个带?占位符的sql
String sql = "select id,sn,name,qq_mail,classes_id from student where name=? or id=?";
PreparedStatement ps = conn.prepareStatement(sql);//创建预编译的操作命令对象
//替换占位符:调用setXXX方法,第一个参数,表示第几个占位符(从1开始),第二个参数,表示要替换的值
ps.setString(1, queryName);//替换的值是什么类型,就调用setXXX方法
ps.setInt(2, queryId);
//执行sql,需要使用无参的方法
r = ps.executeQuery();
//处理结果集:结果集可能是多行数据,需要遍历来获取
// 调用next就移动到下一行,返回true代表该行有数据,返回false代表该行没有数据
while (r.next()) //一直遍历到最后
//进入循环,代表操作遍历的一行数据
int id = r.getInt("id");
String sn = r.getString("sn");
String name = r.getString("name");
String qqMail = r.getString("qq_mail");
int classesId = r.getInt("classes_id");
System.out.printf("id=%s, sn=%s, name=%s, qqMail=%s, classesId=%s\\n",
id, sn, name, qqMail, classesId);
finally //无论如何,都要释放资源
//释放资源:
//(1)无论什么情况(异常)
//(2)释放的顺序,和创建的顺序要相反(结果集对象,操作命令对象,数据库连接对象)
if(r != null)//出现异常的时候,对象可能还没有赋值(初始化),调用close就会出现空指针异常
r.close();
if(s != null)
s.close();
if(conn != null)
conn.close();
以上是关于MySQL -----> JDBC编程的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 数据库JDBC 编程之 Java 连接 MySQL