JDBC自学笔记
教程在这里->https://www.bilibili.com/video/BV1eJ411c7rf?p=1
代码在这里->这里
资料,详细笔记,jar包等等在这里:
链接:https://pan.baidu.com/s/14gZhUeHLTomCMd6QELdqbA
提取码:3iqf
疯狂表白康康老师!!!!
自己记的笔记很零散,主要是敲代码为主。
目录:
这个部分的学习代码我放到了github中的learn的jdbclearn中
技术体系
HTML:显示
XML:一般用在配置文件
Servelt:java代码。获取请求,处理请求,响应
JSP:动态页面展示
Ajax:异步请求
JSON:实质上是字符串
JDBC概述
JDBC是独立于特定数据库管理系统,通用的SQL数据库存取和操作的共同接口(一组API)
JDBC编写步骤
IDEA中导入jar包,在项目文件夹下创建lib文件夹,导入jar,然后右键add as lib
详情见代码:(共有五种方式在connection文件中)
使用PreparedStatement实现CRUD操作
操作访问数据库
这个sql注入例子就是把一个and的关系修改为了or的关系,并且最后一个1=1永远成立。
所以Statemen具有很严重的弊端,我们不详细展开,使用PrepareStatement可以避免这种情况,所以我们具体讲解这个。
插入:
通用增删改
注意:当我们的表名使用关键字(不建议)时,我们需要添加单引号,例如,否则报错
注意:如果JDBC插入中文但是显示为问好,那么需要修改配置文件
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
查询:
ORM
因为blob类型最大可以到4G所以我们使用文件类型来存储
查询固定一个表
当然为了获取不确定个数的值,并且返回到对象中,我们需要使用到元数据,和反射来解决其中的问题
元数据:用来获取到我们需要的数值和对应的类型
反射:用来动态的赋值
注意:创建类的属性名需要和数据库表中的对应属性名相同
如果不同会出现以下问题:
当然可以解决这个问题:
1.在sql语句中起别名
2.不要使用getColumnName,而是使用getColumnLabel
如果没起别名那么getColumnLabel对应的就是原名称
为什么使用通配符可以防止sql注入问题?
在于:预编译,也就是这个sql语句已经执行过了,其中的逻辑(与或非)已经确定,我们只是需要把不确定的地方在后面进行填充。
使用executeUpdate返回的是int类型数据,我们可以使用这个来判断是否成功操作。
查询任意表中一个数据通用操作:
使用案例:
查询任意表中多个数据通用操作:
使用PreparedStatement好处
使用blob类型数据
数据库事务
数据一旦提交无法回滚
查看数据库隔离级别
设置数据隔离级别
避免脏读:
创建DAO层,并且相关接口实现类
基础baseDAO层,表示所有DAO都要使用的通用方法,其他内容都继承这个基础DAO实现相关操作,Impl
测试dao层
idea中创建测试
数据库连接池
java中的内存泄漏:表示java中的对象不能被回收的问题。
C3P0 (P47)
当然我们需要把数据库连接池的建立放到外面,因为我们只需要创建一个连接池即可。
DBCP (P49)
配置文件
真正的使用:
但是同样的问题,我们数据库连接池只需要创建一次就可以了,但是这个配置需要我们的pros.load(is),不能提到方法外,所以我们使用静态代码块,随着类的加载而加载,并且·只执行一次。
当有多步操作,并且只需要执行一次的时候我们可以考虑到静态代码块!
Druid (p50)
我们需要使用的是创建连接使用的用户名是username不是name
Apach-DBUtils实现CRUD
这个接口的出现是因为我们查询返回的时候会有很多重的情况,所以我们创建接口来承接我们各种不同的返回的情况,例如如果我们需要的是返回单个数据,那么我们可以使用BeanHandler
ScalarHandler用于查特殊值
如何替换jar包
点击工程右键:
remove
idea版: