SQL
DQL 数据查询:select
DDL 数据定义:create/drop
DML 数据操作:增删改
Java中的唯一的技术,连接不同的数据库
什么是JDBC
Java Database Connectivity
如何使用 JDBC(标准:接口,数据库厂商进行具体操作)
JAVA对于数据的CRUD(增删改查):使用语法进行操作
实现步骤(重要)
(固定死的)
1.注册驱动
原因
注册驱动的两种方式
1. DriverManger.register(new Driver()),返回一个链接对象【Connection】
2. Class.forName(Driver类的完全限定名)(经常使用)
区别
1. 第一个会注册两次
2.
2.获取连接
DriverManager.getConnection(url,username,password)
url:
jdbc:mysql://ip:3306/数据库名
本机上 jdbc:mysql:///数据库名
3.获取语句执行对象【Statement对象,预编译对象(大量使用)】
statement对象
连接对象.createStatement(),返回一个Statement对象
Sratement对象
使用查询的对象的注意点
1. 结果集中获取的数据是通过移动光标【next】
2. 光标最开始并没有指向数据
3. 当next返回为false的时候就代表结果已经到达最后一行
4. 使用while循环迭代出每一行的数据
while(结果集对象.next){获取数据}
获取每一行中每一列的数据的方式
1. get指定类型(列下表/列名)
类型支持的基本数据类型以及Object 1.1 使用下标
注意使用的时候是从第一行数据开始的
1.2 使用列名:更加的便捷,列会随着查找的列的顺序而发生改变,但是列名更 加精确不会更改
新增 给表中添加数据
1. 自增的数据不需要设置值 executUpdatd 更新表
2. 有默认值的也可以不添加值
4.执行SQL语句
DQL:
executeQuery(sql),返回一个结果集【ResultSet】
DML/DDL
executeUpdate(sql),返回int值
5.释放资源
结果集对象-->语句执行对象-->链接对象
记住:先创建的对象释放
抽取工具类(采用的是单例模式)
1. 重复使用的效果,减少代码的重复输入
1. 需要完成的功能
1. 注册驱动(执行一次,静态代码块 不使用也会加载)
2. 获取连接
3. 释放资源
4. 解决硬编码
1. 传统的IO
2. 使用字节码(推荐使用字节码线程的使用方式)
3. 使用类加载器
2. 做成工具类的方式
1.
预编译对象
链接对象
DAO
三层架构
出现的原因:
所有的代码写在一个包中,后期维护比较困难,为了分类:可以快速找到自己需求的东西,降低耦合度(耦合:对象与对象之间的依赖关系。)
DAO:( 泛指三层的操作,不管是业务多么复杂也只是三层)
界面层
业务逻辑层
数据访问层
操作数据库
1. domain 包 普通类:model层(不属于任何一层)
2. dao包 :接口
定义接口的原因:减少代码的冗余度,使代码更加规范
3. 接口的实现包
DAO建表
需求:做一个登录
在数据库中新建一个表
新建一个domian 包
新建一个Users的类
使用包装类
字段的顺序和表格中的列的顺序尽量保持一致
案例:实现 登录的功能
1. SQL注入
'or 1= 1 or'
2. 登录功能实现(本质是在数据库中查询其中是否存在)
方式一:select count(*) from users where username =? and password=?
缺点:不能查询出用户的相关信息,不能判断用户名错误还是密码错误
方式二:select *from user where username= ? and password=?
缺点:不能判断是用户名错误还是密码错误
方式三:select*from users where username= ?
可以显示用户信息,以及判断是密码还是用户名错误:前提用户名唯一
预编译对象和Statement对象的区别
1. Statement对象在创建的时候没有SQL语句,预编译对象是有的
2. 预编译对象发送的是参数化SQL语句,Statement对象发送的是SQL语句
3. 预编译对象实际上是不需要进行字符串的拼接的
4. 预编译对象可防止SQL注入
5.预编译对象比Statement对象执行更加快
原因在数据库中进行sql语句的操作的时候会将不同的语句加载查询,当发现语句是重复的时候就会将语句直接使用,例如预编译对象在进行查询的id时候是将其具体值设置为?,当再次查询其他id时,已经加载了这句查询语句,所以就不会在进行加载。Statement语句每改变一个直就是改变一次查询语句,所以要更加的快速一点[MySQl 不支持该效果]
参数化SQL以及普通的SQL的区别
普通的SQL中语法和值是在一起的:select*from tablename where id = 1;
参数化的SQL将语法和值进行分离:select*from tablename where id = ?
开发过程中使用参数化的SQL语句,更加安全
如何修改SQL中的值
预编译对象去设置参数的值,set指定类型[一般使用Object](参数下标,值)下标从一开始
MySQL中的事务(同生共死)
ACID原则
数据库中事务正确执行的四个基本的步骤
原子性(Atomicity)全部完成,或全部不完成
一致性(Consistency)状态保持一致,事务是有保护性以及不变性的
隔离性(Isolation)同一时间内仅有一个请求作用于同一份数据
持久性(Durablity) 持久存在于数据库当中,数据不会进行回滚
Java中的事务的操作(在连接对象中执行 )
所有的SQL语句都是在一个连接对象中,默认状态下,每一条SQL语句都是一个独立的事务,取消当前的连接对象中执行的SQL的事务的状态
1. 开启事务
2. 提交事务
3. 回滚事务
开启事务:setAutoCommit(false)
提交事务:commit
回滚事务
原因:在开启事务以后进行操作的的SQL语句update以后的数据是在内存当中暂时存放的,不管是否是可以成功执行到commit语句,但是都已经存在于内存中,在下一次正确使用的时候会被多次更新。回滚就是将操作失败的语句返回到没有修改以前的数据。
优化查询
启用事务需要解决的问题
1. 返回的结果类型不一致(泛型得使用)
2. SQL语句不一样
3. SQL语句中的参数不是一样的
将结果集中的数据快速封装到对象中去
BeanUtils.populate(对象,Map集合的数据) 第三方的jar包
将集合中的数据封装到一个对象的原理
根据map中的key和class类中的属性的名称保持一致,其中名称实际上是指get/set方法之后名称保持一致(字段名同一保持小写)
元数据的概念
一些概念的基本构成要素
数据库元数据:当前数据库的信息 通过连接对象.getMetaData()
参数元数据:参数化SQL 预编译对象.getParameterMetaData()
getParameterCount 获得参数个数
结果集数据:ResultSet结果集
预编译对象.getMetaData()
结果集对象.getMetaData()
将多条数据封到一个Map中,一条数据对应一个map集合
需要解决的问题
1. SQL语句不一样 返回参数传递
2. 参数不一样 可变参数
3. 返回类型不一样 泛型[任意类型的数据都可以进行传递]、字节码对象[可以直接创建对象]
pulic<T> 名字(String sql,Class<T> t,Object...args){
}
Class<T>字节码创建的任意的
连接池
为什么需要连接池
连接对象是由数据库创建的,多人多次连接,增加数据库连接的速度 。缓解数据库创建链接对象。连接池中的对象可以被重复使用。连接池中存储多个连接对象。
Java Database Connectivity
最新推荐文章于 2024-01-25 15:12:34 发布