一、jdbc基本概念
jdbc : Java Database Connectivity
sun公司为了统一对数据库的操作,定义了一套api,称之为jdbc
这套api完全由接口组成,我们在编写程序的时候针对接口进行调用
这些接口交给数据库厂家去实现, 不同的数据库厂商会提供不同的实现类,这些实现类被我们称作数据库的驱动
二、实现jdbc程序
步骤:
1. 实验环境
建 user 表 user.sql
createdatabase day12 character set utf8 collate utf8_general_ci;
use day12;
createtable users(
id int primary key auto_increment,
name varchar(40),
password varchar(40),
email varchar(60),
birthday date
)characterset utf8 collate utf8_general_ci;
insert intousers(name,password,email,birthday)
values('zs','123456','zs@sina.com','1980-12-04');
insertinto users(name,password,email,birthday)
values('lisi','123456','lisi@sina.com','1981-12-04');
insertinto 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(newcom.mysql.jdbc.Driver());
// 2. 建立与mysql数据库的连接 用到 jdbc api
Stringurl = "jdbc:mysql://localhost:3306/day11";
Stringuser = "root";
Stringpassword = "root";
Connectionconn = DriverManager.getConnection(url, user, password);
// 3. 创建用于发送sql语句的 Statement 对象
Statementstmt = conn.createStatement();
// 4. 编写一句 sql
Stringsql = "select * from users";
// 5. 发送sql, 获得结果集
ResultSetrs = 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(newcom.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 对象: 用于表示与某个数据库之间的连接,在程序中对数据库的所有操作都需要通过此对象来完成
常用方法有:
createStatement():创建向数据库发送sql的statement对象。
prepareStatement(sql):创建向数据库发送预编译sql的PrepareSatement对象。
prepareCall(sql):创建执行存储过程的callableStatement对象。
setAutoCommit(boolean autoCommit):设置事务是否自动提交。
commit():在链接上提交事务。
rollback():在此链接上回滚事务。
4. Statement 对象: 用于向数据库发送sql语句.
execute(Stringsql):用于向数据库发送任意sql语句
executeQuery(String sql):只能向数据发送查询语句。
executeUpdate(String sql):只能向数据库发送insert、update或delete语句
addBatch(String sql):把多条sql语句放到一个批处理中。
executeBatch():向数据库发送一批sql语句执行。
5. ResultSet 对象: 专门用于封装结果集(对于查询操作特别重要)
存储的形式就是一种表格的形式,同样是列+行,说白了就和我们在 dos命令行窗口查询的结果一样
遍历方式:
一开始游标指向结果集第一行, 也就是表头
通过 next 将游标移向下一行, 如果没有下一行,该方法会返回false
获得当前行的数据需要调用get方法:
get(intindex)获得第几列 列数从1开始
get(StringcolumnName) 根据列名获得值 (常用)
数据库的数据类型与java中数据类型的对应关系
ResultSet对象的常用方法
next():移动到下一行
previous():移动到前一行
absolute(introw):移动到指定行
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 (create read updatedelete)
1. 编写程序对User表进行增删改查操作
2.防止 sql 注入
在 service 层进行逻辑判断
使用PreparedStatement对象
3. 编写工具类对 jdbc 程序进行优化
将获得连接和释放资源的代码写到通用的工具类中