1.JDBC简介
JDBC= Java DataBase Connectivity,java数据库连接。
可用于执行SQL语句的Java API,JDBC提供了一种基准,据此可以构建更加高级的的工具和接口。
JDBC的唯一作用:与数据库交互。
已经包含在了JDK之中。
JDBC API是执行SQL语句的工具,JDBC允许对不同的平台,不同的数据库采用相同的编程接口来执行SQL语句。
3.JDBC的增强
目标:
1)预编译sql处理(防止sql注入)
2)批处理
3)插入数据
4)事物
5)JDBC综合练习
预编译SQL处理
JDBC驱动包
|--Statement 执行SQL命令
|--CallableStatement 执行存储过程
|--PreparedStatement 预编译SQL语句执行
使用预编译SQL语句的命令对象,好处:
1)避免了频繁SQL拼接(可以使用占位符)
2)可以防止sql注入
Statement不能防止SQL注入,connection的prepareStatement(sql)就可以防止sql注入
// 创建stmt对象
//stmt = connection.createStatement();
// 使用pstmt对象
pstmt = connection.prepareStatement(sql);
// 执行查询
set = pstmt.executeQuery();
存储过程:
DELIMITER $$
CREATE PROCEDURE proc_login()
BEGIN
SELECT * FROM admin;
END $$
eg:
// 创建执行过程的stmt对象
CallableStatement cstmt = con.prepareCall("CALL proc_login");
事务编程
事务:
事务指的是逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。
事务的特征(ACID):
原子性,是一个最小的逻辑操作单元。
持久性,事物一旦提交成功,对数据的更改会反映到数据库中。
隔离性,事物与事物之间是隔离的。
一致性,事物必须使数据库从一个一致性状态变换到另外一个一致性状态。
案例:
注意:创建一个connection的时候,会自动开启一个隐式事物。
注意:Navicat中如何修改已经建好的MySQL表的编码格式
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
需求:张三给李四转账
设计:账户表
技术:
|-- Connection
void setAutoCommit(boolean autoCommit);设置事物是否自动提交。 如果设置为false,表示手动提交事物。手动提交事务。
void commit(); 手动提交事务。
void rollback(); 回滚(出现异常的时候,所有已经执行成功的代码需要回退到事务开始之前的状态。)
savepoint setSavepoint(String name)
代码:
// 1.转账,没有使用事务
public void trans() {
String sql_zs = "UPDATE account SET money=money-100 WHERE accountName='zhangsan';";
String sql_ls = "UPDATE account SET money=money+100 WHERE accountName='李四';";
try {
System.out.println("0");
/* 第一次执行SQL */
con = JdbcUtil.getConnection(); // 开启隐式事物
con.setAutoCommit(false); // 设置手动提交
pstmt = con.prepareStatement(sql_zs);
pstmt.executeUpdate();
System.out.println("a");
/* 第二次执行SQL */
pstmt = con.prepareStatement(sql_ls);
pstmt.executeUpdate();
System.out.println("b");
} catch (Exception e) {
e.printStackTrace();
try {
con.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally {
try {
con.commit();
} catch (SQLException e) {
e.printStackTrace();
}
JdbcUtil.closeAll(con, pstmt, null);
}
}
综合案例:
需求分析:
登录,注册,注销
登录成功
显示所有员工
设计:
数据库设计:
Admin:存放所有的登录用户
Employee"存放所有的员工信息
系统设计:
a. 系统结构
分层:基于mvc模式的分层
b.项目用到的共用组件,类(JdbcUtil)
基于MVC的分层。
分析 -- 设计 -- 编码
4.JDBC优化
BeanUtils 需要拷贝jar包
BeanUtils组件,它依赖其他的jar包:
1) logging
2)日志
注意:一般缺少日志jar文件报这个错
BeanUtils的使用:
BeanUtils.copyProperty(admin, "userName", "jack");
BeanUtils.setProperty(admin, "age", 10); // 注意,这个值也可以是字符串“10”,会自动转为需要的类型。对于基本类型的拷贝(赋值),会自动进行类型转换。
这2个方法是一模一样的。作用是设置属性值。属性名一定是字符串的。
Map对象populate到对象中去:
/**
* map数据拷贝到对象中
*/
Admin adminMap = new Admin();
Map<String, Object> map = new HashMap<String, Object>();
map.put("userName", "jack1");
map.put("age", 20);
/**
* 注意:map 中的key要与javaBean的睡醒名称一致
*/
BeanUtils.populate(adminMap, map);
注意:BeanUtils不能自动转日期类型。
BeanUtils.copyProperty(admin, "birth", "1990-09-09");
5.元数据
1)简介
元数据:DataBaseMetaData
元数据:数据库,表,列的定义信息。
Connnection.getDatabaseMetaData()
DataBaseMetaData对象:
- 在jdbc中获取数据库的定义,例如:数据库,表,列的定义信息。
- 在jdbc中可以使用:数据库元数据,参数元数据,结果集元数据。
DatabaseMetaData使用:
http://blog.csdn.net/anxinliu2011/article/details/7560511
获取参数元素:
Connection con = JdbcUtil.getConnection();
// 获取数据库元数据
DatabaseMetaData metaData = con.getMetaData();
String sql = "SELECT * FROM dept where deptId = ? and deptName = ?";
PreparedStatement pstmt = con.prepareStatement(sql);
// 参数元数据
ParameterMetaData p_metaDate = pstmt.getParameterMetaData();
关于Dao操作的抽取
Dao操作通用的步骤:
1)获取连接
2)创建stmt
- 执行sql
a. 更新
b. 查询
4)关闭/异常
只有第3)步骤不一样,其他都是一样的。
所以想创建一个通用的dao:
a.更新
String sql = "select * from admin";
String sql = "select * from admin where id=? and pwd = ?";
public void update(String sql, ); //
b.查询