java自学之路-day19
Day19
JDBC
概述
l Java数据库连接
l 是一种执行SQL语句的java API
l 可以为多种数据库提供统一访问
l 就是一组类和接口
l 是java访问数据库的规范
l 实现类由数据库厂商提供
l JDBC需要连接驱动 驱动是两个设备要进行通信 该驱动就是实现类 有数据库厂商提供
l
- src 是源代码
- 使用时是需要使用jar包
JDBC原理
l 是一种规范
l 是sun公司定义的类和接口
l 接口需要实现类 由数据库厂商提供
l 驱动也是类库 实现了sun公司规定的接口
l 学习重点在sun公司的接口和类 就是驱动类的父类 有了父类就知道了所有子类的方法
l 面向接口开发
准备数据
JDBC开发步骤
l 注册驱动
- 告知jvm使用的是哪一个数据库的驱动
l 获取连接
- 使用JDBC中的类 完成对MYSQL数据库的连接
l 获得语句执行平台
- 通过连接对象获取对SQl语句的执行者对象
l 执行sql语句
- 使用执行者对象 向数据库执行SQL语句
- 获取到数据库的执行后的结果
l 处理结果
l 释放资源 close
导入jar包
- 复制jar包到工程目录新建的一个lib文件夹
- Buildpath addbuildpath
注册数据库驱动
- Java.sql包中有一个DirverManager类 这个类中有一个静态方法registerDriver就可以注册驱动 参数是Driver 对象
- 但是查看源码发现有一个静态代码块已经将驱动注册了 这样造成了一个问题重复注册
- 最好的方法是通过反射进行注册
这个方法是 可以将一个类加入到内存中并且创建一个本类对象 括号里写类的全名
获得数据库连接
- Java.sql包中有一个DirverManager类 这个类中有一个静态方法getConnection可以获取数据库连接 返回值是一个Connection接口的实现类
- 比较慢 因为需要连接tcp
- 示例
获取SQL语句执行者对象
- 通过获取到的connection对象,调用方法 creatStatement()获取Statement对象 将SQL语句发送到数据库
- 返回值是Statement接口的实现类对象
- 示例
执行SQL语句
- 通过执行者statement对象调用方法executeUpdate(String sql)
- 只能用来执行insert delete update
- 返回值是int 操作成功数据表多少行
- 示例
- 所有数据库的操作只有执行SQl语句不一样其他都是固定的格式
- 主要是查询的结果集
- 执行executeQuery方法执行查询语句 返回一个ResultSet 结果集对象
- 处理结果集需要用到ResultSet接口中的方法
- Next() 光标初始为第一行之前 调用一次将光标移动到数据的当前行 如果有结果就返回true 否则返回false 光标位于最后一行的后面
处理结果集
- 所以可以用遍历
只要next方法返回真那么就一直循环 直到返回值为假 即到了最后一行
- 使用getxxx可以获取各种类型的数据
- 示例
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
- 运行->cmd
- >ping ip
- 检查是否能ping通
- 如果超时检查服务端网络是否开启了防火墙 如若开启了就关闭
l 设置两台电脑的IP设置在同一个网段
- 如:192.168.1.2 ,192.168.1.3。。。。。
- 子网:255.255.255.0 网关:192.168.1.1
- 如果是同一台路由器或者同一个网线就不用设置了
- 同一个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 文件位置
- 最好放到src文件夹下
- 因为后期交付使用需要给bin目录
- 运行的时候ecplise会自动拷贝到bin目录下
- 有些会放到远程服务器下
l 文件名称
- 任意
- 但需要是properties后缀
l 文件内容
- 必须是键值对的形式
- 一行一组数据
- Key命名自定义 多个单词用“.”分隔
- Value值不支持中文
- 如果需要使用中文 将进行unicode转换
配置文件的创建和编写
加载配置文件
直接写文件名访问失败 加入src 交给Bin目录没有没有src 所以不能用这种方式加载
l 使用类的加载器
- 获得class文件对象
- 使用java.Lang包中Class类中的getClassLoader方法获取类的加载器
- 再用加载器的方法getResourceAsStream(文件名)
- 返回一个InputStream对象
- 加载bin目录下的文件
- 加载数据
DButils工具类
介绍
l 使用jdbc代码冗余多重复多
l 为了简化开发需要使用工具类
l Apache commons项目的一个成员
l DButils
l 目录
- Jar包
- 文档
- 源码
- 测试类jar包
- 测试类的源码
- 使用
导入jar包
l 三个核心功能
- QueryRunner 对sql语句进行操作
- ResultSetHandler 接口 如果查询数据库 怎么封装结果集
- Dbutils关闭资源和事务处理
l Dbutils
- 线程安全
- 方法静态
- 负责关闭和事务处理
l QueryRunner
- 执行sql
- 线程安全
- 构造方法有很多
- Query update方法
l ResultSetHandler
- 处理结果集
事务处理
l 经典案例转账
- 利用数据库演示转账
- 两个账户
- 从账户1转向账户2一定金额
- 账户1加 账户2减
- 但是如果账户1不足额度 就会出现负数
- 因此需要将两个账户包装为一个事务
- 执行成功 就提交
- 执行失败 就回滚
QueryRuner类
l
这个不能用 因为不能使用占位符来防止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
- Javaweb服务器
- 把Class文件放在tomcat软件中
- 此软件开启是会监听端口
- 用户端访问会监听到
- 内置了连接池
使用
l Jar包
- Dbcp
- Pool
l 两个jar包相互依赖
Dbcp依赖pool中的class文件
BasicDataSource
l 继承DataSource接口
l 调用set方法设置连接参数
l 调用getConnection获取连接
l 示例
常见配置项
l 必须项
l 扩展项
- 最大连接数量 连接池最多能允许多少连接工作
- 最小空闲连接 没有用的连接叫空闲连接 比如10 如果剩余的连接数超过了10个设定空闲数 剩余的就不会被开启
- 最大空闲连接 允许空闲最多不能超过
- 初始化连接 第一次启动时开启多少连接
连接池工具类
l 示例
l 测试
不需要连接对象