java自学之路-day19

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java自学之路-day19相关的知识,希望对你有一定的参考价值。

Day19

JDBC

概述

l  Java数据库连接

l  是一种执行SQL语句的java API

l  可以为多种数据库提供统一访问

l  就是一组类和接口

l  是java访问数据库的规范

l  实现类由数据库厂商提供

l  JDBC需要连接驱动 驱动是两个设备要进行通信 该驱动就是实现类 有数据库厂商提供

l   

 

 

 

  1. src 是源代码
  2. 使用时是需要使用jar包

JDBC原理

l  是一种规范

l  是sun公司定义的类和接口

l  接口需要实现类 由数据库厂商提供

l  驱动也是类库 实现了sun公司规定的接口

l  学习重点在sun公司的接口和类 就是驱动类的父类 有了父类就知道了所有子类的方法

l  面向接口开发

 

准备数据

 

 

JDBC开发步骤

l  注册驱动

  1. 告知jvm使用的是哪一个数据库的驱动

l  获取连接

  1. 使用JDBC中的类 完成对mysql数据库的连接

l  获得语句执行平台

  1. 通过连接对象获取对SQl语句的执行者对象

l  执行sql语句

  1. 使用执行者对象 向数据库执行SQL语句
  2. 获取到数据库的执行后的结果

l  处理结果

 

l  释放资源 close

 

导入jar包

  1. 复制jar包到工程目录新建的一个lib文件夹
  2. Buildpath addbuildpath
  3.  

 

注册数据库驱动

  1. Java.sql包中有一个DirverManager类 这个类中有一个静态方法registerDriver就可以注册驱动 参数是Driver 对象

 

  1. 但是查看源码发现有一个静态代码块已经将驱动注册了 这样造成了一个问题重复注册

 

 

  1. 最好的方法是通过反射进行注册

 

这个方法是 可以将一个类加入到内存中并且创建一个本类对象 括号里写类的全名

获得数据库连接

  1. Java.sql包中有一个DirverManager类 这个类中有一个静态方法getConnection可以获取数据库连接 返回值是一个Connection接口的实现类
  2. 比较慢 因为需要连接tcp
  3. 示例

 

 

获取SQL语句执行者对象

  1. 通过获取到的connection对象,调用方法 creatStatement()获取Statement对象 将SQL语句发送到数据库
  2. 返回值是Statement接口的实现类对象
  3. 示例

 

执行SQL语句

  1. 通过执行者statement对象调用方法executeUpdate(String sql)
  2. 只能用来执行insert delete update
  3. 返回值是int 操作成功数据表多少行
  4. 示例

 

 

 

 

  1. 所有数据库的操作只有执行SQl语句不一样其他都是固定的格式
  2. 主要是查询的结果集
  3. 执行executeQuery方法执行查询语句 返回一个ResultSet 结果集对象
  4. 处理结果集需要用到ResultSet接口中的方法
  5. Next() 光标初始为第一行之前  调用一次将光标移动到数据的当前行 如果有结果就返回true  否则返回false 光标位于最后一行的后面

处理结果集

 

  1. 所以可以用遍历

只要next方法返回真那么就一直循环 直到返回值为假 即到了最后一行

  1. 使用getxxx可以获取各种类型的数据
  2. 示例

a)         方法可参数既可以写列的编号

b)         也可以写列名

c)         推荐使用列名 因为表可能随时改变

d)         可以使用 getObject 可以获取任何类型数据

 

释放资源

 

SQL注入攻击

l  用户登录

l  密码和账户和数据库中相同 就登陆成功

l   

 

l  账号和密码写死

 

l  密码账户有键盘录入

 

预防sql注入

l  利用Preparestatement接口的实现类

l  预编译防止注入 提高效率

l  是statement的子接口

l  实现类在数据库的驱动类中

l  利用connection的方法preparestatement获取实现类

 

l  全部采用问号占位符 使用set方法设置

 

l  获取结果集不用放sql

 

PreparedStatemen接口

l  修改表数据

 

l  查询表数据

 

  服务端电脑安装mysql

l  服务端电脑安装mysql管理软件 并连接数据库,创建一个数据库和表

