JDBC
01. JDBC :java连接数据库技术的一种简称!提供了连接各种数据库的功能!数据持久化技术之一!
02.常用的JDBC API
DriverManager : 管理 JDBC驱动!(不同的数据库有不同的驱动包)
Connection : 连接数据库 DriverManager.getConnection(URL,UserName,PWD);
Statement,PreparedStatement : 执行sql语句
ResultSet: 处理结果集
增删改 都是执行 executeUpdate() 返回 int 类型的值!
查询 执行 executeQuery() 返回 ResultSet 类型的值!(结果集)
03. JDBC连接数据库的步骤
001.加载驱动
002.连接数据库
003.书写sql并执行
004.处理结果
005.释放资源
04.prepareStatement和Statement
01.Statement在创建对象的时候 不需要sql语句! 没有预编译功能!
prepareStatement需要sql语句! 有预编译功能!
02.Statement可以sql注入! 不安全! prepareStatement可以防止sql注入!
03.Statement执行效率低!
作业:
创建dog 和 master两个表 测试数据 每表3条 sql语句书写
-- 创建dog表
CREATE TABLE DOG(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '编号',
`NAME` VARCHAR(12) COMMENT '昵称',
health INT COMMENT '健康值',
love INT COMMENT '亲密度',
strain VARCHAR(20) COMMENT '品种'
)
-- 新增数据
INSERT INTO dog(NAME,health,love,strain) VALUES('小黑1',80,99,'拉布拉多');
INSERT INTO dog(NAME,health,love,strain) VALUES('小黑2',88,98,'单身狗');
INSERT INTO dog(NAME,health,love,strain) VALUES('小黑3',89,97,'小黑狗');
INSERT INTO dog(NAME,health,love,strain) VALUES('小黑4',78,96,'藏獒');
-- 创建主人表 master
CREATE TABLE MASTER(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '编号',
`NAME` VARCHAR(12) COMMENT '姓名',
`PASSWORD` VARCHAR(20) COMMENT '密码',
money INT COMMENT '元宝数'
)
-- 新增数据
INSERT INTO MASTER(NAME,PASSWORD,money) VALUES('主人1','admin1',5000);
INSERT INTO MASTER(NAME,PASSWORD,money) VALUES('主人2','admin2',6000);
01.主人登录功能?? 使用prepareStatement!
001.获取用户的输入
002.从数据库中获取数据
003.比对
004.给用户响应
02.主人的增删改查
03.宠物的增删改查
Dao模式:
起着转换器的作用:
01.能把对象保存到数据库中的行!
02.能把数据库中的行转换成对象!
目的: 简化我们的代码量,提高程序的移植性!
主要包含:
01.数据库连接类 提供数据库连接
02.实体类 包含属性和数据库中表的字段对应的类!
03.Dao接口 定义所有共同的方法,比如增删改查的模版
04.Dao实现类 实现接口中所有的方法
05.Dao的工厂类
实体类:
我们都是动物(类),存在的是 小猫,小狗。。。。。(对象)
对象通过 类 来创建自己的实例!
这个类 就是实体类!
实体类中, 有 动物的 属性 以及构成 和set get方法()
有动物睡觉 吃饭的 方法吗???
如果我们 把 睡觉 吃饭的方法 写在了 实体类中,
会发现 代码重复!!!
实现类:
因为 睡觉 吃饭 是一种 行为!功能!
应该定义在 一个接口中! 接口不能有具体的方法 实现,
所以 必须有一个实现类 来实现 接口中的方法!
实现步骤:
01.把类中 所有方法中的 数据库连接四要素 提取 出来!
02.提取公共的属性
Connection
PreparedStatement
ResultSet
03.又发现 释放资源的代码 重复 再次提取成公共的方法
我们现在只写了 有关于Master表的增删改查
请问 我们在写一个Dog表的增删改查
发现 我们的获取 连接 关闭连接 以及公共的属性 再次重复!
04. 提取成公共的BaseDao! 让Master Dog 继承BaseDao 这样来实现 代码的复用!
05.又发现 增删改查 代码 有点类似???
所有的增删改 都是执行 executeUpdate 返回int
所有的查询 都是执行 executeQuery 返回 ResultSet
有的sql语句没有参数 , 有些有!
参数 是 用户在 浏览器中 给我们的!
如果我们提取成 公共的增删改查 ! 所有的类 都会使用!
那么 我们知道 sql语句吗? 知道sql是否有参数吗?
/**
* 开始提取 所有类的 增删改 方法 executeUpdate
* @param sql :用户传递的sql语句
* @param params :用户sql语句中的参数! 因为我们不确定有没有参数,有几个参数???
* 所以使用...!
*
* update dog set name=? where id=?;
* 两个?放在Object数组中!
*
* 把数组 给 params(数组的操作)!
* delete from dog;
* 这时候只需要传递 sql语句! 还用参数params!
*
*
*/
public int executeUpdate(String sql, Object... params) {
int rowNum = 0; // 影响的行数
if (getConnection()) { // 如果有连接
// 创建执行sql的对象
try {
ps = connection.prepareStatement(sql);
if (params != null) { // 有参数? 有几个呀?
for (int i = 0; i < params.length; i++) {
/**
* 有几个参数 赋值 几次
* 知道参数的类型吗?所以setObject
* 为什么写i + 1 , ?是从1开始的!
*/
ps.setObject(i + 1, params[i]);
}
}
rowNum = ps.executeUpdate();// 没有参数的
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放资源
closeConnection();
}
}
return rowNum;
}
所有类的 查询 方法!
/**
* 开始提取 所有类的 查询 方法 executeQuery
* @param sql
* @param params
* @return ResultSet 结果集
*
* select * from dog
* select * from dog where id=?
*
*/
public ResultSet executeQuery(String sql, Object... params) {
if (getConnection()) { // 如果有连接
// 创建执行sql的对象
try {
ps = connection.prepareStatement(sql);
if (params != null) { // 有参数? 有几个呀?
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
}
rs = ps.executeQuery();// 没有参数的
} catch (SQLException e) {
e.printStackTrace();
} //之前有一个释放资源的 方法
}
return rs;
}
如果我们 把 释放资源写在这个通用的方法中!会报错!
为什么?
因为 使用完毕之后,rs关闭了!
那么我们在实现类中的rs就不能使用了!
所以 释放资源在实现类中书写!(查询完毕之后释放资源)
最后一个操作!!
把变量和参数 换成 对象! 提取成 javaBean---》实体类!
作业:
数据库的设置 用 sql语句 书写!
宠物商店 !!!!务必完成!!!!!!
MVC和三层的区别!
作者:Rick__想太多先森
出处:http://www.cnblogs.com/xtdxs/
注意:本文仅代表个人理解和看法哟!和本人所在公司和团体无任何关系!