为什么要学习JDBC,JDBC中文翻译Java数据库连接,市面上有很多数据库;如果不指定某种规则,那么,肯定存在问题,(例如:如果人类交流的语言不加以控制,那么肯定会出现交流困难的问题,就像普通话是国内的交流规范,而国际上则是英语),这个问题到连接数据库上就是,Java程序员要根据不同的数据库实现的类连接不同的数据库;这种情况下,JDBC出世了,在JDBC了定义了许多的接口,而具体的实现由各大数据库厂家实现相应的接口。而Java程序员则无需关心数据库如何实现,只需学会使用JDBC中的方法即可
1. 概述
JDBC(Java DataBase Connection java数据库连接)
是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它是用一组用Java语言编写的类和接口实现
有了JDBC,Java开发人员只需要编写一次程序,就可以访问不同的数据库
Java定义者制定了JDBC规范,数据库开发商实现接口,程序员学习使用标准规范
2. JDBC搭建
- 在IDEA中创建一个项目,再右击项目
New Directory
创建一个名为lib的目录,将我们的Mysql实现的的jar包放进目录中。 - 加载驱动new Driver();
- 建立于数据库的链接DriverManager.getConnection(URL,用户名,密码)
注意:我这里是Mysql8 URL:jdbc:mysql://localhost:3306/数据库名?serverTimezone=Asia/Shanghai,用户名:root,密码要看自己的设置了 - 向数据库发送sql
- 处理查询结果集,不处理的话此步省略
- 关闭与数据库的连接
以下代码不是最终成品:原因如下:
1.如果遇到大量数据的插入,就会频繁的进行字符串的拼接,极易出现错误而且极其痛苦2.可能会出现SQL注入
,不具备安全性
package com.ffyc.jdbcpro;
import com.mysql.cj.jdbc.Driver;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/*
1. jdbc搭建第一步,导入jar包,一般倒在项目的直接子目录下,取名lib,右击
jar包右击选择add as library
*/
public class demo1 {
public static void main(String[] args) throws SQLException {
// 2. 加载驱动
new Driver();
// 3. 建立与数据库的连接
String url = "jdbc:mysql://localhost:3306/schooldb?serverTimezone=Asia/Shanghai";
Connection connection = DriverManager.getConnection(url,"root","123456");
// 4. 向数据库发送sql
Statement statement = connection.createStatement();
String id = "4";
String name = "物理";
int result = statement.executeUpdate("insert into course(id,name)value('"+id+"','"+name+"')");
// 5. 关闭与数据库的连接
statement.close();
connection.close();
}
}
3. PrepareStatement
上面JDBC搭建中的注意在PrepareStatement便可以避免了,因为在PrepareStatement可以把要执行的SQL先用占位符占用下来,后面使用setObject()再为每个位置进行赋值即可,即不易混乱,又解决了SQL注入的问题,一箭双雕。
Statement和PrepareStatement的区别
区别1:Statement是将变量拼接到sql中,书写不易,而PrepareStatement则用占位符的避免了繁杂的字符串拼接
区别2:SQL注入导致Statement导致某些sql语句的执行违背了代码书写者的意愿,而PrepareStatement中的setObject()方法则会对sql值进行判断,如果出现异常的数据,便会报错
以下是成品的链接数据库代码,没有处理查询结果集的步骤:
package com.ffyc.jdbcpro;
import com.mysql.cj.jdbc.Driver;
import java.sql.*;
/*
1. jdbc搭建第一步,导入jar包,一般倒在项目的直接子目录下,取名lib,右击
jar包右击选择add as library
*/
public class demo1 {
public static void main(String[] args) throws SQLException {
// 2. 加载驱动
new Driver();
/*
加载Driver类
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
*/
// 3. 建立与数据库的连接
String url = "jdbc:mysql://localhost:3306/schooldb?serverTimezone=Asia/Shanghai";
Connection connection = DriverManager.getConnection(url,"root","123456");
// 4. 向数据库发送sql
PreparedStatement ps = connection.prepareStatement("insert into course(id,name)value(?,?)");
String id = "4";
String name = "物理";
//下面只是将sql预编译到了PreparedStatement对象中,并没有执行
ps.setObject(1,id);
ps.setObject(2,name);
ps.executeUpdate();//执行sql语句
// 5. 关闭与数据库的连接
ps.close();
connection.close();
}
}
4. 结果集处理
PreparedStatement和Statement中的executeQuery()方法中会返回一个ResultSet对象,查询结果就封装在此对象中.
使用ResultSet中的next()方法获得下一行数据
使用getXXX(String name)方法获得
例如:
package com.ffyc.jdbcpro;
import com.mysql.cj.jdbc.Driver;
import java.sql.*;
/*
1. jdbc搭建第一步,导入jar包,一般倒在项目的直接子目录下,取名lib,右击
jar包右击选择add as library
*/
public class demo1 {
public static void main(String[] args) throws SQLException {
// 2. 加载驱动
new Driver();
/*
加载Driver类
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
*/
// 3. 建立与数据库的连接
String url = "jdbc:mysql://localhost:3306/schooldb?serverTimezone=Asia/Shanghai";
Connection connection = DriverManager.getConnection(url,"root","123456");
// 4. 向数据库发送sql
PreparedStatement ps = connection.prepareStatement("select num,name from student where gender = ?");
String gender = "男";
//下面只是将sql预编译到了PreparedStatement对象中,并没有执行
ps.setObject(1,gender);
ResultSet rs = ps.executeQuery();//执行查询操作,将查询结果集封装到了ResultSet中
//rs.next()判断是否还有数据
while (rs.next()){
//通过名字获取数据,通过序号的话,可能动代码之后便后出现类型问题
System.out.println(rs.getInt("num"));
System.out.println(rs.getString("name"));
}
// 5. 关闭与数据库的连接
ps.close();
connection.close();
}
}
惭愧呀,因为学习JavaEE接受前端的请求之后,要处理用户的请求,连接数据库并对请求进行验证,突然发现链接数据库忘得一干二净,所以过来整理一下JDBC的笔记