l  在客户端能够ping 服务端ip

  1. 运行->cmd
  2. >ping  ip
  3. 检查是否能ping通
  4. 如果超时检查服务端网络是否开启了防火墙 如若开启了就关闭

l  设置两台电脑的IP设置在同一个网段

  1. 如:192.168.1.2 ,192.168.1.3。。。。。
  2. 子网:255.255.255.0 网关:192.168.1.1
  3. 如果是同一台路由器或者同一个网线就不用设置了
  4. 同一个WiFi也可以哦

l  在MySQL服务器上增加新用户,

在服务器端写入代码

grant select,delete,update,insert on 数据库名.* to ‘登录数据库账户名’@’客户端ip地址’identified by ‘登录数据库密码’;

 

l  在客户端上可以通过用户名 :xxx 密码为 xxx 对数据库xxx 进行操作!

 

 

l  删除增加的新用户的访问权限

Mysql > Revokeselect,delete,update,insert on 数据库名.* from’账户名@’客户端ip地址’;

JDBC工具类

l  可以方便别人直接获取数据库连接对象

l  避面重复写代码

l  示例

 

关闭

 

将表中数据存到对象中

l  示例

 

 

Properties配置文件

使用Properties配置文件

l  如果需要更改其他数据库连接

l  就需要用到配置文件存放驱动 url 用户名 密码

l  文件位置

  1. 最好放到src文件夹下
  2. 因为后期交付使用需要给bin目录
  3. 运行的时候ecplise会自动拷贝到bin目录下
  4. 有些会放到远程服务器下

l  文件名称

  1. 任意
  2. 但需要是properties后缀

l  文件内容

  1. 必须是键值对的形式
  2. 一行一组数据
  3. Key命名自定义 多个单词用“.”分隔
  4. Value值不支持中文
  5. 如果需要使用中文 将进行unicode转换

 

配置文件的创建和编写

 

加载配置文件

 

直接写文件名访问失败 加入src 交给Bin目录没有没有src 所以不能用这种方式加载

 

l  使用类的加载器

  1. 获得class文件对象
  2. 使用java.Lang包中Class类中的getClassLoader方法获取类的加载器
  3. 再用加载器的方法getResourceAsStream(文件名)
  4. 返回一个InputStream对象
  5. 加载bin目录下的文件

 

  1. 加载数据

 

DButils工具类

介绍

l  使用jdbc代码冗余多重复多

l  为了简化开发需要使用工具类

l  Apache commons项目的一个成员

l  DButils

l  目录

 

  1. Jar包
  2. 文档
  3. 源码
  4. 测试类jar包
  5. 测试类的源码
  6. 使用

导入jar包

 

l  三个核心功能

  1. QueryRunner 对sql语句进行操作
  2. ResultSetHandler 接口 如果查询数据库 怎么封装结果集
  3. Dbutils关闭资源和事务处理

l  Dbutils

  1. 线程安全
  2. 方法静态
  3. 负责关闭和事务处理

l  QueryRunner

  1. 执行sql
  2. 线程安全
  3. 构造方法有很多
  4. Query update方法

l  ResultSetHandler

  1. 处理结果集

事务处理

l  经典案例转账

  1. 利用数据库演示转账
  2. 两个账户
  3. 从账户1转向账户2一定金额
  4. 账户1加 账户2减
  5. 但是如果账户1不足额度 就会出现负数
  6. 因此需要将两个账户包装为一个事务
  7. 执行成功 就提交
  8. 执行失败 就回滚

 

QueryRuner类

这个不能用 因为不能使用占位符来防止SQL注入

l  需要使用这个,前面写占位符,后面设置占位符

 

l  示例

 

JavaBean类

l  就是自己写的一个普通的类 用于封装数据

l  需要实现序列化接口 将对象以流的形式写入到文件中

l  提供私有字段 private 类型 字段名

l  提供getter  setter方法

l  提供无参构造器

l  结果集处理需要使用到这个类

ResultSetHanndler接口

l  表示结果集处理方式的接口

l  每一个实现类都是一种数据查询后数据结果集的处理方式

l  所有实现类实现接口重写handle方法

