1.JDBC(Java DateBase Connectivity) java数据库连接。
是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,
它由一组用Java语言编写的类和接口组成。
有了JDBC,java开发人员就只需要写一次程序,就可以访问不同的数据库,但是不同的数据库具体的连接细节是不同的,并且这些细节不是通过java来实现的,是由数据库的开发商来实现,java设计出一系列连接数据库的接口规范。
eg:mysql-connector-java-8.0.16.jar 就是由mysql官方开发实现的,具体连接数据库的功能代码。
将需要导进项目中的 .jar 包放在 lib 文件夹下。导进来之后就可以在项目中去使用包中的类等。
注册JDBC驱动程序:这需要初始化驱动程序,这样就可以打开与数据库的通信信道。
Class.forName("com.mysql.cj.jdbc.Driver");
//或者:
DriverManager.registerDriver(new Driver());
使用 java.sql包下的DriverManager中的getConnection()方法去获得数据对象
getConnection()中有三个参数:
String url的标准格式:jdbc:mysql://ip(127.0.0.1):端口(3306)/数据库名?serverTimezone=Asia/Shanghai (注意:这是标准格式,其中只需要对数据库名更改即可,一般都是连接自己主机,需要连接其他主机需更换端口号)
String user:用户名
String password:密码
此方法会返回一个Connection对象:
Connection connection = DriverManager.getConnection(url, user, password);
执行sql语句需要调用Connection中的createStatement()方法获得Statement对象。
Statement st = connection.createStatement();
再通过Statement中的executeU0pdate("sql:")中书写sql语句。
eg:现在要为专业表添加一个数学专业。
st.executeUpdate("insert into major(name) values ('数学')");
st.close();
connection.close();
搭建的完整代码如下:
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 {
//2.加载驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
//或者:
//DriverManager.registerDriver(new Driver());
//3.建立与数据库的连接,获得数据对象
String url="jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai";
String user="root";//账号
String password="";//密码
Connection connection = DriverManager.getConnection(url, user, password);
//4.发送sql
Statement st = connection.createStatement();
st.executeUpdate("insert into major(name) values ('数学')");
//5.关闭数据库的链接
st.close();
connection.close();
}
}
连接步骤只是针对于sql语句为(增删改)的情况,需要select还请注意结果集处理。
使用Statement的sql语句中,想要将参数放到sql语句中去就必须通过字符出纳的拼接完成。
public void save(int id,String name,String gender,String birthday,String number,String address,int majorid) throws ClassNotFoundException, SQLException {
//加载驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接对象
Connection connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai","root"," ");
Statement st = connection.createStatement();
//发送sql
st.executeUpdate("insert into student(id,name,gender,birthday,number,address,rag_time,majorid) values ("+id+",'"+name+"','"+gender+"','"+birthday+"','"+number+"','"+address+"',now(),"+majorid+")");
connection.close();
st.close();
}
拼接变量:
对于String类型的变量来说:' " +变量名+ " '
对于数据变量(整型,浮点型变量)来说:" +变量名+ "
使用prepareStatement的sql语句中,先用占位符(?)占位,然后再通过setObject方法赋值进去,不需要拼接字符串。
public void save(String name,String gender,String birthday,String number,String address,int majorid) throws ClassNotFoundException, SQLException {
//加载驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai","root","");
PreparedStatement ps = connection.prepareStatement("insert into student(name,gender,birthday,number,address,rag_time,majorid) values (?,?,?,?,?,now(),?)");
ps.setObject(1,name);
ps.setObject(2,gender);
ps.setObject(3,birthday);
ps.setObject(4,number);
ps.setObject(5,address);
ps.setObject(6,majorid);
//真正执行sql
ps.executeUpdate();
//关闭连接
ps.close();
connection.close();
}
注意:setObject()中的参数1指的是sql语句中占位符的排序位置,不是 sql语句的排序位置,参数2就是需要的变量。
PreparedStatement和Statement 区别
相同点: 都是向数据库发送sql
不同点:
Statement: 将参数直接拼接到sql中, 要拼接字符串,写起来麻烦, 安全性差, 可以在参数中拼接 or 1=1。
PreparedStatement : 先用?占位, 然后通过setObject方法赋值, 写起来不用拼接字符串, 安全可靠的在赋值时进行检测,可以防止sql注入攻击。
增删改使用的是executeUpdate()
查询用的是executeQuery()
ps.executeUpdate();//增删改
ResultSet rs = ps.executeQuery(); //查询
PreparedStatement和Statement中的executeQuery()方法中会返回一个ResultSet对象,查询结果就封装在此对象中,使用ResultSet中的next()方法获得下一行数据,使用getXXX(String name)方法获得值。
查询结果返回的是一个包装的对象,对象中的信息就是查询的信息。(返回值可以是一个对象,也可以是一个对象数组或者对象集合等)
eg:现在的sql语句为下:
查询信息只有一组:
PreparedStatement ps = connection.prepareStatement("select id,name,gender,birthday,number,address,rag_time from student where id=?");
ps.setObject(1,id);
需要将信息封装到类中 ,我们自然是要去创建一个类,同时定义一些变量来存储查询的信息(注意:必须要使用标准的JavaBeen去定义类中的属性)如下例子:
import java.util.Date;
public class Student {
private int id;
private String name;
private String gender;
private Date birthday;
private String number;
private String address;
private Date ragTime;
public Date getRagTime() {
return ragTime;
}
public void setRagTime(Date ragTime) {
this.ragTime = ragTime;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
", birthday=" + birthday +
", number='" + number + '\'' +
", address='" + address + '\'' +
", ragTime=" + ragTime +
'}';
}
}
需要查询信息并且将信息封装到类的对象中:
ResultSet rs = ps.executeQuery();
Student student=null;
while(rs.next()){
student=new Student();
student.setId(rs.getInt("id"));
student.setName(rs.getString("name"));
student.setGender(rs.getString("gender"));
student.setBirthday(rs.getDate("birthday"));
student.setNumber(rs.getString("number"));
student.setAddress(rs.getString("address"));
student.setRagTime(rs.getTimestamp("rag_time"));
}
若查询信息有多组时,就需要用到对象集合(也是相同道理):
PreparedStatement ps = connection.prepareStatement("select id,name,gender,birthday,number,address,rag_time from student where gender=?");
ps.setObject(1,gender);
ResultSet rs = ps.executeQuery();
ArrayList students=new ArrayList<>();
while(rs.next()){
Student student=new Student();
student.setId(rs.getInt("id"));
student.setName(rs.getString("name"));
student.setGender(rs.getString("gender"));
student.setBirthday(rs.getDate("birthday"));
student.setNumber(rs.getString("number"));
student.setAddress(rs.getString("address"));
student.setRagTime(rs.getTimestamp("rag_time"));
students.add(student);
}