当前位置:网站首页>JDBC (detailed explanation)
JDBC (detailed explanation)
2022-07-30 21:06:00 【grief】
1.什么是JDBC?
● JDBC(Java DataBase Connectivity)java数据库连接
● 是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它由一组用Java语言编写的类和接口组成.
● 有了JDBC,java开发人员只需要编写一次程序,就可以访问不同的数据库.
JDBC API:
供程序员调用的接口与类,集成在java.sql包中
DriverManager类作用:管理各种不同的jDBC驱动
Connection 接口与特定数据库的连接
Statement 接口执行sql
PreparedStatement接口执行sql
ResultSet接口 接收查询结果
2.JDBC的搭建
注册JDBC驱动程序
需要初始化驱动程序,A communication channel with the database can be openedClass.forName(“com.mysql.cj.jdbc.Driver”); //Reflection achieves eitherDriverManager.registerDriver(new Driver());
建立与数据库的连接
这需要使用DriverManager.getCOnnection()方法来创建一个
Connection对象,它代表一个物理连接的数据库
Connection conn =
DriverManager.getConnection(URL,USER,PASS);
URL:jdbc:mysql://ip(127.0.0.1):端口(3306)/数据库
名?serverTimezone=Asia/Shanghai
USER:用户名(root)
PASS:密码
获得Satement执行sql语句
Statement st = connection.createStatement();
Satement中的方法:
Int executeUpdate(String sql) 用于执行ddl语句和dml(增,删,改)语句 返回
操作的行数
用于执行ddl语句返回0
用于执行dml语句返回操作的行数
ResultSet executeQuery(String sql); 用于执行查询语句 返回一个
ResultSet 集合
获得PrepareStatement执行sql语句
在sql语句中参数位置使用占位符,使用set***方法向sql中设置参数
PrepareStatement ps = connection.prepareStatement(sql);
PrepareStatement中的方法:
Int executeUpdate() 用于执行ddl语句和dml(增,删,改)语句 返回操作的行数
用于执行ddl语句返回0
用于执行dml语句返回操作的行数
ResultSet executeQuery(); 用于执行查询语句 返回一个ResultSet 集合
关闭与数据库的链接通道
每次操作完成后关闭所有与数据库交互的通道
st.close();
rs.close();
conn.close();
ps.close();
3.PreparedStatement和Statement
1、代码的可读性和可维护性.
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:
stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values
('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");
perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4)
values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate(); //prestmt是 PreparedStatement 对象实例
2、最重要的一点是极大地提高了安全性. 防止sql注入
Stringsql=“
delete from user where id = ”+num;
如果我们把[or 1=1]作为id传入进来?
delete from tb_name where id = 1 or 1 = 1;
因为‘1’=‘1’肯定成立
而如果你使用预编译语句.Anything you pass in will not match the original statement
matching relationship. 预编译模式中每个占位符处,只能插入一个值,而会过滤其他语句.
4.结果集处理
● PreparedStatement和Statement中的executeQuery()方法中会返回一
个ResultSet对象,查询结果就封装在此对象中.
● 使用ResultSet中的next()方法获得下一行数据
● 使用getXXX(String name)方法获得值
public static void main(String[] args) throws SQLException, ClassNotFoundException {
// DriverManager类作用:管理各种不同的jDBC驱动
// Connection 接口 与特定数据库的连接
// Statement 接口 执行sql
// PreparedStatement接口 执行sql
// ResultSet接口 接收查询结果
String cname="admin";
int age=10;
int num=34;
DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/schoolms?serverTimezone=Asia/Shanghai","root","root");
Statement st=connection.createStatement();//执行SQL语句
st.executeUpdate("INSERT INTO students(cname,age,num)\n" +
"VALUES('刘子文',20,34)");
// st.executeUpdate("INSERT INTO students(cname,age,num)" +"VALUE('"+cname+",'"+age+",'"+num+"',noe()");
st.close();
connection.close();
}
public static void main(String[] args) throws ClassNotFoundException, SQLException {
DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/schoolms?serverTimezone=Asia/Shanghai","root","root");
PreparedStatement ps=connection.prepareStatement("insert into students(cname,age,num)values(?,?,?) ");
ps.setObject(1,"刘子文");
ps.setObject(2,22);
ps.setObject(3,34);
ps.executeLargeUpdate();
ps.close();
connection.close();
}import java.sql.*;
//Invoke the element with a specific non-value
public class Demo3 {
public static void main(String[] args) {
int num=24;
User user= null;
try {
try {
user = new Demo3().getUserById(num);//调用Demo4的方法
} catch (SQLException throwables) {
throwables.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println(user);//输出元素
}
public User getUserById(int num) throws ClassNotFoundException, SQLException {
User user= null;
PreparedStatement ps=null;
Connection connection=null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");//初始化驱动程序,Open a communication channel with the database
connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/schoolms?serverTimezone=Asia/Shanghai","root","root");//创建一个对象,它代表一个物理连接的数据库
ps=connection.prepareStatement("select*from students where num=?");//在SQL语句中参数位置使用占位符,使用set**向SQLParameters are set in the statement
ps.setObject(1,num);
ResultSet rs= ps.executeQuery();//查询语句,执行查询操作,The result is packaged into ResultSet
//从ResultSetencapsulates data into objects we define ourselves
while(rs.next()){
user=new User();
user.setNum(rs.getInt("num"));
user.setAge(rs.getInt("age"));
user.setCname(rs.getString("cname"));
}
} finally{
//Close the channel connected to the database after each operation
ps.close();
connection.close();
}
return user;
}
}
import java.sql.*;
import java.util.ArrayList;
//All elements in the query table,Print the elements in the table one by one
public class Demo4 {
public static void main(String[] args) {
try {
try {
ArrayList<User> users = new Demo4().getUsers();
System.out.println(users);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public ArrayList<User>getUsers() throws ClassNotFoundException, SQLException {
ArrayList<User> users=new ArrayList<>();
PreparedStatement ps=null;
Connection connection=null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/schoolms?serverTimezone=Asia/Shanghai","root","root");
ps=connection.prepareStatement("select*from students");
ResultSet rs= ps.executeQuery();//查询语句,执行查询操作,The result is packaged into ResultSet
//从ResultSetencapsulates data into objects we define ourselves
while(rs.next()){
User user=new User();
user.setNum(rs.getInt("num"));
user.setAge(rs.getInt("age"));
user.setCname(rs.getString("cname"));
users.add(user);
}
} finally{
ps.close();
connection.close();
}
return users;
}
}import java.util.ArrayList;
public class User extends ArrayList<User> {
private int num;
private int age;
private String cname;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
@Override
public String toString() {
return "User{" +
"num=" + num +
", age=" + age +
", cname='" + cname + '\'' +
'}';
}
}边栏推荐
- C language: detailed explanation of operators
- awk notes
- Mysql索引特性(重要)
- chrome extension: how to make the dialog be on the right side of the current window?
- 2021年PHP-Laravel面试题问卷题 答案记录
- 弹性盒子模型
- mysqldump导出提示:mysqldump [Warning] Using a password on the command line interface can be insecure
- 使用map函数,对list中的每个元素进行操作 好像不用map
- 【机器学习】梯度下降背后的数学之美
- uni-app开发微信小程序踩坑
猜你喜欢
随机推荐
HJ85 longest palindrome substring
chrome extension: how to make the dialog be on the right side of the current window?
弹性盒子模型
Why do so many people who teach themselves software testing give up later...
How to make a deb package
Cookie中的JSESSIONID说明
MySQL 删除表数据,重置自增 id 为 0 的两个方式
Quick Master QML Chapter 6 Animation
KingbaseESV8R6 snapshot too old的配置和测试
Image Restoration by Estimating Frequency Distribution of Local Patches
Activiti 工作流引擎 详解
Structured Streaming报错记录:Overloaded method foreachBatch with alternatives
WeChat reading, export notes
啊?现在初级测试招聘都要求会自动化了?
kubernetes
C语言中指针没那么难~(2)【文章结尾有资料】
flyway的快速入门教程
Mysql8创建用户以及赋权操作
巴比特 | 元宇宙每日必读:洗牌将至,数藏行业下半场是否会迎来新一批领头羊?是否会出现新玩法?...
用于命名实体识别的模块化交互网络