l  使用QueryRunder中的query方法

 

 

l  实现类

 

l  示例

 

ArrayHandler

l  结果集的第一种处理方式

l  将结果集的第一行存储到对象数组中 Object[]

 

 

l  只存储第一行

 

l  如果没有结果集数组长度就是0

ArrayListHandler

l  结果集的第二种处理方法

l  将结果集的每一行封装到对象数组中

l  会出现很多对象数组  将数组放到集合中

l  返回值是一个List集合 集合中装的是对象数组

l   

 

l  如果没有结果集合长度就是0

BeanHandler

l  结果集第三种处理方法

l  将结果集第一行数据封装为javabean对象

l  构造方法传递参数 class文件的对象

l  还得加泛型<类名>

l  示例

 

l  没有结果集会返回null

 

l  封装成数据的类,必须有空参的构造 否则就会报异常

l  因为查询是封装对象调用的空参构造器 然后调用set方法设置成员变量的

 

BeanListHandler

l  将数据结果集的每一行数据封装成javabean对象

l  将多个javabean对象封装到list集合中

l  返回值是bean类泛型的List集合

l  构造方法参数是bean class文件的对象 泛型是bean类的名称

l  示例

 

 

ColumnListHandler

l  结果集第五种处理方法

l  将结果集指定列的数据存储到List集合

l  返回值是List集合 泛型是Object

l  构造器传递 可以是编号索引 列名 泛型是Object

l  最好写列名 比较好识别

l  示例

 

l  如果查询语句的没有指定列 结果集此时就会异常

ScalarHandler

l  结果集第六种处理方法

l  对于查询以后只有一个结果 将其放到对象中 一行一列

l  用聚合函数查询一共有多少列数据

 

MapHandler

l  结果集的第七种处理方法

l  将结果集第一行数据封装到一个map集合中

l  Map键列名 值这个列的数据

l  返回值是map集合 泛型是列名和值对应的类型

l  示例

 

 

MapListHandler

l  结果集的第七种处理方法

l  将结果集的每一行数据存储到map集合

l  Map集合过多存储到List集合

l  返回值是一个List集合

l  示例

 

 

 

 

连接池

引入

l  减少资源占用

l  数据库连接很频繁

l  很浪费资源

 

l  为了解决性能问题

l  采用连接池技术 共享Connection

l  不需要每次都创建连接和释放连接

l  并发很高 效率很高

概念

l  用池管理Connection

l  遮掩可以重复使用Connection

l  有了池 所以我们就不用自己来创建Connection

l  而是通过池来获取Connection对象

l  使用完Connection后调用Connection的close方法不会真正关闭

l  而是把连接归还给池

 

规范

l  连接池技术由第三方提供

l  Sun公司做了一个接口 用来规范连接池

l  DataSource接口

 

l  这样应用程序可以方便的切换不同厂商的连接池

l  常见的连接池DBCP apache的

l  还有X3P0

DBCP连接池

概述

l  开源的连接池

l  common成员之一

l  tomcat 

  1. Javaweb服务器
  2. 把Class文件放在tomcat软件中
  3. 此软件开启是会监听端口
  4. 用户端访问会监听到
  5. 内置了连接池

使用

l  Jar包

  1. Dbcp

 

  1. Pool

 

l  两个jar包相互依赖

Dbcp依赖pool中的class文件

BasicDataSource

l  继承DataSource接口

 

l  调用set方法设置连接参数

l  调用getConnection获取连接

l  示例

 

常见配置项

 

l  必须项

l  扩展项

  1. 最大连接数量 连接池最多能允许多少连接工作
  2. 最小空闲连接  没有用的连接叫空闲连接 比如10 如果剩余的连接数超过了10个设定空闲数 剩余的就不会被开启
  3. 最大空闲连接 允许空闲最多不能超过
  4. 初始化连接 第一次启动时开启多少连接

连接池工具类

l  示例

 

 

l  测试

不需要连接对象

 

以上是关于java自学之路-day19的主要内容,如果未能解决你的问题,请参考以下文章

java自学之路-day04

java自学之路-day10

java自学之路-day06

java自学之路-day11

java自学之路-day14

java自学之路-day16