一、JDBC概述
JDBC(Java DataBase Connectivity)java数据库连接
是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问, 它由一组用Java语言编写的类和接口组成。
有了JDBC,java开发人员只需要编写一次程序,就可以访问不同的数据库
JDBC API:
供程序员调用的接口与类,集成在java.sql包中
DriverManager类作用:管理各种不同的jDBC驱动
Connection 接口 与特定数据库的连接
Statement 接口 执行sql
PreparedStatement接口 执行sql
ResultSet接口 接收查询结
二、JDBC搭建
●建立与数据库连接:
这需要使用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语句中参数位置使用占位符,使用setXX方法向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();
package com.wcb.JDBC;
import com.mysql.jdbc.Driver;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class demo1 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//加载驱动类
Class.forName("com.mysql.cj.jdbc.Driver");//用于加载mysql驱动类
//DriverManager.registerDriver(new Driver());
//建立数据可连接,获得连接对象
String url ="jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";//定义连接sql所需的url
String user ="root";//用户名
String password ="";//密码
//建立了与数据库的连接,获得了一个连接对象。
Connection connection =DriverManager.getConnection(url,user,password);
//发送sql
Statement st = connection.createStatement();//创建一个Statement对象,用于向数据库发送SQL语句。
st.executeUpdate("insert into major(name)value('统计')");//代码执行SQL语句
//关闭数据库连接
st.close();
connection.close();
}
}
三、增删改查
在执行SQL语句时推荐采用预编译的模式
因为在删除时,使用字符串连接可以在语句后添加类似于or1==1的逻辑语句进行攻击数据库,导致数据全部删除
而预编译模式则不会,因为占位符?只允许传入一个参数
增删改
package com.wcb.JDBC.增删改;
import java.sql.*;
public class demo3 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
demo3 demo2 =new demo3();
//demo2.save("www","男","2004-3-3", "17914567896", 2);
demo2.update("www3","男","2004-3-3", "17914567896", 2,23);
demo2.delete("6");
}
public void save(String name,String gender,String birthday,String phone,int majorid) throws ClassNotFoundException, SQLException {
//加载驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
String url ="jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";//定义连接sql所需的url
String users = "root";
String password = "";
Connection connection = DriverManager.getConnection(url,users,password);//建立连接
Statement statement =connection.createStatement();//建立对象用于发送sql语句
//执行sql语句
//connection对象中的预编译方法 ?是占位符,表示此处需要一个参数
PreparedStatement ps = connection.prepareStatement("insert into student(name,gender,birthday,phone,reg_time,majorid)value(?,?,?,?,now(),?)");
//传值
ps.setObject(1,name);
ps.setObject(2,gender);
ps.setObject(3,birthday);
ps.setObject(4,phone);
ps.setObject(6,majorid);
//执行
ps.executeUpdate();
//关闭
statement.close();
connection.close();
}
public void update(String name,String gender,String birthday,String phone,int majorid,int index) throws ClassNotFoundException, SQLException{
//加载驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
String url ="jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";//定义连接sql所需的url
String users = "root";
String password = "";
Connection connection = DriverManager.getConnection(url,users,password);//建立连接
Statement statement =connection.createStatement();//建立对象用于发送sql语句
//执行sql语句
PreparedStatement preparedStatement=connection.prepareStatement("update student set name = ?,gender = ?, birthday=?,phone = ?,reg_time=now(),majorid = ? where number =? ");
//传值
preparedStatement.setObject(1, name);
preparedStatement.setObject(2, gender);
preparedStatement.setObject(3,birthday);
preparedStatement.setObject(4, phone);
preparedStatement.setObject(5,majorid);
preparedStatement.setObject(6, index);
//执行
preparedStatement.executeUpdate();
statement.close();
connection.close();
}
public void delete(String num) throws ClassNotFoundException, SQLException{
//加载驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
String url ="jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";//定义连接sql所需的url
String users = "root";
String password = "";
Connection connection = DriverManager.getConnection(url,users,password);//建立连接
Statement statement =connection.createStatement();//建立对象用于发送sql语句
//执行sql语句
PreparedStatement preparedStatement=connection.prepareStatement("delete from student where number =?");
//传值
preparedStatement.setObject(1, num);
//执行
preparedStatement.executeUpdate();
statement.close();
connection.close();
}
}
查
package com.wcb.JDBC.查;
import java.sql.*;
import java.util.ArrayList;
public class Demo4 {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
Demo4 demo4 =new Demo4();
//Student student = demo4.findStudentByNum(10);
//System.out.println(student);
ArrayList<Student> students = demo4.findStudentByGender("女");
for(Student student:students){
System.out.println(student);
}
}
public ArrayList<Student> findStudentByGender(String gender) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
String url ="jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";//定义连接sql所需的url
String user ="root";//用户名
String password ="";//密码
//建立连接
Connection connection = DriverManager.getConnection(url,user,password);
//预编译
PreparedStatement preparedStatement =connection.prepareStatement("select number,name,gender,birthday,phone,reg_time from student where gender = ?");
//传入数据
preparedStatement.setObject(1, gender);
//查询操作
ResultSet resultSet = preparedStatement.executeQuery();//将查询结构封装到ResultSet类型的对象中 需要将数据封装到指定类型的对象中
//ResultSet对象.next() 如果结果集中存在下一个 .next返回true 否则返回false
ArrayList<Student> students =new ArrayList<>();
while(resultSet.next()){
Student student =new Student();
//获取数据
student.setNum(resultSet.getInt("number"));
student.setName(resultSet.getString("name"));
student.setGender(resultSet.getString("gender"));
student.setBirthday(resultSet.getDate("birthday"));
student.setPhone(resultSet.getString("phone"));
student.setRegTime(resultSet.getTimestamp("reg_time"));
students.add(student);
}
//关闭
preparedStatement.close();
connection.close();
resultSet.close();
return students;
}
public Student findStudentByNum(int num) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
String url ="jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";//定义连接sql所需的url
String user ="root";//用户名
String password ="";//密码
//建立连接
Connection connection = DriverManager.getConnection(url,user,password);
//预编译
PreparedStatement preparedStatement =connection.prepareStatement("select number,name,gender,birthday,phone,reg_time from student where number = ?");
//传入数据
preparedStatement.setObject(1, num);
//查询操作
ResultSet resultSet = preparedStatement.executeQuery();//将查询结构封装到ResultSet类型的对象中 需要将数据封装到指定类型的对象中
//ResultSet对象.next() 如果结果集中存在下一个 .next返回true 否则返回false
Student student =null;
while(resultSet.next()){
student =new Student();
//获取数据
student.setNum(resultSet.getInt("number"));
student.setName(resultSet.getString("name"));
student.setGender(resultSet.getString("gender"));
student.setBirthday(resultSet.getDate("birthday"));
student.setPhone(resultSet.getString("phone"));
student.setRegTime(resultSet.getTimestamp("reg_time"));
}
//关闭
preparedStatement.close();
connection.close();
resultSet.close();
return student;
}
}