什么是JDBC
JDBC(Java DataBase Connectivity),即Java数据库连接。简而言之,就是通过Java语言来操作数据库。
我们可以把JDBC理解成是官方定义的一套操作所有关系型数据库的规则,规则即接口。
也就是说,官方定义了一套操作所有关系型数据库的接口,然后让各个数据厂商(Mysql、Oracle等)用实现类去实现这套接口,再把这些实现类打包(数据驱动jar包),并提供数据驱动jar包给我们使用。
我们可以使用这套JDBC接口进行编程,但是真正执行的代码是驱动jar包中的实现类。
为什么?因为JDBC是通过接口来调用方法的,当你导入了驱动jar包(实现类)后,那调用的方法肯定是实现类里面的方法。
在IDEA中连接MySQL数据库
- 先在官网下载相应jar包文件(全平台版)mysql-connector-j-8.0.33.zip
- 解压zip文件,将其中的jar包复制或剪切 mysql-connector-j-8.0.33.jar
- 在项目中建立lib文件夹,导入jar包 ,添加为库后才算导入成功
JDBC编程步骤
MySQL基本语法_McConnel Favel的博客-CSDN博客 表格stu在这篇博客里已创建,现在继续沿用
import java.sql.*;
public class Try {
public static void main(String[] args){
Connection con = null;
Statement stat = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
//第一步:注册驱动
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
//第二步:获取连接,第一个为你的MySQL数据库中的表格位置,第二个为账号名,第三个为密码
// String sql = "insert into stu values ('1010','shi',18,'robot','class2');"; //插入操作
// String sql = "update stu set age = 2 where sex = 'robot';"; //更新操作
String sql = "select sid,sname,age,sex,classname from stu;"; //查看
//第三步:编写sql语句,语法与sql语句一摸一样,不要忘了分号
stat = con.createStatement();
//第四步:获取数据库操作对象(statement专门执行sql语句)
rs = stat.executeQuery(sql);
//第五步:执行上面编写的sql语句
while (rs.next()){
//re.next()可以使查询光标指向下一行,最初的位置为第一行上面,第一次执行后光标下移到第一行,并返回true,到最后一行无法再下移返回false
// String sid = rs.getString(1);
// String sid = rs.getString("sid");
//上述两行作用一样,第一行表示获取当前行第一列的信息(表格从1开始编号),第二行表示获取当前行”sid“列的信息
for (int i=1;i<6;i++){
String op = rs.getString(i);
System.out.print(op+'\t');
}
System.out.println();
// System.out.println(sid);
}
// int count = stat.executeUpdate(sql);
// System.out.println(count);
//第六步:查询结果(非必须)
}
catch (SQLException | ClassNotFoundException e){
System.out.println("Error "+e);
}
finally {
if (rs != null){
try{
rs.close();
}
catch (SQLException e){
System.out.println("Error "+e);
}
}
if (stat != null){
try{
stat.close();
}
catch (SQLException e){
System.out.println("Error "+e);
}
}
if (con != null){
try{
con.close();
}
catch (SQLException e){
System.out.println("Error"+e);
}
}
//第七步:释放资源,顺序从小到大
}
}
}
/*
输出:
1003 Rykony 19 male class4
1004 si 20 female class1
1005 wu 19 male class3
1006 liu 18 male class4
1007 qi 19 female class3
1008 ba 17 female class1
1009 jiu 20 male class2
1001 yi 18 female class2
1002 er 18 female class4
1010 shi 2 robot class2
*/
简单用户登录程序
用户信息表
代码
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class LoginTest {
public static void main(String[] args) {
Map<String,String> LoginIn = INIT();
boolean CanIn = login(LoginIn);
System.out.println(CanIn?"Success!":"Try again?");
}
private static boolean login(Map<String,String> LoginIn) {
boolean CanIn = false;
Connection con = null;
PreparedStatement pre = null;
ResultSet re = null;
try{
Class.forName("com.mysql.cj.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");
String sql = "select * from login where Name=? and Password=?;";
//一个?表示一个占位符,之后接收的数据会放置在?的位置上
pre = con.prepareStatement(sql);
pre.setString(1,LoginIn.get("Name"));
pre.setString(2,LoginIn.get("Password"));
//接收输入数据,第一个数字为将内容填在第几个?处,后面为填入的信息
re = pre.executeQuery();
// if (re.next()) CanIn = true;
CanIn = re.next();
//在数据库中查找是否存在可满足的输入,有就返回true
}
catch(ClassNotFoundException | SQLException e){
System.out.println("Error "+e);
}
finally {
if (re != null){
try{
re.close();
}
catch (SQLException e){
System.out.println("Error "+e);
}
}
if (pre != null){
try{
pre.close();
}
catch (SQLException e){
System.out.println("Error "+e);
}
}
if (con != null){
try{
con.close();
}
catch (SQLException e){
System.out.println("Error "+e);
}
}
}
return CanIn;
}
private static Map<String,String> INIT(){
Scanner scanner = new Scanner(System.in);
System.out.print("UserName : ");
String Name = scanner.nextLine();
System.out.print("PassWord : ");
String ps = scanner.nextLine();
//输入信息
Map<String,String> LoginIn = new HashMap<>();
LoginIn.put("Name",Name);
LoginIn.put("Password",ps);
return LoginIn;
}
}
结果
可以发现代码中的Statement换成了prepareStatement,这个接口可以减少SQL编译次数,提高效率,同时提高安全性,避免SQL注入现象
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾后,添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
Druid优化JDBC
通过上面的代码不难看出来,我们每进行一次语句操作都要注册一次驱动,建立一次连接,这既浪费了时间又浪费了资源。所以我们需要通过连接池预先同数据库建立一些连接,并放在内存中,当应用程序需要建立数据库连接时,可以直接到连接池中申请一个,用完后再放回去,这样极大的提高了数据库连接的性能问题,节省了资源和时间。
Apache Druid是一个实时分析型数据库,旨在对大型数据集进行快速的查询分析("OLAP"查询)。Druid最常被当做数据库来用以支持实时摄取、高性能查询和高稳定运行的应用场景,同时,Druid也通常被用来助力分析型应用的图形化界面,或者当做需要快速聚合的高并发后端API,Druid最适合应用于面向事件类型的数据。
druid-1.2.9.jar druid包1.2.9版本下载
下载完别忘了导入包
Druid优化后的JDBC代码
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class Try {
public static void main(String[] args){
Connection con = null;
Statement stat = null;
ResultSet rs = null;
Properties pro = new Properties();
InputStream is = Try.class.getClassLoader().getResourceAsStream("Druid.properties");
try {
pro.load(is);
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
con = ds.getConnection();
//前两步
String sql = "select sid,sname,age,sex,classname from stu;"; //查看
//第三步:编写sql语句,语法与sql语句一摸一样,不要忘了分号
stat = con.createStatement();
//第四步:获取数据库操作对象(statement专门执行sql语句)
rs = stat.executeQuery(sql);
//第五步:执行上面编写的sql语句
while (rs.next()){
for (int i=1;i<6;i++){
String op = rs.getString(i);
System.out.print(op+'\t');
}
System.out.println();
}
}
catch (Exception e){
System.out.println("Error "+e);
}
finally {
if (rs != null){
try{
rs.close();
}
catch (SQLException e){
System.out.println("Error "+e);
}
}
if (stat != null){
try{
stat.close();
}
catch (SQLException e){
System.out.println("Error "+e);
}
}
if (con != null){
try{
con.close();
}
catch (SQLException e){
System.out.println("Error"+e);
}
}
//第七步:释放资源,顺序从小到大
}
}
}
/*
输出:
5月 03, 2023 3:13:41 下午 com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited
1003 Rykony 19 male class4
1004 si 20 female class1
1005 wu 19 male class3
1006 liu 18 male class4
1007 qi 19 female class3
1008 ba 17 female class1
1009 jiu 20 male class2
1001 yi 18 female class2
1002 er 18 female class4
1010 shi 2 robot class2
*/
Druid.properties文件内容
driverClassName = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/test
username = root
password = root
initialSize = 10
#初始化连接数量
maxActive = 10
#最大连接数
maxWait = 5000
#最大等待时间(毫秒)
引用文章
Java中JDBC的超详细总结_竹蜻蜓飞行的博客-CSDN博客
JDBC连接Mysql数据库详解 - 知乎 (zhihu.com)
感谢观看