Java Database Connectivity

SQL
   DQL 数据查询:select
   DDL 数据定义:create/drop
   DML 数据操作:增删改
  Java中的唯一的技术,连接不同的数据库

什么是JDBC
Java Database Connectivity

如何使用 JDBC(标准:接口,数据库厂商进行具体操作)
JAVA对于数据的CRUD(增删改查):使用语法进行操作

实现步骤(重要)
(固定死的)
1.注册驱动
    原因

    注册驱动的两种方式
    1. DriverManger.register(new Driver()),返回一个链接对象【Connection2. 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. 结果集中获取的数据是通过移动光标【next2. 光标最开始并没有指向数据
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),返回int5.释放资源
   结果集对象-->语句执行对象-->链接对象
    记住:先创建的对象释放





抽取工具类(采用的是单例模式)
      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>字节码创建的任意的



连接池
为什么需要连接池
连接对象是由数据库创建的,多人多次连接,增加数据库连接的速度 。缓解数据库创建链接对象。连接池中的对象可以被重复使用。连接池中存储多个连接对象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值