目录
概述
JDBC(Java DataBase Connectivity)java数据库连接
应用程序与数据库之间的桥梁
- 是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
- 有了JDBC,java开发人员只需要编写一次程序,就可以访问不同的数据库
java语言开发者只是定义了许多关于java应用程序操作数据的接口(定义功能,没有实现)
java程序连接到 数据库
发送sql:增改删 —>发送数据到数据库 insert()
查询 —>返回结果 get()
java语言开发者为什么不实现?
由于数据库类型众多,自己实现不了解,就让数据库开发商自己实现
所以数据库开发商提供了jar包:里边有各种接口的实现类
JDBC API:
供程序员调用的接口与类,集成在java.sql包中
DriverManager类作用:管理各种不同的jDBC驱动
Connection 接口 与特定数据库的连接
Statement 接口 执行sql
PreparedStatement接口 执行sql
ResultSet接口 接收查询结果
JDBC搭建
1.导入对应的数据库驱动包(jar)
在工程目录下new Directory 新建 lib 目录,将需要的jar包复制到该目录下
我的jar包在F:\java program\JavaPackage
mysql-connector-java-8.0.16.jar
- File —> Project Structure —> Libraries —> “+” —> java —> 在项目下找到lib选中jar包
2.加载mysql驱动
Class.forName("com.mysql.cj.jdbc.Driver"); //使用java反射机制实现的创建对象
//或 DriverManager.registerDriver(new Driver());
Class.forName是把这个类加载到JVM中,加载的时候,就会执行其中的静态初始化块,完成驱动的初始化的相关工作。
3.连接到数据库
//连接到数据库-ip,端口号3306,数据库名,字符集,时区
String url ="jdbc:mysql://127.0.0.1:3306/school_massage?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
String root = "root";
String password = "100005";
//创建传输sql的管道
Connection conn = DriverManager.getConnection(url,root,password);
/*返回conn:com.mysql.cj.jdbc.ConnectionImpl@1e67b872
(返回的是mysql中的一个实现了connection接口的类的对象)*/
4.发送sql到数据库
//创建用来封装发送sql的Statement
Statement st = conn.createStatement();
//输入要操作的语句
st.executeUpdate("insert into course(c_name)value('php')");
5.关闭数据库连接通道
st.close();
conn.close(); //关闭通道
增,删,改数据
Statement
/**
* 添加学生信息到school_massage数据库
*
* @author 樊景泽
*/
public class JDBCDemo2 {
public static void main(String[] args) {
JDBCDemo2 jd2 = new JDBCDemo2();
try {
jd2.saveStudent("tom", "男", "2000-1-1");
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("类找不到");
} catch (SQLException throwables) {
throwables.printStackTrace();
System.out.println("数据链接失败");
}
}
public void saveStudent(String name, String sex, String birthday) throws ClassNotFoundException, SQLException {
//建立Statement和传输的管道Connection
Connection conn = null;
Statement st = null;
try {
//加载mysql驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//连接到数据库
String url = "jdbc:mysql://127.0.0.1:3306/school_massage?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
conn = DriverManager.getConnection(url, "root", "152475");
//发送sql到数据库
st = conn.createStatement();//用row记录操作的行数
int row = st.executeUpdate("INSERT INTO t_student(NAME,sex,birthday,registrationtime)" +
" VALUES('" + name + "','" + sex + "','" + birthday + "',now())");
System.out.println(row);
} finally {
//关闭管道
if (st != null) {
st.close();
}
if (conn != null) {
conn.close();
}
}
}
}
PreparedStatement
public void saveStudent(String name,String sex,String birthday) throws ClassNotFoundException, SQLException {
Connection connection = null;
PreparedStatement ps = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/school_massage?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
conn = DriverManager.getConnection(url,"root","root");
// 预先将sql语句封装到PreparedStatement对象中 ?表示一个占位符,需要传入一个值
ps = connection.prepareStatement("insert into student(name,sex,birthday,reg_time)values(?,?,?,?)");
//向预编译好的sql中传入数据
ps.setString(1,name);
ps.setString(2,sex);
ps.setObject(3, birthday);
ps.setObject(4, new Date());
//或ps.setDate(4,new java.sql.Date(new java.util.Date().getTime()));
ps.executeUpdate();//执行sql
}finally {
if(ps!=null){
ps.close();
}
if(connection!=null){
connection.close();
}
}
-
简化写法 , 不用拼接字符串
-
极大的提高了安全性 , 防止sql注入攻击
例如 : DELETE FROM grade WHERE g_num = 1 OR 1=1; 用拼接字符串就会把OR 1=1直接传进sql语句中 ,表就会被全部删除
而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.
预编译模式中每个占位符处,只能插入一个值,而会过滤其他语句.
查询数据
- PreparedStatement和Statement中的executeQuery()方法中会返回一个ResultSet对象,查询结果就封装在此对象中.
- 使用ResultSet中的next()方法获得下一行数据
- 使用getXXX(String name)方法获得值
//学生对象
public class Student {
private int id;
private String name;
private String sex;
private float weight;
private Date regTime;
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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public float getWeight() {
return weight;
}
public void setWeight(float weight) {
this.weight = weight;
}
public Date getRegTime() {
return regTime;
}
public void setRegTime(Date regTime) {
this.regTime = regTime;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", weight=" + weight +
", regTime=" + regTime +
'}';
}
}
/**
* @author Deevan
* 查询学号为1的学生信息
*/
public class Demo2 {
public static void main(String[] args) {
// 数据库持久化的存储数据, 当在程序中使用时,需要把数据查询出来,封装在对象中
Demo2 demo2 = new Demo2();
try {
Student student = demo2.findStdent(1);
System.out.println(student);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
private Student findStdent(int num) throws ClassNotFoundException, SQLException {
Connection conn = null;
PreparedStatement ps = null;
Student student = new Student();
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/school_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
conn = DriverManager.getConnection(url, "root", "152475");
ps = conn.prepareStatement("SELECT\n" +
" id,\n" +
" NAME,\n" +
" sex,\n" +
" weight,\n" +
" reg_time\n" +
"FROM\n" +
" student\n" +
"WHERE id = ?");
ps.setInt(1, num);
ResultSet res = ps.executeQuery(); //执行查询操作
//从ResultSet中取出我们需要的数据 next()-有内容返回true,否则返回false
while (res.next()) {
student.setId(res.getInt("id"));
student.setName(res.getString("name"));
student.setSex(res.getString("sex"));
student.setWeight(res.getFloat("weight"));
student.setRegTime(res.getDate("reg_time"));
}
} finally {
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
}
return student;
}
}
------------------------------------------
Student{id=1, name='王艺', sex='女', weight=40.0, regTime=2021-08-13}
查询出多个结果
把对象封装到集合中
public class Demo3 {
public static void main(String[] args) {
Demo3 demo3 = new Demo3();
try {
ArrayList<Student> list = demo3.findStudentList("男");
System.out.println(list);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
private ArrayList<Student> findStudentList(String sex) throws ClassNotFoundException, SQLException {
Connection conn = null;
PreparedStatement ps = null;
ArrayList<Student> list = new ArrayList<>();
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/school_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
conn = DriverManager.getConnection(url, "root", "152475");
ps = conn.prepareStatement("SELECT\n" +
" id,\n" +
" NAME,\n" +
" sex,\n" +
" weight,\n" +
" reg_time\n" +
"FROM\n" +
" student\n" +
"WHERE sex = ?");
ps.setString(1, sex);
ResultSet res = ps.executeQuery();
while (res.next()) {
Student student = new Student();
student.setId(res.getInt("id"));
student.setName(res.getString("name"));
student.setSex(res.getString("sex"));
student.setWeight(res.getFloat("weight"));
student.setRegTime(res.getDate("reg_time"));
list.add(student);
}
} finally {
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
}
return list;
}
}