一、jdbc基本概念
jdbc : Java Database Connectivity
sun公司为了统一对数据库的操作,定义了一套api,称之为jdbc
这套api完全有接口组成,我们在编写程序的时候针对接口进行调用
这些接口交给数据库厂家去实现, 不同的数据库厂商会提供不同的实现类,这些实现类被我们称作数据库的驱动
二、实现jdbc程序
步骤:
1. 实验环境
建 user 表 user.sql
create database day12 character set utf8 collate utf8_general_ci;
use day12;
create table users(
id int primary key auto_increment,
name varchar(40),
password varchar(40),
email varchar(60),
birthday date
)character set utf8 collate utf8_general_ci;
insert into users(name,password,email,birthday)
values('zs','123456','zs@sina.com','1980-12-04');
insert into users(name,password,email,birthday)
values('lisi','123456','lisi@sina.com','1981-12-04');
insert into users(name,password,email,birthday)
values('wangwu','123456','wangwu@sina.com','1979-12-04');
2. 导入数据库的驱动
mysql-connector-java-5.0.8-bin.jar
3. 编程java程序
// 1. 注册数据库的驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
// 2. 建立与mysql数据库的连接 用到 jdbc api
String url = "jdbc:mysql://localhost:3306/day11";
String user = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, user, password);
// 3. 创建用于发送sql语句的 Statement 对象
Statement stmt = conn.createStatement();
// 4. 编写一句 sql
String sql = "select * from users";
// 5. 发送sql, 获得结果集
ResultSet rs = stmt.executeQuery(sql);
// 6. 处理结果集
System.out.println("id | name | password | email | birthday");
while(rs.next()) {
// 有第一行
int id = rs.getInt("id"); // 通过列名取值比较直观
String name = rs.getString("name");
String psw = rs.getString("password");
String email = rs.getString("email");
Date birthday = rs.getDate("birthday");
System.out.println(id + " | " + name + " | " + psw + " | " + email + " | " + birthday);
}
// 7. 关闭连接 释放资源
rs.close();
stmt.close();
conn.close();
三、jdbc程序详解
1. 注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
上面的语句会导致注册两次驱动
原因在于,查看Driver类的源码会发现在静态代码块中完成了注册驱动的工作,
也就是说注册驱动其实很简单,只需要加载驱动类即可
Class.forName(“com.mysql.jdbc.Driver”);
2. 创建数据库的连接
Connection conn = DriverManager.getConnection(url, user, password);
其中:
url, 相当于数据库的访问地址,程序员通过url指定需要访问的数据库
jdbc:mysql:[]//localhost:3306/test?参数名:参数值
其中jdbc为主协议,mysql为子协议,localhost为主机名,3306为端口号,test为数据库名
url的后面可以跟参数,常用的参数有:user=root&password=root&characterEncoding=UTF-8
如果url地址后面跟了user和password,创建Connection对象时将不必再次传入值
Connection conn = DriverManager.getConnection(url);
补充: 如果访问的localhost:3306,url 可省写为jdbc:mysql:///test
3. Connection 对象
Connection对象用于表示与某个数据库之间的连接,在程序中对数据库的所有操作都需要通过此对象来完成
常用方法有:
createStatement():创建向数据库发送sql的statement对象。
prepareStatement(sql) :创建向数据库发送预编译sql的PreparedStatement对象。
prepareCall(sql):创建执行存储过程的callableStatement对象。
setAutoCommit(boolean autoCommit):设置事务是否自动提交。
commit() :在链接上提交事务。
rollback() :在此链接上回滚事务。
4. Statement 对象
用于向数据库发送sql语句
execute(String sql):用于向数据库发送任意sql语句,但是返回值为boolean,不能满足我们的需求
executeQuery(String sql) :只能向数据发送查询语句,返回值是ResultSet 结果
executeUpdate(String sql):只能向数据库发送insert、update或delete语句
addBatch(String sql) :把多条sql语句放到一个批处理中。
executeBatch():向数据库发送一批sql语句执行。
5. ResultSet 对象
对于查询操作,该对象特别重要,因为它专门用于封装结果集
存储的形式就是一种表格的形式,同样是列+行,说白了就和我们在 dos 命令行窗口查询的结果一样
遍历方式:
一开始游标指向结果集第一行, 也就是表头
通过 next 将游标移向下一行, 如果没有下一行,该方法会返回false
获得当前行的数据需要调用get方法:
get(int index)获得第几列 列数从1开始
get(String columnName) 根据列名获得值 常用
数据库的数据类型与java中数据类型的对应关系
ResultSet对象的常用方法
next():移动到下一行
previous():移动到前一行
absolute(int row):移动到指定行
beforeFirst():移动resultSet的最前面。
afterLast() :移动到resultSet的最后面。
6. 释放数据库资源
由于数据库的资源非常宝贵,所以用完了一定要记得释放资源
特别是Connection对象,因为数据允许的并发访问连接数量往往都比较有限
在java程序中,我们应该将最终必须要执行的代码放到finally当中
释放资源的代码
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
四、jdbc实现crud
1. 编写程序对User表进行增删改查操作
2. 防止 sql 注入
在 service 层进行逻辑判断
使用PreparedStatement对象
3. 编写工具类对 jdbc 程序进行优化
将获得连接和释放资源的代码写到通用的工具类中
五、 jdbc案例
实现一个简单的员工信息管理系统,练习对员工表的crud
字段名 |
说明 |
类型 |
id |
编号 |
varchar(40) |
name |
员工姓名 |
varchar(20) |
gender |
性别 |
varchar(4) |
birthday |
出生日期 |
date |
idcard |
身份证号 |
varchar(20) |
degree |
学历 |
varchar(20) |
entrydate |
入职日期 |
date |
position |
部门 |
varchar(40) |
department |
职位 |
varchar(20) |
web开发的两种模式
model1: jsp+javabean 只适合小型应用
model2: servlet+jsp+javabean mvc
jsp 的作用只是显示的模板,所以在mvc中jsp应该禁止外界直接方法,藏在 web-inf下面
web应用的分层框架
案例实现步骤:
1. 搭建开发环境
1) 建工程 建包
2) 导入需要jar包
BeanUtils 相关jar包
jstl 标签
mysql 的驱动
3) 创建数据库和表
create database day12_employee;
use day12_employee;
create table employee
(
id varchar(40) primary key,
name varchar(20),
gender varchar(6),
birthday date,
idcard varchar(20),
degree varchar(20),
entrydate date,
department varchar(20),
position varchar(40)
);
2. 设计bean
Employee.java
3. 实现dao
4. 实现service
简单service 原封不动调用dao的方法
5. 实现web层
首页