什么是JDBC?
SUN公司为了简化开发人员对数据库的操作,提供了一个Java操作数据库的一个规范。这些规范的实现由厂商去实现,开发人员只需要掌握JDBC接口即可。
使用JDBC的完整步骤
- 在MySql中创建一个数据库
-- 创建测试数据库
CREATE DATABASE jdbctest CHARACTER SET utf8 COLLATE utf8_general_ci
USE jdbctest
CREATE TABLE users(
`id` INT(3) NOT NULL,
`name` VARCHAR(20) NOT NULL,
`password` VARCHAR(20) NOT NULL,
`email` VARCHAR(50) NOT NULL,
`birthday` DATETIME
)ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO users(id,NAME,PASSWORD,email,birthday)
VALUES(1,'zhansan','123456','zs@sina.com','1980-12-04'),
(2,'lisi','123456','lisi@sina.com','1981-12-04'), (3,'wangwu','123456','wangwu@sina.com','1979-12-04');
- 在IDEA中创建一个正常的工程,然后创建一个lib包,导入数据库jar包
- 在IDEA中编写测试代码
import java.sql.*;
public class JDBCTest1 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1、加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2、输入用户信息和url
String url="jdbc:mysql://localhost:3306/jdbctest?useUnicode=true&characterEncoding=utf8&useSSL=true";
String username="root";
String password="123456";
//3、获取数据库对象
Connection connection = DriverManager.getConnection(url, username, password);
//4、使用数据库对象创建一个操作数据库对象
Statement statement = connection.createStatement();
//5、使用操作对象去操作sql
String sql="select * from users";
//resultSet就是查询指定语句后返回的结果
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()){
System.out.println("id:"+resultSet.getObject("id"));
System.out.println("name:"+resultSet.getObject("name"));
System.out.println("pwd:"+resultSet.getObject("password"));
System.out.println("email"+resultSet.getObject("email"));
System.out.println("birth"+resultSet.getObject("birthday"));
System.out.println("===============");
}
//6、查询结束后,要释放所有的连接
resultSet.close();
statement.close();
connection.close();
}
}
封装JDBC
- 在src包下创建db.properties配置文件
driver=com.mysql.jdbc.Driver;
url=jdbc:mysql://localhost:3306/jdbctest?useUnicode=true&characterEncoding=utf8&useSSL=true
username=root
password=123456
- 书写一个工具类,封装JDBC需要的操作
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class Utils {
public static String driver=null;
public static String url=null;
public static String username=null;
public static String password=null;
static {
try {
InputStream in = Utils.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(in);
//使用properties对象获取驱动信息
driver = properties.getProperty("driver");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
//加载驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//创建数据库对象的方法
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,username,password);
}
//创建释放资源的方法
public static void release(Connection connection, Statement statement,ResultSet resultSet){
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
- 使用JDBC进行数据的插入
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class InsertTest {
public static void main(String[] args) {
Connection connection=null;
Statement statement=null;
ResultSet resultSet=null;
//调用getConnection方法创建数据库对象
try {
connection=Utils.getConnection();
//使用connection对象创建操作数据库对象statement
statement=connection.createStatement();
String sql="insert into users(`id`,`name`,`password`,`email`,`birthday`)" +
"values('5','henry','111111','2056511971@qq.com','2008-08-08')";
int i = statement.executeUpdate(sql);
if (i>0){
System.out.println("数据插入成功!");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
//调用Utils类中的release方法释放所有连接
Utils.release(connection,statement,resultSet);
}
}
}
使用statement语句导致SQL注入的问题
在使用statement语句对数据库中的数据进行查询时,会发生以下的问题
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Test {
public static void main(String[] args) {
login("'or'1=1","'or'1=1");
}
public static void login(String username,String password){
Connection connection=null;
Statement statement=null;
ResultSet resultSet=null;
try {
connection = Utils.getConnection();
statement=connection.createStatement();
String sql="select * from users where `name`='"+username+"'and `password`='"+password+"'";
resultSet= statement.executeQuery(sql);
if (resultSet.next()){
System.out.println("id:"+resultSet.getObject("id"));
System.out.println("pwd:"+resultSet.getObject("password"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- 明显用户名和密码是错误的,但是仍然可以查询到数据,为了解决这个问题,我们使用preparedStatement语句对sql语句进行操作,它可以防止SQL语句注入
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class PreparedSql {
public static void main(String[] args) {
login("'or'1=1","'or1=1'");
}
public static void login(String username,String password){
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
try {
connection = Utils.getConnection();
String sql="select * from users where `name`=? and `password`=?";
preparedStatement=connection.prepareStatement(sql);
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
System.out.println("name:"+resultSet.getObject("name"));
System.out.println("pwd:"+resultSet.getObject("password"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
Utils.release(connection,preparedStatement,resultSet);
}
}
}
使用IDEA连接数据库
- 输入用户名和密码之后如果不能点击Test Connection,则要先点击下面的DownLoad
- 在Schemas中选择数据库
- 可视化操作修改表中的数据
- 在IDEA中书写SQL语句