JDBC入门
操作环境:
navicat+IDEA2020.3.1
1.创建数据库表
1.1我们首先创建一个csdn
库, 然后切换到csdn
库中
create database csdn; -- 创建一个数据库
use csdn; -- 选择改数据库
1.2在csdn
数据库中创建一个account
, tb_user
表,用于jdbc之后的测试操作
DROP TABLE IF EXISTS account; -- 如果存在这个表则先删除该表然后再次创建
-- 创建账户表
CREATE TABLE account(
id int PRIMARY KEY auto_increment,
name varchar(10),
money double(10,2)
);
-- 添加数据
INSERT INTO account(name,money) values('张三',1000),('李四',1000);
select * from account;
drop table if EXISTS tb_user;
create table tb_user(
id int,
username varchar(20),
password varchar(32)
);
insert into tb_user values (1, "zhangsan", "123"), (2, "lisi", "123");
select * from tb_user;
2.IDEA中创建项目
2.1创建新的空的项目(用于编写java代码)
1.File—>New—>Project
2.Empty Project —>Empty Project —>Next
3.设置空项目的名称
2.2在刚刚创建的空项目中创建一个新的模块
- Modules—>New Module
- Java---->确认JDK版本(我这里是1.8)---->Next
3.设置模块名称—>Finsh–>OK
2.3导入使用jdbc的jar包
2.3.1下载jar包
下载jar包(mysql-connector-java-5.1.48.jar)
https://mvnrepository.com/artifact/mysql/mysql-connector-java
点击jar包下载即可
2.3.2 导入jar包
New—>Directory 新建lib目录
下载得到的jar包复制到lib目录下面
右键—>Add as Libaray
设置为模块有效–>OK
3.JDBC代码
Statement 操作
在jdbc目录下面新建JDBCDemo类
Src–>New—>Java Class
1.增删改查操作
说明:
jdbc:mysql://127.0.0.1:3306/csdn // 这个表示链接的是本地的数据集,默认会有安全警告(红字)
jdbc:mysql:///csdn // 这个等价于上面那一行
jdbc:mysql://127.0.0.1:3306/csdn?useSSL=false // 添加?useSSL=false可以忽略警告信息
关键代码:
insert into account (name, money) values ('jorda', 2300); --增加
delete from account where name = 'jordan'; --删除
update account set money = 2500 where id = 1 -- 修改
select * from account -- 查询
具体代码:
import java.sql.*;
public class JDBCDemo {
public static void main(String[] args) throws Exception {
addAccount(); //增加操作
// deleteAccount(); //删除操作
// updateAccount(); //修改操作
// selectAll(); //查询操作
}
// 1.增加操作 增加一个account用户
public static void addAccount() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/csdn";
// 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
String username = "root"; // 数据库用户名
String password = "123456"; // 用密码对应的密码
Connection connection = DriverManager.getConnection(url, username, password);
//3.定义需要执行的Sql
String sql = "insert into account (name, money) values ('jordan', 2300)";
//4.获取执行Sql的Statement对象
Statement stmt = connection.createStatement();
//5.执行sql
int count = stmt.executeUpdate(sql);
//6.处理结果
if (count>0){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
// 7.释放资源 关闭流
connection.close();
}
// 2.删除操作 删除一个account用户例如: jordan
public static void deleteAccount () throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/csdn";
// 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
String username = "root"; // 数据库用户名
String password = "123456"; // 用密码对应的密码
Connection connection = DriverManager.getConnection(url, username, password);
//3.定义需要执行的Sql
String sql = "delete from account where name = 'jordan'";
//4.获取执行Sql的Statement对象
Statement stmt = connection.createStatement();
//5.执行sql
int count = stmt.executeUpdate(sql);
//6.处理结果
if (count>0){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
// 7.释放资源 关闭流
connection.close();
}
// 3.修改操作 money修改为2500
public static void updateAccount () throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/csdn";
// 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
String username = "root"; // 数据库用户名
String password = "123456"; // 用密码对应的密码
Connection connection = DriverManager.getConnection(url, username, password);
//3.定义需要执行的Sql
String sql = "update account set money = 2500 where id = 1";
//4.获取执行Sql的Statement对象
Statement stmt = connection.createStatement();
//5.执行sql
int count = stmt.executeUpdate(sql);
//6.处理结果
if (count>0){
System.out.println("更新成功");
}else{
System.out.println("更新失败");
}
// 7.释放资源 关闭流
connection.close();
}
// 4.查询操作 查询所有的account用户
public static void selectAll() throws Exception {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取链接
String url = "jdbc:mysql://127.0.0.1:3306/csdn";
// 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
String username = "root"; // 数据库用户名
String password = "123456"; // 用密码对应的密码
Connection connection = DriverManager.getConnection(url, username, password);
//3.定义需要执行的Sql
String sql = "select * from account";
//4.获取执行Sql的Statement对象
Statement stmt = connection.createStatement();
//5.执行sql
ResultSet rs = stmt.executeQuery(sql);
//6.处理结果
while(rs.next()){
String id = rs.getString("id");
String name = rs.getString("name");
String money = rs.getString("money");
System.out.println(id + "\t" + name + "\t" + money);
}
// 7.释放资源 关闭流
rs.close();
connection.close();
}
}
PrepareStatement(可以防止SQL注入问题)
这里操作的是tb_user
表
新建要给PrepareStatementDemo类
说明:
// useServerPrepStmts=true 是为了开启PrepareStatement的预编译功能, 默认是不开启预编译功能的
jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true
1.增删改查
关键代码:
insert into tb_user (id, username, password) values (?, ?, ?) -- 增加操作
delete from tb_user where username = ? -- 删除操作
update tb_user set username = ? where id = ? -- 修改操作
select * from tb_user -- 查询所有操作
select * from tb_user where username = ? and password = ? -- 查询单个用户操作(登录操作)
具体代码:
import java.sql.*;
public class PrepareStatementDemo {
public static void main(String[] args) throws Exception {
// addUser(); // 添加用户
// deleteUser(); // 删除用户
// updateUser(); //修改用户
selectAll(); //查询所有用户
selectUser(); // 查询用户
}
// 1.增加操作 增加一个account用户
public static void addUser() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/csdn";
// 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
String username = "root"; // 数据库用户名
String password = "123456"; // 用密码对应的密码
Connection connection = DriverManager.getConnection(url, username, password);
//3.定义需要执行的Sql
String sql = "insert into tb_user (id, username, password) values (?, ?, ?)";
int id = 3;
String name = "wangwu";
String pwd = "123";
//4.获取执行Sql的Statement对象
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setInt(1,id);
pstmt.setString(2, name);
pstmt.setString(3,pwd);
//5.执行sql
int count = pstmt.executeUpdate();
//6.处理结果
if (count>0){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
// 7.释放资源 关闭流
connection.close();
}
// 2.删除操作 删除一个account用户例如: jordan
public static void deleteUser () throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/csdn";
// 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
String username = "root"; // 数据库用户名
String password = "123456"; // 用密码对应的密码
Connection connection = DriverManager.getConnection(url, username, password);
//3.定义需要执行的Sql
String sql = "delete from tb_user where username = ?";
//4.获取执行Sql的Statement对象
PreparedStatement pstm = connection.prepareStatement(sql);
String name = "wangwu";
pstm.setString(1, name);
//5.执行sql
int count = pstm.executeUpdate();
//6.处理结果
if (count>0){
System.out.println("删除成功");
}else{
System.out.println("删除失败, 不存在该用户");
}
// 7.释放资源 关闭流
connection.close();
}
// 3.修改操作 money修改为2500
public static void updateUser () throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/csdn";
// 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
String username = "root"; // 数据库用户名
String password = "123456"; // 用密码对应的密码
Connection connection = DriverManager.getConnection(url, username, password);
//3.定义需要执行的Sql
String sql = "update tb_user set username = ? where id = ?";
//4.获取执行Sql的Statement对象
PreparedStatement pstmt = connection.prepareStatement(sql);
String newName = "wuhuqifei";
int id = 2;
pstmt.setString(1, newName);
pstmt.setInt(2, id);
//5.执行sql
int count = pstmt.executeUpdate();
//6.处理结果
if (count>0){
System.out.println("更新成功");
}else{
System.out.println("更新失败");
}
// 7.释放资源 关闭流
connection.close();
}
public static void selectAll() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/csdn";
// 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
String username = "root"; // 数据库用户名
String password = "123456"; // 用密码对应的密码
Connection connection = DriverManager.getConnection(url, username, password);
//3.定义需要执行的Sql
String sql = "select * from tb_user";
//4.获取执行Sql的Statement对象
PreparedStatement pstmt = connection.prepareStatement(sql);
//5.执行sql
ResultSet rs = pstmt.executeQuery();
//6.处理结果
while(rs.next()){
String id = rs.getString("id");
String name = rs.getString("username");
String money = rs.getString("password");
System.out.println(id + "\t" + name + "\t" + money);
}
// 7.释放资源 关闭流
rs.close();
connection.close();
}
public static void selectUser() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/csdn";
// 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
String username = "root"; // 数据库用户名
String password = "123456"; // 用密码对应的密码
Connection connection = DriverManager.getConnection(url, username, password);
//3.定义需要执行的Sql
String sql = "select * from tb_user where username = ? and password = ?";
//4.获取执行Sql的Statement对象
PreparedStatement pstmt = connection.prepareStatement(sql);
String name = "zhangsan";
String pwd = "123";
pstmt.setString(1, name);
pstmt.setString(2, pwd);
//5.执行sql
ResultSet rs = pstmt.executeQuery();
//6.处理结果`在这里插入代码片`
if (rs.next()){
String loginName = rs.getString("username");
System.out.println("恭喜您, "+loginName+"登录成功");
}else{
System.out.println("登录失败, 密码或用户名不正确");
}
// 7.释放资源 关闭流
connection.close();
}
}
4 sql注入操作
新建一个SQLInjectionDemo测试sql注入的问题:
statement 存在注入问题
关键代码:
String name = "zhangsan";
String pwd = "' or '1' = '1"; // 将密码设置为字符换拼接百分之百正确的 情况
具体代码如下:
public class SQLInjectionDemo {
public static void main(String[] args) throws Exception {
loginUserStatement(); // 不能防止sql注入
loginUserPrepareStatement(); // 可以防止sql注入
}
public static void loginUserStatement() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/csdn?useSSL=false";
// 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
String username = "root"; // 数据库用户名
String password = "123456"; // 用密码对应的密码
Connection connection = DriverManager.getConnection(url, username, password);
//3.定义需要执行的Sql
String name = "zhangsan";
String pwd = "' or '1' = '1";
String sql = "select * from tb_user where username = '"+name+"' and password = '"+pwd+"'";
//4.获取执行Sql的Statement对象
Statement stmt = connection.createStatement();
//5.执行sql
ResultSet rs = stmt.executeQuery(sql);
//6.处理结果
System.out.println("Statement........................");
if (rs.next()){
String loginName = rs.getString("username");
System.out.println("恭喜您, "+loginName+"登录成功");
}else{
System.out.println("登录失败, 密码或用户名不正确");
}
// 7.释放资源 关闭流
connection.close();
}
public static void loginUserPrepareStatement() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/csdn?useSSL=false";
// 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
String username = "root"; // 数据库用户名
String password = "123456"; // 用密码对应的密码
Connection connection = DriverManager.getConnection(url, username, password);
//3.定义需要执行的Sql
String sql = "select * from tb_user where username = ? and password = ?";
//4.获取执行Sql的Statement对象
PreparedStatement pstmt = connection.prepareStatement(sql);
String name = "zhangsan";
String pwd = "' or '1' = '1";
pstmt.setString(1, name);
pstmt.setString(2, pwd);
//5.执行sql
ResultSet rs = pstmt.executeQuery();
System.out.println("PrepareStatement........................");
//6.处理结果
if (rs.next()){
String loginName = rs.getString("username");
System.out.println("恭喜您, "+loginName+"登录成功");
}else{
System.out.println("登录失败, 密码或用户名不正确");
}
// 7.释放资源 关闭流
connection.close();
}
}
结果显示:
5.Druid连接池操作
5.1 准备配置文件
在Src目录下面新建一个druid.properties
配置文件存放数据库连接信息
druid.properties
配置文件的信息如下:
其中username和password可以根据自己的数据库名称和密码设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///csdn?useSSL=false&useServerPrepStmts=true
# useSSL 忽略警告信息, userServer 开启PrepareStatement的预编译功能
username=root
password=123456
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
5.2导入druid的jar包
jar包下载链接:
https://mvnrepository.com/artifact/com.alibaba/druid/1.1.12
下载完成之后复制到到lib目录中(如果没有lib就在当前模块中创建lib目录)
右键—>Add as Libaray (具体可以参照2.3.1)
在src中创建druid的目录,并创建DruidDemo测试类
5.3 Druid操作代码
关键代码: 这部分代码代替之前得到connection连接的操作
Properties prop = new Properties();
prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
// 4.根据配置文件获取数据库对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
Connection connection = dataSource.getConnection();
具体代码如下:
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
public class DruidDemo {
public static void main(String[] args) throws Exception {
// 获取当前文件的路径
System.out.println(System.getProperty("user.dir"));
// 1.导入jar包
// 2.定义配置文件
// 3.加载配置文件
Properties prop = new Properties();
// jdbc-demo是自己的模块名称 可根据自己的模块名称进行改动
prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
// 4.根据配置文件获取数据库对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
Connection connection = dataSource.getConnection();
// ============================== 下面的和之前一样 ===============================
String sql = "select * from tb_user";
PreparedStatement pstmt = connection.prepareStatement(sql);
//5.执行sql
ResultSet rs = pstmt.executeQuery();
//6.处理结果
while(rs.next()){
String id = rs.getString("id");
String name = rs.getString("username");
String money = rs.getString("password");
System.out.println(id + "\t" + name + "\t" + money);
}
// 7.释放资源 关闭流
rs.close();
connection.close();
}
}
输出结果:
本人自己学习笔记代码,如有错误欢迎指正交流。