Java数据库连接技术:通过Java程序从数据库中把相应的数据提取到java程序中
1.JDBC概念
2. JDBC的步骤
1) 导入数据驱动jar包
① 右键项目名称/新建一个文件夹folder,名字叫lib
② 把*.jar包copy到lib目录下
③ 右键*.jar/Build path/Add Build Path 把*.jar加入到项目构建路径中
2) JDBC执行过程
通过反射类加载classforname()把mysql提供的驱动类注册到java里面去
3) JDBC-CRUD操作
① insert、update、delete语句执行过程一样
② select语句需要处理ResultSet结果集
③ 资源的关闭流程
在try…cathc…finally中确保所有的资源都去关闭一次,关闭顺序,后进来的先关闭
3. ResultSet数据
元数据:描述数据的数据
Mysql默认数据:用来存储和描述用户创建的数据信息(元数据库)
对rs结果集进行描述的相应数
getColumnClassName():包路径
getCatalogName():数据库的名字
getColumnCount():列数
getColumnLabel():id
getColumnName():sid
getColumnType():int
getColumnTypeName():INTEGER
4. PreparedStatement对象
① sql注入
在传入到sql参数的值中恶意加入相应的sql不能识别的字符导致程序运行时出错
② Statement对象分析
此对象执行sql中的参数只能随着sql语句一起赋值,只能执行一个完整的sql语句。当sql中出现了异常字符此对象当做sql中的一个字符处理,影响sql语句的正常执行。
此对象不能防止sql注入,安全性相对低
此对象不会缓存执行计划,执行性能相对较低
③ PreparedStatement对象分析
此对象创建的同时构建sql语句,sql语句的参数通过占位符(?)的方式进行说明,并无需传入实际参数值,可通过对象的set方法对占位符参数进行赋值,赋值时只会把传入的值当做sql中的参数值处理,不会把直接插入到sql语句中,防止异常字符插入到原始sql语句中,破坏sql结构。
此对象能够防止sql注入,安全性相对较高
在创建对象时根据传入的sql语句进行预编译(创建当前sql的执行计划,sql有哪些条件,查询或修改的字段….),执行计划会被保存在此对象中,下一次如果有同样的sql执行,这无需重新编译(执行计划),直接运行。当前计划可以被多次高效执行。
5. JDBC工具类封装
6. 单例设计模式
只对外创建一个实例
7. 属性文件的封装---数据库的优化
数据库的配置文件:databases.properties,不用修改源代码
通过系统全局配置文件配置系统中相应参数
通过java提供的Properties类进行属性文件的加载
过程:
① 在src目录下(classes目录)创建一个属性文件config.properties
② 创建一个Config.java类,加载属性文件并对外提供属性值
③ 项目通过Config类调用其对外提供的属性获取属性值
DAO模式(中转器)--数据库数据封装为对象数据
1.减少代码量,解决重复的工作,减少代码冗余
2.方便后期维护
根本思想:将数据访问 数据封装 方法处理分开
目的:方便维护,减少代码冗余
-1.创建实体类( 负责数据封装)
将数据库数据封装为对象数据
-2.创建对应实体类的接口(xxxxDAO)
提供必需实现的方法
-3.实现对应类的接口方法(xxxxDAOImpl)
xxxxDAOImpl implements xxxxDAO
8. JDBC的crud操作的封装
需求:对表的修改操作非常频繁,如有几十张表的操作
是否可以把所有的修改操作封装成一个函数?
查询是否也可以封装一个方法:对任意表都可以查询
先想思路…
1) 修改操作的封装
① 分析
要的结果:int 对表影响的记录条数
int I = pstmt.executeupdate();
创建pstmt对象
Pstmt = Conn.prepareStatement(sql) // sql中参数 可变长参数 Object
给sql参数赋值
Pstmt.setxxx(name,value)
② 实现
2) 查询操作的封装
需求:能够对任意表的查询,返回List<T>
① 分析
要的结果:List<T> list
List.add(Object)
While(rs.next()){
// 获取每一行数据
// 封装成object
问题:如何把值复制给对象对应的属性 BeanUtils
}
Rs = pstmt.executequery();
得到rs对象和修改的封装一致