} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
}
ResultSet
:结果集对象,封装查询结果
-
boolean next()
: 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false
,如果不是则返回true
。 -
getXxx(
参数);获取数据 -
Xxx
:代表数据类型 如:int getInt()
,String getString()
-
参数:
-
int
:代表列的编号,从1开始 如:getString(1)
-
String
:代表列名称。 如:getDouble("balance")
- 使用步骤:
-
游标向下移动一行
-
判断是否有数据
-
获取数据
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString(“name”);
System.out.println(id + “—” + name);
}
-
PreparedStatement
:执行sql的对象 -
SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
-
输入用户随便,输入密码:a’ or ‘a’ = 'a
-
sql
:select * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a'
-
解决sql注入问题:使用
PreparedStatement
对象来解决。 -
预编译的SQL:参数使用
?
作为占位符。 -
步骤:
-
导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
-
注册驱动。
-
获取数据库连接对象
Connection
-
定义sql
- 注意:sql的参数使用?作为占位符。 如:
select * from user where username = ? and password = ?;
-
获取执行sql语句的对象
PreparedStatement
Connection.prepareStatement(String sql)
-
给?赋值:
方法: setXxx(参数1,参数2)
-
参数1:?的位置编号 从1 开始
-
参数2:?的值
-
执行sql,接受返回结果,不需要传递sql语句。
-
处理结果。
-
释放资源。
-
注意:后期都会使用
PreparedStatement
来完成增删改查的所有操作
-
可以防止
SQL
注入。 -
效率更高。
-
目的:简化书写
-
分析:
-
注册驱动也抽取
-
抽取一个方法获取连接对象
需求:不想传递参数(麻烦),还得保证工具类的通用性。
解决:配置文件
url=jdbc:mysql:///mzz
user=root
password=root
driver=com.mysql.jdbc.Driver
- 抽取一个方法释放资源
public class JDBCUtiles {
private static String url;
private static String user;
private static String password;
private static String driver;
static {
//读取资源文件,获取值。
try {
//1. 创建Properties集合类。
Properties pro = new Properties();
//获取src路径下的文件的方式—>ClassLoader 类加载器
ClassLoader classLoader = JDBCUtiles.class.getClassLoader();
URL res = classLoader.getResource(“jdbc.properties”);
String path = res.getPath();
System.out.println(path);
//2. 加载文件
pro.load(new FileReader(path));
//3. 获取数据,赋值
url = pro.getProperty(“url”);
user = pro.getProperty(“user”);
password = pro.getProperty(“password”);
driver = pro.getProperty(“driver”);
//4. 注册驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
-
获取连接
-
@return 连接对象
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
/**
-
释放资源
-
@param stmt
-
@param conn
*/
public static void close(ResultSet rs, Statement stmt, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
- 练习:
public class jdbcDemo1 {
public jdbcDemo1() {
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(“请输入用户名:”);
String username = sc.nextLine();
System.out.println(“请输入密码:”);
String password = sc.nextLine();
boolean flag = (new jdbcDemo1()).login2(username, password);
if (flag) {
System.out.println(“登录成功!”);
} else {
System.out.println(“用户名或密码错误!”);
}
}
public boolean login(String username, String password) {
if (username != null && password != null) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = JDBCUtiles.getConnection();
String sql = “select * from account where name = '” + username + “’ and password = '” + password + "’ ";
System.out.println(sql);
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
return rs.next();
} catch (SQLException var11) {
var11.printStackTrace();
} finally {
JDBCUtiles.close(rs, stmt, conn);
}
return false;
} else {
return false;
}
}
public boolean login2(String username, String password) {
if (username != null && password != null) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = JDBCUtiles.getConnection();
String sql = “select * from account where name = ? and password = ?”;
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, password);
rs = pstmt.executeQuery();
return rs.next();
} catch (SQLException var11) {
var11.printStackTrace();
} finally {
JDBCUtiles.close(rs, pstmt, conn);
}
return false;
} else {
return false;
}
}
}
-
事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
-
操作:
-
开启事务
-
提交事务
-
回滚事务
-
使用
Connection
对象来管理事务
-
开启事务:
setAutoCommit(boolean autoCommit)
:调用该方法设置参数为false
,即开启事务 -
在执行
sql
之前开启事务 -
提交事务:
commit()
-
当所有sql都执行完提交事务
-
回滚事务:
rollback()
-
在
catch
中回滚事务
- 代码:
public class JDBCDemo3 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt1 = null;
PreparedStatement pstmt2 = null;
try {
//1.获取连接
conn = JDBCUtiles.getConnection();
//2.开启事务
conn.setAutoCommit(false);
//3.定义sql
String sql1 = “update account set money=money-? where id= ?”;
String sql2 = “update account set money=money+? where id= ?”;
//4.获取执行sql对象
pstmt1 = conn.prepareStatement(sql1);
pstmt2 = conn.prepareStatement(sql2);
//5.设置参数
pstmt1.setInt(1, 500);
pstmt1.setInt(2, 1);
pstmt2.setInt(1, 500);
pstmt2.setInt(2, 2);
//6.执行sql
pstmt1.executeUpdate();
//7.手动制造异常
int a = 131 / 0;
pstmt2.executeUpdate();
//8.提交事务
conn.commit();
} catch (SQLException throwables) {
//事务回滚
try {
if (conn != null) {
conn.rollback();
}
} catch (SQLException e) {
e.printStackTrace();
}
throwables.printStackTrace();
} finally {
JDBCUtiles.close(pstmt1, conn);
JDBCUtiles.close(pstmt2, null);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://i-blog.csdnimg.cn/blog_migrate/47e6fdd0d7a9c341b4a03c6497ff9587.jpeg)
独家面经总结,超级精彩
本人面试腾讯,阿里,百度等企业总结下来的面试经历,都是真实的,分享给大家!
Java面试准备
准确的说这里又分为两部分:
- Java刷题
- 算法刷题
Java刷题:此份文档详细记录了千道面试题与详解;
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
g src=“https://i-blog.csdnimg.cn/blog_migrate/47e6fdd0d7a9c341b4a03c6497ff9587.jpeg” alt=“img” style=“zoom: 33%;” />
独家面经总结,超级精彩
本人面试腾讯,阿里,百度等企业总结下来的面试经历,都是真实的,分享给大家!
[外链图片转存中…(img-Pj3dWLj6-1713296086533)]
[外链图片转存中…(img-e1kkd5rb-1713296086534)]
[外链图片转存中…(img-6mWMAZMh-1713296086534)]
[外链图片转存中…(img-908qCjhE-1713296086534)]
Java面试准备
准确的说这里又分为两部分:
- Java刷题
- 算法刷题
Java刷题:此份文档详细记录了千道面试题与详解;
[外链图片转存中…(img-7w0TJSFC-1713296086535)]
[外链图片转存中…(img-kUiIcksK-1713296086535)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!