一、JDBC概述
- JDBC(Java DataBase Connectivity)java数据库连接
- 是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问, 它由一组用Java语言编写的类和接口组成。
- 有了JDBC,java开发人员只需要编写一次程序,就可以访问不同的数据库。
- JavaAPI中提供了操作数据库的标准接口,最终由不同的数据库开发商实现这些标准接口来对数 据库操作。
- Java定义者制定了JDBC规范 数据库开发商实现接口 程序员学习使用标准规范。
JDBC API
供程序员调用的接口与类,集成在java.sql包中
二 、JDBC搭建
注册JDBC驱动程序
这需要初始化驱动程序,这样就可以打开与数据库的通信信道
建立与数据库的连接
这需要使用 DriverManager.getConnection( ) 方法来创建一个 Connection 对象,它代表一个物理连接的数据库
获得 Statment 执行 SQL 语句
获得 PrepareStatement 执行 SQL 语句
- 在sql语句中参数位置使用占位符,使用setXX方法向sql中设置参数
- PrepareStatement ps = connection.prepareStatement(sql);
- PrepareStatement中的方法:
关闭与数据库的链接通道
每次操作完成后关闭所有与数据库交互的通道
e.g.:
代码示例如下:
import com.mysql.cj.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 {//2.注册驱动//Class.forName("com.mysql.cj.jdbc.Driver");//反射方式加载驱动类DriverManager.registerDriver(new Driver());//3.建立与数据库的连接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); //com.mysql.cj.jdbc.ConnectionImpl@25359ed8//4.发送sqlStatement statement = connection.createStatement(); //com.mysql.cj.jdbc.StatementImpl@442675e1statement.executeUpdate("insert into major(name)value('数学')");//5.关闭与数据库的连接statement.close();connection.close();}
}
三、 PreparedStatement 和 Statement
Statement(e.g.):
PreparedStatement (e.g.):
PreparedStatement 与 Statement 相比优势
- 代码的可读性和可维护性.
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无 论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次。 - 最重要的一点是极大地提高了安全性.,防止sql注入。
注:- 而如果你使用预编译语句,你传入的任何内容就不会和原来的语句发生任何匹配的关系。
- 预编译模式中每个占位符处,只能插入一个值,而会过滤其他语句。
四、结果集处理
- PreparedStatement 和 Statement 中的 executeQuery( ) 方法中会返回一 个 ResultSet 对象,查询结果就封装在此对象中。
- 使用ResultSet中的next()方法获得下一行数据。
- 使用getXXX(String name)方法获得。
练习代码如下:
import com.mysql.cj.jdbc.Driver;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class Demo2 {public static void main(String[] args) throws SQLException {//Demo2.insert("小明","男","2003-3-4","1533555",1.65);//Demo2.update(4,"小红","女","2003-3-4","15333333",1.65);Demo2.delete("0 or 1=1");}public static void insert(String name,String gender,String birthday,String phone,double height) throws SQLException {//注册驱动DriverManager.registerDriver(new 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);//发送sqlStatement statement = connection.createStatement();statement.executeUpdate("insert into student(name,gender,birthday,phone,height)value('"+name+"','"+gender+"','"+birthday+"','"+phone+"',"+height+")");//关闭与数据库的连接statement.close();connection.close();}public static void update(int number,String name,String gender,String birthday,String phone,double height) throws SQLException {//注册驱动DriverManager.registerDriver(new 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);//发送sqlStatement statement = connection.createStatement();statement.executeUpdate("update student set name='"+name+"',gender='"+gender+"',birthday='"+birthday+"',phone='"+phone+"',height="+height+" where number="+number);//关闭与数据库的连接statement.close();connection.close();}public static void delete(String number) throws SQLException {//注册驱动DriverManager.registerDriver(new 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);//发送sqlStatement statement = connection.createStatement();statement.executeUpdate("delete from student where number= "+number); //直接将字符串拼接到sql中,不能防止sql注入攻击" 0 or 1=1"//关闭与数据库的连接statement.close();connection.close();}
}