两万字速通JDBC
目录
一、JDBC简介
1.1、JDBC概念
①JDBC就是使用Java语言操作关系型数据录的一套API
②全称是(Java DataBase Connectivity),叫Java数据库连接。
1.2、JDBC本质
①官方(sun公司)定义的一套操作所有关系型数据库的规则,即为接口。
②各个数据库厂商去实现这套接口,提供数据库驱动jar包。
③我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
1.3、JDBC好处
①各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发不同的代码
②可随时替换底层数据库,访问数据库的Java代码基本不变
1.4、关系图示:
1.5、 MySQLjar包下载地址
一般选择独立于平台的这个选项
①创建新的项目
②之后再建立一个模块
③在新建的的jdbc-demo模块中创建一个lib目录,将mysql的jar包复制粘贴到此处
④将刚才导入的jar包设置作用范围(右键jar包)
⑤在src下创建一个类
⑥ 类中:
数据库之前:
运行结果:
运行之后数据库:
一、DriverManager
DriverManager(驱动管理类)作用:
1、注册驱动
2、获取数据库连接
1、注册驱动:
注册驱动的书写方法,表面上没有使用 DriverManager类,选中Driver,ctrl+b看源码可知
它使用了 DriverManager.registerDriver()的方法
在MySQL5之后的驱动包,可以省略注册驱动的步骤
自动加载jar包中的META-INF/services/java.sql.Driver文件的驱动类
2、获取连接
static Connection getConnection(String url,String user,String password)
参数
1、url:连接路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2....
举例:jdbc:mysql://127.0.0.1:3306/db1(本机127.0.0.1,本机域名:localhost)
细节: 如果连接的是本机mysql服务器,并且mysql默认端口号是3306 ,则url可以简写为:jdbc:mysql://数据库名称?参数键值对如:jdbc:mysql:///db1
配置userSSL=false参数,禁用安全连接方式,解决警告提示
2、user:用户名
3、password:密码
解决警告提示:
?userSSL=false
二、Connection
Connection(数据库连接对象)作用:
1、获取执行SQL的对象
2、管理事务
2.1、获取执sql对象
- 普通执行SQL对象
Statement createStatement()
- 预编译SQL的执行SQL对象:防止SQL注入
PrepareStatement prepareStatement(sql)
- 执行存储过程对象
CallableStatement prepareCall(sql)
2.2、事务管理
2.2.1、mysql事务管理
开启事务:BEGIN;/START TRANSACTION(start transaction)
提交事务:COMMIT;
回滚事务:ROLLBACK;
(MySQL默认自动提交事务)
JDBC事务管理:
Connection接口中定义了3个对应的方法
开启事务:setAutoCommit(boolean autoCommit);true为自动提交事务,false为手动提交事务(开启事务)
提交事务:commit()
回滚事务:rollback()
2.2.2、演示jdbc的事务
复制前面弄过的类到包下
运行之前数据库emp表:
运行结果:
运行之后数据库emp表:
try之中的发生了异常 ,就会 被catch捕获,发生回滚,回滚到还没有开启事务之前,就是数据没有修改之前,若是没有用事务,就会导致可能一个成功一个失败,这是我们不愿意看到的。 启用了事务,用了回滚事务,可以保证多个事务要么同时成功,要么同时失败。
三、Statement
Statemen作用:
3.1、执行sql语句
int executeUpdate(sql): 执行DML(对数据的增删改)、DDL(对表和库的增删改)语句
返回值:(1)DML语句影响的行数(2)DDL语句执行后,执行成功也可能返回0
ResultSet executeQuery(sql):执行DQL(对数据的查询操作)语句
返回值:ResultSet结果对象
四、ResultSet
ResultSet(结果集对象)作用:
1.封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql):执行DQL语句,返回ResultSet对象
获取查询结果
boolean next():(1)将光标从当前位置向前移动一行(2)判断当前行是否是有效行
返回值:当前行有数据返回true,当前没数据返回false。
xxx getXxx(参数):获取数据
解释:xxx表示数据类型;如int getInt(参数);String getString(参数);
参数:对于int是列的编号,从1开始,对于String是列的名称。
使用步骤:
1、游标向下移动一行,并判断该行是否有数据:next()
2、获取数据:getXxx(参数)
示例:
实例:
数据库中emp表
运行之后:
ResultSet案例
需求:查询account账户数据,封装为Account对象中,并且存储到ArrayList集合中
创建一个pojo包,用来存放对象的。
创建了一个类,提供getSet方法
jdbc包下创建的类中
运行结果:
五、PreparedStatement
5.1、PreparedStatement作用:
1、预编译SQL语句并执行:预防SQL注入问题
5.2、SQL注入
SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
演示普通登录:
首先数据录kc_db1下的emp表为:
运行结果:
输入其他(不成功的原因是数据库中没有账号密码为这个的):
5.2.1、 sql注入演示:
对于这条sql语句来说不点在于密码,账号任意
运行结果:
这条SQL语句是:select *from emp where ename='随便写的名'and password=' ' or '1'='1'
sql注入的本质就是改变原有的SQL语句,加入or之后1=1恒为真,所以这条语句就是true
5.3、PreparedStatement解决SQL注入
①获取PreparedStatement对象
②设置参数
PreparedStatement对象:setXxx(参数1,参数2):表示给参数1(?的位置)赋值为参数2
Xxx:数据类型;任意setInt(参数1,参数2)
参数:
- 参数1:表示?的位置编号,从1开始
- 参数2: ?的值
③执行sql
executeUpdate();/excuteQuery();括号内不需要传递sql。
创建类:
运行结果:
这样就防止了sql注入,setXxx会对传入的参数会进行转义,不会拼接成字符串而是\' or\ ' 1\' = \' 1\'
输入正确的:
5.4、PrepareStatement原理
PrepareStatement好处:
1、预编译SQL,性能更高
2、防止sql注入。
my.ini配置文件可以看到日志
预编译功能默认关闭
①:PreparedStatement预编译功能开启:userServerPrepStmts=true
在sql语句?之后书写参数
开启就会要prepare预编译:
关闭之后就没有Prepare阶段
六、数据库连接池简介
①数据库连接池是个容器,负责分配管理数据库连接(Connection)
②他允许应用程序重复使用一个现有的数据录连接,而不是再重新建立一个(其实就是提前建立好连接之后直接用)
③释放空闲时间超过最大空闲时间的数据库链接来避免因为没有释放数据库连接而引起的数据库连接遗漏
6.1、数据库连接池优点
①资源重用(用完放回,而不释放)
②提升系统的响应速度(提前申请好了,要用是直接重连接池拿即可)
③避免数据录连接遗漏(某一资源超过最大时间强制会放回)
6.2、数据录库连接池实现
标准接口:DataSource
官方(SUN)提供的数据库连接池标准接口,由第三方组织实线这个接口
功能:获取连接
常见的数据库连接池:
DBCP
C3P0
Druid(德鲁伊):Druid连接池是阿里巴巴开源的数据库连接池项目,功能强大,性能优秀,是Java语言最好的数据库连接池之一。
6.3、Driud使用步骤
1、导入Driud的jar包
2、定义配置文件
3、加载配置文件
4、获取数据库连接池对象
5、获取连接
1、导入Druid的jar包,直接赋值jar包到lib目录下即可
选中jar包右键选择添加库,选择jar的作用范围为模块即可
2、定义配置文件druid.properties
内容一般为:
直接赋值刚才写的配置文件druid.properties复制到src下
类下:
运行结果:
七、完成商品品牌数据的增删改查操作
查询:查询所有数据
添加:添加品牌
修改:根据id修改
删除:根据id删除
准备环境:
数据库表tb-brand
实体类Brand
测试用例
表的信息
整列编辑:alt+鼠标左键
快捷生成方法:alt+insert
1、查询所有
在pojo包下创建一个类(pojo就是用来存放对象的Brand):
因为status是状态0或1,如果我们弄int类型,默认值是0,而用Integer包装类默认值则是null,符合我们的要求。
新建一个example创建一个BrandText类
运行结果:
2、增加数据
乱码问题:
我们运行之后发查询数据库发现乱码了,此时说明编码不一致,只需要在配置文件druid.properties中加入:
加完之后运行:
3、修改数据
运行结果:
数据库中的数据变化:
4、删除数据
运行结果:
数据库对比图;
后面也可以通过前端回传数据到后端接收来使用数据
- 点赞
- 收藏
- 关注作者
评论(0)