java的数据库编程—JDBC编程
1、JDBC 即Java Database Connectivity,意思是java数据库连接。是一种用于执行SQL语句的Java API,它是 Java中的数据库连接规范。这个API由 java.sql.,javax.sql. 包中的一些类和接口组成,它为Java 开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问。
2、JDBC工作原理
JDBC 为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包含一些通用的接口类。
JDBC访问数据库层次结构:
3、JDBC优势:
Java语言访问数据库操作完全面向抽象接口编程
开发数据库应用不用限定在特定数据库厂商的API
程序的可移植性大大增强
4. JDBC使用的步骤
首先准备数据库驱动包,并添加到项目的依赖中:在项目中创建文件夹lib,并将依赖包mysql-connector-java-5.1.47.jar复制到lib个中(和当前项目在同一路径当中)。
①
②
与工程建立联系
配置该jar包到本项目的依赖中:右键点击项目Open Module Settings,在Modules中,点击项目,配置Dependencies,点击+,JARS or Directories,将该lib文件夹配置进依赖中,表示该文件夹下的jar包都引入作为依赖。
①
②
③
最后,点击apply,点击ok。
完成之后:
1、加载JDBC驱动程序:
反射,这样调用初始化com.mysql.jdbc.Driver类,即将该类加载到JVM方法区,并执行该类的静态方法块、静态属性。
Class.forName("com.mysql.jdbc.Driver");
此时,有异常,交给JVM(快捷建Alt+Inter)
2、创建数据库连接
String url = "jdbc:mysql://127.0.0.1:3306/testjava17_18?useSSL=false";
String username = "root";
String password = "1111";
Connection connection = DriverManager.getConnection(url, username, password);
解释:
getConnection处理方式和上面一样。
3、执行sql语句
String sql = "select * from user";
Statement statement = connection.createStatement();//获取statement 对象;
ResultSet resultSet = statement.executeQuery(sql);//executeQuery(sql)查询语句;返回值为ResultSet;查询所有的结果在ResultSet集下
if (resultSet.next()) {
//resultset。next 获取时自动会想向下移 System.out.println(resultSet.getInt(1));
System.out.println(resultSet.getString(2));
System.out.println(resultSet.getString(3));
}
注:提前在数据库里面创建一个表
查询结果为;
如果,我们建一个user类,代码可以写成封装成一个对象:
/**
* Created with IntelliJ IDEA.
* Description:
* User: HuYu
* Date: 2021-03-22
* Time: 09:26
*/
public class User {
private int id;
private String name;
private String passord;
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 getPassord() {
return passord;
}
public void setPassord(String passord) {
this.passord = passord;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", passord='" + passord + '\'' +
'}';
}
}
此时,代码可以写成封装成一个对象,查询代码可以写成

if (resultSet.next()) {
//resultset。next 获取时自动会想向下移,多条数据改为while;
User user = new User();
user.setId(resultSet.getInt(1));//下标必须从1开始
user.setName(resultSet.getString(2));
user.setPassord(resultSet.getString(3));
System.out.println(user);
}
注:有警告则改代码为:
查询结果为:
根据条件查询查询语句可改为:
①
//3.执行sql语句
String sql = "select * from user where name ='bit' and passord = '123'";
运行结果:
②
查询语句改为:
String uname = "bit";
String upassord = "123";
String sql = "select * from user where name ='"+uname+"' and passord = '"+upassord+"'";//定义成变量形式,原始写法,一般不这样写
//需注意,这样写拼接时不能有空格,
sql注入:
改进:
使用prepareStatement作用:预防sql注入和预编译
①
②
//3.执行sql语句
String uname = "bit";
String upassord = "1'or '1' ='1";//防止sql注入
//String sql = "select * from user where name = '"+uname+"' and password='"+upass+"'";
String sql = "select * from user where name = ? and passord = ?";//定义成变量形式,原始写法,一般不这样写
//需注意,这样写拼接时不能有空格,
// Statement statement = connection.createStatement();//获取statement 对象;
PreparedStatement preparedStatement = connection.prepareStatement(sql);//prepareStatement作用:预防sql注入和预编译
preparedStatement.setString(1,uname);
preparedStatement.setString(2,upassord);
System.out.println("sql:"+preparedStatement.toString());
ResultSet resultSet = preparedStatement.executeQuery();//executeQuery(sql)查询语句;返回值为ResultSet;查询所有的结果在ResultSet地下
if (resultSet.next()) {
//resultset。next 获取时自动会想向下移,多条数据改为while;
User user = new User();
user.setId(resultSet.getInt(1));//下标必须从1开始
user.setName(resultSet.getString(2));
user.setPassord(resultSet.getString(3));
System.out.println(user);
}
//关闭顺序:
resultSet.close();
preparedStatement.close();
connection.close();
使用prepareStatement来实现数据库的增删查改:
1、插入查询:
//3.执行sql语句
String sql = "insert into user(id,name,passord) values (?,?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);//prepareStatement作用:预防sql注入和预编译
preparedStatement.setInt(1,2);
preparedStatement.setString(2,"huyu");
preparedStatement.setString(3,"025");
System.out.println("sql:"+preparedStatement.toString());
//除了 查询 其他都要用executeUpdate 返回值是受影响的行数
int ret = preparedStatement.executeUpdate();//executeUpdate为插入语句,返回值为int、要用int接受
if(ret != 0) {
System.out.println("插入成功!");
}
//关闭顺序:
preparedStatement.close();
connection.close();
结果:
2、更新查询
在这里插入代码片//3.执行sql语句
String sql = "update user set name=? where id=?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);//prepareStatement作用:预防sql注入和预编译
preparedStatement.setString(1,"huyu2");
preparedStatement.setInt(2,2);
System.out.println("sql:"+preparedStatement.toString());
//除了 查询 其他都要用executeUpdate 返回值是受影响的行数
int ret = preparedStatement.executeUpdate();//executeUpdate为插入语句,返回值为int、要用int接受
if(ret != 0) {
System.out.println("更新成功!");
}
//关闭顺序:
preparedStatement.close();
connection.close();
结果:
3、删除查询
//3.执行sql语句
String sql = "delete from user where id=?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);//prepareStatement作用:预防sql注入和预编译
preparedStatement.setInt(1,2);
System.out.println("sql:"+preparedStatement.toString());
//除了 查询 其他都要用executeUpdate 返回值是受影响的行数
int ret = preparedStatement.executeUpdate();//executeUpdate为插入语句,返回值为int、要用int接受
if(ret != 0) {
System.out.println("删除成功!");
}
//关闭顺序:
preparedStatement.close();
connection.close();
结果: