前言:
当将Java与MySQL数据库连接时,JDBC(Java Database Connectivity)是一种重要的技术。JDBC允许Java应用程序通过标准的数据库访问方式与不同的关系型数据库进行通信,其中包括MySQL。通过使用JDBC,Java开发人员可以轻松地执行数据库操作,如查询数据、更新数据和执行存储过程等。
在本文中,我们将探讨如何使用JDBC来连接MySQL数据库。首先,我们将介绍JDBC的基本概念,包括驱动程序、连接URL和基本的数据库操作。然后,我们将详细说明如何在Java应用程序中配置和使用JDBC驱动程序来连接MySQL数据库。我们将覆盖建立连接、执行查询、插入和更新数据以及关闭连接等方面的重要步骤。
无论您是初学者还是有经验的Java开发人员,本文都将为您提供足够的信息来开始在Java应用程序中使用JDBC与MySQL数据库进行交互。通过掌握这些基础知识,您将能够构建更强大、更可靠的数据库驱动的Java应用程序,并更好地理解Java与数据库之间的交互过程。
接下来,让我们深入研究JDBC的基础知识,并开始探索如何在Java应用程序中利用JDBC来连接MySQL数据库。
作者建议:学习知识在于深度理解,多动手、多动脑,总能更快地领悟。不要仅仅停留在阅读代码的层面,亲自动手敲打一遍,会带来更丰富的收获。通过实践,我们能够更深入地理解知识,掌握技能,并且在解决问题时更加得心应手。相信自己的能力,坚持不懈地实践,你将会取得更大的进步和成就。让学习成为一种习惯,让动手实践成为你提升的捷径,加油!你是最棒的!
目录
概述
JDBC搭建
在项目中添加jar文件
注册JDBC驱动程序:
初始化驱动程序 ----- 这样就打开与数据库的通信通道
建立与数据库连接
发送sql
Statement
PrepareStatement
关闭数据库
preparedStatement和Statement的区别
查询所有信息---ResultSet executeQuery()
概述
JDBC全程:Java DataBase connection ---- java数据库连接
java可以连接不同的数据库,但是不同的数据库具体连接细节不同.
连接: java设计出一系列的连接数据库的接口规范,然后有不同的数据库连接开发商去实现数据库的具体连接. 接口oper,开发商去实现接口,然后重写接口中方法.
JDBC API:
供程序员调用的接口与类,集成在java.sql包中
DriverManager类作用:管理各种不同的jDBC驱动
Connection 接口 与特定数据库的连接
Statement 接口 执行sql
PreparedStatement接口 执行sql
ResultSet接口 接收查询结果
mysql-connector-java-8.0.16.jar 就是mysql官方开发实现,具体连接数据库功能代码
JDBC搭建
在项目中添加jar文件
在项目下创建lib目录
将下载好的jar文件拖入lib中
右键jar文件找到这个启用就OK了
注册JDBC驱动程序:
初始化驱动程序 ----- 这样就打开与数据库的通信通道
Class.forName(“com.mysql.cj.jdbc.Driver”); //反射实现
或者 DriverManager.registerDriver(new Driver());
建立与数据库连接
DriverManager.getConnection() 创建一个Connection对象
Connection conn = DriverManager.getConnection(URL,USER,PASSWORD);
URL---jdbc:mysql://ip(本地:127.0.0.1):端口(3306)/数据库名?serverTimezone=Asia/Shanghai
通常只需要改变 数据库名 ip(如果与自己连接ip:127.0.0.1) 端口号(创建数据库的时候设置) 其他的不变
USER:用户名字---创建数据库设置 PASSWORD:用户密码---创建数据库设置
发送sql
Statement st = connection.createStatement();
executeUpdate(String sql) ---- 用来发送sql
实例:这个语句就给mysql数据库中发送一条数据,用来给student数据库添加数据
Statement st = connection.createStatement();
st.executeUpdate("INSERT INTO student(NAME,gender,birthday,phone,address,reg_time,majorid)"+"VALUES('"+name+"','"+gender+"','"+birthday+"','"+phone+"','"+address+"',now(),"+majorid+") ");
Statement
Satement中的方法:
Int executeUpdate(String sql) 用于执行ddl语句和dml(增,删,改)语句返回操作的行数
用于执行ddl语句返回0
用于执行dml语句返回操作的行数
增添数据
public static void main(String[] args) {
try {
set_value("素烧","男", "2022-2-2", "15235465236", "汉中", 2);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
public static void set_value(String name, String gender, String birthday, String phone, String address, int majorid) throws ClassNotFoundException, SQLException {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//建立与数据库的链接,或得连接对象
String url = "jdbc:mysql://127.0.0.1:3306/shooldb?serverTimezone=Asia/Shanghai";
String user = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, user, password);
//发送
Statement st = connection.createStatement();
st.executeUpdate("INSERT INTO student(NAME,gender,birthday,phone,address,reg_time,majorid)"+"VALUES('"+name+"','"+gender+"','"+birthday+"','"+phone+"','"+address+"',now(),"+majorid+") ");
//关闭数据库连接
st.close();
connection.close();
}
修改数据
public static void XiuGai(int num,String name, String gender, String birthday, String phone, String address, int majorid) throws ClassNotFoundException, SQLException {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//建立与数据库的链接,或得连接对象
String url = "jdbc:mysql://127.0.0.1:3306/shooldb?serverTimezone=Asia/Shanghai";
String user = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, user, password);
//发送
Statement st = connection.createStatement();
st.executeUpdate("UPDATE student SET name = '" + name + "', gender = '" + gender + "' WHERE num = 1");
//关闭数据库连接
st.close();
connection.close();
}
PrepareStatement
在sql语句中参数位置使用占位符,使用setXX方法向sql中设置参数
PrepareStatement ps = connection.prepareStatement(sql);
PrepareStatement中的方法:
Int executeUpdate() 用于执行ddl语句和dml(增,删,改)语句返回操作的行数
用于执行ddl语句返回0
用于执行dml语句返回操作的行数
增添数据
public static void set_value(String name, String gender, String birthday, String phone, String address, int majorid) throws ClassNotFoundException, SQLException {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//建立与数据库的链接,或得连接对象
String url = "jdbc:mysql://127.0.0.1:3306/shooldb?serverTimezone=Asia/Shanghai";
String user = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, user, password);
//?占位符,表示此处需要接收一个参数
PreparedStatement ps = connection.prepareStatement("insert into student(name,gender,birthday,phone,address,reg_time,majorid)" + "values (?,?,?,?,?,now(),?)");
ps.setObject(1, name);
ps.setObject(2, gender);
ps.setObject(3,birthday);
ps.setObject(4,phone);
ps.setObject(5,address);
ps.setObject(6,majorid);
//启动
ps.executeUpdate();
ps.close();
connection.close();
}
修改数据
public static void XiuGai(int num,String name, String gender, String birthday, String phone, String address, int majorid) throws ClassNotFoundException, SQLException {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//建立与数据库的链接,或得连接对象
String url = "jdbc:mysql://127.0.0.1:3306/shooldb?serverTimezone=Asia/Shanghai";
String user = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, user, password);
PreparedStatement ps = connection.prepareStatement("update student set name = ?,gender = ?,birthday = ?,phone = ?,address = ?,majorid = ? where num = ?");
ps.setObject(1, name);
ps.setObject(2, gender);
ps.setObject(3,birthday);
ps.setObject(4,phone);
ps.setObject(5,address);
ps.setObject(6,majorid);
ps.setObject(7,num);
//启动
ps.executeUpdate();
//关闭
ps.close();
connection.close();
}
关闭数据库
st.close(); --- 关闭发送
connection --- 关闭连接
preparedStatement和Statement的区别
相同点:都是向数据库发送sql
Statement :将参数直接拼接到sql中,要拼接字符串,写起来麻烦,安全性差 如果:删除参数加一个 or 1=1 可以直接将全部数据删除
preparedStatement:先用?占位,然后通过setObject方法赋值,写起来不用拼接字符串,安全可靠的在赋值时进行检测(?---setObject()执行会检测数据,占位符只能接受一个数据所以有or的时候就会直接报错),可以防止sql注入攻击
如果传进去多个值就会报错
如果你的删除demo2.delete("112 or 1=1"); 传参进去这样
查询所有信息---ResultSet executeQuery()
ResultSet executeQuery() 将查询结果封装到一个ResultSet对象中,需要将ResultSet对象的数据封装到对应的对象中.
实例:将数据库的数据全部拿出,并且赋给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";
String user = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url,user,password);
PreparedStatement ps = connection.prepareStatement("select num,name,gender,birthday,phone,reg_time from student where gender = ? ");
ps.setObject(1,gender);
ArrayList<Student> students = new ArrayList<>();//创建学生集合,用来存储查询的多个学生对象
ResultSet rs = ps.executeQuery();//将查询结果封装到一个ResultSet对象中, 需要将ResultSet对象中的数据封装到对应的对象中
//next() 如果结果集中有数据返回true,否则返回false
while (rs.next()){
//每循环一次,拿到一个学生对象
Student student = new Student();
student.setNum(rs.getInt("num"));
student.setName(rs.getString("name"));
student.setGender(rs.getString("gender"));
student.setBirthday(rs.getDate("birthday"));
student.setPhone(rs.getString("phone"));
student.setRegTime(rs.getTimestamp("reg_time"));
students.add(student);//将学生对象存入到学生集合中
}
rs.close();
ps.close();
connection.close();
return students;
}