JDBC
JDBC
Java DateBase Connectivity 是一个独立于特定数据库的管理系统,通用的SQL数据库存取和操作的公共接口。
定义了一组标准,为访问不同的数据库提供了统一的途径。
JDBC体系结构
JDBC接口包括两个层面:
面向应用的API,供程序员调用。
面向数据库的API,供厂商开发数据库的驱动程序。
JDBC API:
提供者:java官方。
内容:供开发者调用的接口。
java.sql javax.sql
DriverManager类
Connection接口
Statement接口
ResultSet接口
DriverManager
提供者:java官方。
作用:管理不同的JDBC驱动。
JDBC驱动
提供者:数据库厂商。
作用:连接不同的数据库。
JDBC的使用
1.加载数据库驱动。数据库驱动是java程序和数据库之间的桥梁。
2.获取Connection。Connection是java程序与数据库的一次连接。
3.创建Statement对象,由Connection产生。执行SQL语句。
4.如果需要接受返回值,创建ResultSet对象,保存Statement执行之后所查询到的结果。
JDBC简易示例:增删改查
示例:
1.创建java项目。
2.在项目中新建lib文件夹。
3.在文件夹中加入mysql-connector-java-8.0.16.jar。这个是跟MySql的版本对应的,是向下兼容的,如果你使用的是Mysql8.0,你没有办法使用mysql-connector-java-5.0.jar,但是如果你使用mysql-connector-java-8.0.16.jar,MySQL5.0和8.0都能使用。
4.添加jar包到Libraries中。
package com.wildfire.jdbc;
import java.sql.*;
public class Jdbc1 {
public static void main(String []args){
try {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接
String url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
//jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
//jdbc:数据库类型://url:端口号/数据库名?属性 useUnicode=true&characterEncoding=UTF-8处理中文乱码问题
String user="root";
String password="xjmwan1314";
Connection connection= DriverManager.getConnection(url,user,password);
// String sql="insert into student(name,score,birthday) values('边信哲',20,'2000-03-18')";
// String sql="update student set name='张志流' where score=20";
// String sql="delete from student where name='张三'";
// Statement statement=connection.createStatement();
// int result=statement.executeUpdate(sql);
// System.out.println(result);
String sql="select * from student";
Statement statement =connection.createStatement();
ResultSet resultSet=statement.executeQuery(sql);
while(resultSet.next()){
//resultSet.next()返回值是一个布尔型,如果下一行不存在,就返回false,即跳出循环。
String name=resultSet.getString(1);
Integer score=resultSet.getInt(2);
String birthday=resultSet.getString(3);
System.out.println(name+":"+score+":"+birthday);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
注意:增删改使用的是executeUpdate方法,返回的是int类型,影响了几行就返回几。
查使用的是executeQuery方法,返回的是ResultSet类型,是查询的结果集。
使用IDEA提供的简单的数据库可视化工具:
1.右边DateBase--》+--》Data Source(数据来源)--》MySQL
2.
3.点击Test Connection,返回success则返回成功。
PreparedStatement
实际开发中,我们常用Statement的子类PreparedStatement来完成增删改查的操作。
使用Statement进行开发有两个问题:
1.需要频繁拼接String字符串,出错率较高。
例如:
String username="夜雨声烦";
String pwd="xjmwan1314";
String sql="select * from user where username="+username+"and password ="+password;
System.out.println(sql);
运行的结果是:
select * from user where username=夜雨声烦and password =xjmwan1314
很明显不是我们想要的结果。
2.存在SQL注入的风险。
SQL 注⼊:利⽤某些系统没有对⽤户输⼊的信息进⾏充分检测,在⽤户输⼊的数据中注⼊⾮法的 SQL 语句,从⽽利⽤系统的 SQL 引擎完成恶意⾏为的做法。
例如:在输入框拼接SQL语句。
使用PreparedStatement能很好的避免以上问题。
package com.wildfire.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class jdbc2 {
public static void main(String []args){
try {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接
String url="jdbc:mysql:localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
String user="root";
String password="xjmwan1314";
Connection connection= DriverManager.getConnection(url,user,password);
String username="夜雨声烦";
String userpassword="123";
//问号就是占位符
String sql="select * from user where username = ? and userpassword = ?";
//在这里就输入了sql语句,后面调用方法却没有用。
PreparedStatement preparedStatement=connection.prepareStatement(sql);
//第一个问号赋值为username 不进行字符串拼接 直接使用字符串进行判断
preparedStatement.setString(1,username);
preparedStatement.setString(2,userpassword);
ResultSet resultSet=preparedStatement.executeQuery();
if(resultSet.next()){
System.out.print("登录成功!");
}else{
System.out.println("登陆失败!");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意:PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
这里是创建对象的时候就传入了SQL语句,而不是使用方法的时候传入sql语句。