目录
源码在码云上
传送门:jdbc_demo
0.jdbc的入门使用
1.查询数据库
new Driver()是导包mysql驱动里面的。import com.mysql.jdbc.Driver;
不需要释放资源
Exception in thread "main" java.sql.SQLException: Before start of result set
取数据传入的参数写错了
String url = "jdbc:mysql://localhost:3306/jdbc_demo";
String url = "协议:子协议://主机:端口号 /数据库";
package com.jcli;
import com.mysql.jdbc.Driver;
import java.sql.*;
/**
* 查询所有的用户, 输出到控制台
* - 在java项目模块下,导入mysql驱动包
* - 注册驱动
* - 获得连接
* - 创建执行sql语句对象
* - 执行sql语句,处理结果
* - 释放资源
*/
public class Test01_select {
public static void main(String[] args) throws SQLException {
//- 在java项目模块下,导入mysql驱动包
//- 注册驱动
DriverManager.registerDriver(new Driver());//此处导包
//- 获得连接
String url = "jdbc:mysql://localhost:3306/jdbc_demo";
String user = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, user, password);
//- 创建执行sql语句对象
Statement statement = connection.createStatement();
//- 执行sql语句,处理结果
String sql = "select * from user";
ResultSet resultSet = statement.executeQuery(sql);
// 游标下移,并且判断当前游标指向的行是否有记录(数据),如果有就返回true,否则返回false
while (resultSet.next()) {
//取数据
System.out.println(resultSet.getObject("id"));
System.out.println(resultSet.getObject("username"));
System.out.println(resultSet.getObject("password"));
System.out.println(resultSet.getObject("nickname"));
System.out.println("-------------------------------------");
}
//- 释放资源
resultSet.close();
statement.close();
connection.close();
}
}
2.将结果进行封装
防止null值
3.查询单个用户, 输出到控制台
直接写驱动类名会自动生成路径,idea中
所以sql语句中属性用单引号是因为这样吗
1.JDBC操作数据库
// 1.注册驱动
// 2.获得连接
// 3.创建sql语句执行体
// 4.执行sql语句,处理结果
// 5.释放资源
1.查询所有用户信息
package com.jcli.Test02_CRUD;
import com.jcli.bean.User;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
/**
* 查询所有用户信息
*/
public class Test02_findAll {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("java.sql.Driver");
//2.获得连接
String url = "jdbc:mysql://localhost:3306/jdbc_demo";
Connection connection = DriverManager.getConnection(url, "root", "root");
// 3.创建sql语句执行对象
Statement statement = connection.createStatement();
// 4.执行sql语句,处理结果
String sql = "select * from user";
ResultSet resultSet = statement.executeQuery(sql);
// 5.创建ArrayList集合,存储user对象
ArrayList<User> list = new ArrayList<>();
// 6.循环取数据
while (resultSet.next()){
// 7.取数据
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
String password = resultSet.getString("password");
String nickname = resultSet.getString("nickname");
// 8.创建user对象
User user = new User();
// 9.赋值
user.setId(id);
user.setUsername(username);
user.setPassword(password);
user.setNickname(nickname);
// 10.把user对象添加到集合
list.add(user);
}
// 11.释放资源
resultSet.close();
statement.close();
connection.close();
// 12.打印集合
for (User user : list) {
System.out.println(user);
}
}
}
2.根据id查询用户信息
3.新增用户信息
4.修改用户信息
5.删除用户信息
为啥会退出错误
2.抽取JDBCUtils
//静态代码块
// 加载db.properties配置文件中的数据
// 1.创建properties对象
// 2.加载配置文件
// 3.给成员变量赋值
// 4.注册驱动
//获得连接
//释放资源
//测试
// 1.注册驱动,获得连接
// 2.创建执行sql语句体
// 3.执行sql语句,处理结果
// 4.释放资源
查询所有
修改用户信息
3.登录案例演示sql注入
在控制台输入用户名和密码,查询数据库,如果数据库存在当前用户,显示登录成功!
如果数据库不存在当前用户,显示登录失败!
就是用户输入账号密码去数据库查询,找到则登录成功
sql注入
原因:因为sql语句是简单的字符串拼接,所以拼接后sql语句的格式可能会改变 解决方案:使用预编译sql语句对象,对sql语句进行预编译,从而固定sql语句的格式 setXXX(参数位置,参数的值)
//- 用户输入用户名和密码
//- 注册驱动,获得连接
//- 创建执行sql语句对象
//- 执行sql语句,处理结果(判断是否登录成功,其实就是判断User对象是否为null)
//- 释放资源
使用prepareStatement()
4.使用prepareStatement()进行增删改查
// 1.注册驱动,获得连接
// 2.预编译sql语句,得到预编译对象
// 3.为sql语句设置参数
// 4.执行sql语句,数量结果
// 5.释放资源
1.add
2.update
3.delete
4.findAll
5.findUserById
5.转账案例演示事务
-
管理事务的功能类:Connection接口
-
开启事务:
setAutoCommit(boolean autoCommit); 参数为false,则手动开启事务。
-
提交事务:
commit();
-
回滚事务:
rollback();
-
-
zs给ls转100, 使用事务进行控制
//- 1.注册驱动,获得连接
//- 2.开启事务
//- 3.预编译sql语句,得到预编译对象
//- 4.设置sql语句参数
//- 5.执行sql语句,处理结果
//- 6.提交事务或者回滚事务
//- 7.释放资源