2023.3.29学习Java打卡
JDBC
JDBC(Java Databse Connectivity),Java-数据库连接,用Java语言操作数据库。
本质:是sun公司定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
-
使用JDBC步骤
- 导入驱动jar包
- 注册驱动
- 获取数据库的连接对象 Connection
- 定义sql语句
- 获取执行sql语句的对象Statement
- 执行sql,接收返回结果
- 处理结果
- 释放资源
-
DriverManager:驱动管理对象
-
功能:
-
注册驱动:告诉程序该使用哪一个程序jar包
-
static void registerDriver(Driver driver):注册与给定的驱动程序DriverManager。 写代码使用:Class.forName("com.mysql.cj.jdbc.Driver") #通过查看源码查看发现:在com.mysql.cj.jdbc.Driver类中存在静态代码块。
-
注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。
-
-
获取数据库连接
-
方法:static Connection getConnection(String url, String user, String password)
-
语法:jdbc:mysql://ip地址(域名) : 端口号 / 数据库名称
注:若连接为本机mysql服务器,且其默认端口为3306,则url可简写为jdbc:mysql:///数据库名。
-
-
-
Connection:数据库连接对象
-
功能:
-
获取执行sql的对象
1.Statement createStatement() 2.PrepareStatement prepareStatement(String sql)
-
管理事务:
1.开启事务:void setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务。 2.提交事务:void commit() 3.回滚事务:void rollback()
-
-
-
Statement:执行sql的对象
-
执行sql:
方法:
(不常用)1.boolean execute(String sql):可以执行任意的sql *******2.int executeUpdate(String sql):执行DML(增insert,删delete,改update)语句,DDL(create,alter,drop)语句←---不常用。这个返回值为int,是影响的行数,可以通过这个返回值行数的值DML语句是否执行成功。 *******3.ResultSet executeQuery(Strng sql):执行DQL(select查询)语句
-
练习:
-
-
ResultSet:结果集对象,封装
-
next():游标向下移动一行,判断当前行是否是最后一行末尾,如果是,则返回false,如果不是则返回true。
-
getxxx(参数)获取数据:
- xxx:代表数据类型,如int getInt() 、 String getString()
- 参数:
- Int:代表列的编号,从1开始,如getString(1)
- String:代表列的名称。如getDouble(”name“)
-
注意:
- 使用步骤
-
游标向下移动一行
-
判断是否有数据
while(rs.next()){ //获取数据 int id = rs.getInt(1); String name = rs.getString("name"); int age = rs.getInt(3); String email = rs.getString("email"); System.out.println(id + "---" + name + "---" + age + "---" + email); }
-
获取数据
-
- 使用步骤
-
练习:
- 查询demo02表的数据将其封装为对象,装载集合,返回,打印输出。
- 定义Demo类
- 定义方法 public List
findAll(){} - 实现方法 select * from demo01;
- 查询demo02表的数据将其封装为对象,装载集合,返回,打印输出。
-
-
抽取JDBC工具类:JDBCUtils
-
目的:简化书写
-
分析
- 注册驱动也抽取
- 抽取一个方法获取连接对象
- 保证工具类的通用性,不传参。
- 解决方法:定义配置文件(jdbc.properties),其中url=xxxx,user=xxx,password = xxx。
- 抽取方法释放资源
-
练习:通过键盘录入用户名和密码,判断用户是否登陆成功
select * from user where username = " " and password = ""
如果这个sql有查询结果,则成功,反之则失败
-
创建数据库表user
create table user(id int primary key auto_increment, username varchar(32), password varchar(32)); insert into user values (null, '张三', '123'); insert into user values (null, '李四', '1234'); insert into user values (null, '王五', '12356'); select * from user;
-
创建登录方法
-
接受输入数据,判断是否登录成功。
-
-
-
PrepareStatement:执行sql的对象
-
sql注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成一些安全性问题。
-
输入任意用户名,输入密码:a' or 'a' = 'a
-
select * from user where username = 'dasjdja' and password = ' a' or 'a' = 'a'
-
-
解决sql注入问题:使用PrepareStatement对象来解决
-
预编译的SQL:参数使用占位符?
-
步骤:
- 导入驱动jar包
- 注册驱动
- 获取数据库的连接对象 Connection
- 定义sql语句
- 注意:sql的参数使用?作为占位符。如:select * from user where username = ? and password = ?;
- 获取执行sql语句的对象PrepareStatement
- Connection.prepareStatement(String sql)
- 给?赋值:
- 方法:setxxx(参数1,参数2)参数1:?的位置编号,从1开始;参数2:?的值。
- 执行sql,接收返回结果,不需要传递sql语句了
- 处理结果
- 释放资源
-
注意:后期都会使用PreparedStatement来完成增删改查的所有操作
- 可以防止SQL注入
- 效率更高
-
-
JDBC控制事务:
- 事务:包含多个步骤的业务操作。如果这和业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
- 操作:
- 开启事务
- 提交事务
- 回滚事务
- 使用Connection对象来管理事务
- 开启事务:void setAutoCommit(boolean autoCommit)
- 在执行sql之前开启事务,也就是在获取连接后就要开启。
- 提交事务:void commit()
- 当所有sql都执行完提交事务
- 回滚事务:void rollback()
- 在catch中回滚事务
- 开启事务:void setAutoCommit(boolean autoCommit)