快速了解JDBC
什么是JDBC
Java数据库连接 JAVA DateBase Connectivity
JDBC可以让Java通过程序操作关系型数据库
JDBC基于驱动程序实现与数据库的连接与操作
JDBC驱动程序(是一个标准,由数据库厂商进行实现)
Java程序
JDBC API JDBC API JDBC API
mysql驱动程序 oracle驱动程序 其他驱动程序
mysql oracle 其他
JDBC优点
统一的API,提供一致的开发过程
易于学习,容易上手,代码结构稳定
功能强大,执行效率高,可处理海量数据
快速上手JDBC
JDBC开发流程
imooc-jdbc中的StandardJDBCSample工程
- 加载并注册JDBC驱动 jar包下载 Class.forName(“com.mysql.cj.jdbc.Driver)
- 创建数据库连接
- 创建Statement对象
- 遍历查询结果
- 关闭连接,释放资源
精讲JDBC开发细节
JDBC驱动的秘密
如何获取JDBC驱动Jar
在各个开发商的官网上下载 一般都是 .. driver ..驱动
创建数据库连接代码
String dbDriver = “com.mysql.cj.jdbc.Driver”; //JDBC驱动类
String dbURL = “jdbc:mysql://localhost:3306/imooc”; //连接字符串
String dbUsername = “root”; //数据库用户名
String dbPassword = “123456”; // 数据库密码
//1.加载并初始化JDBC驱动
Class.forName(dbDriver);
//2.创建数据库连接
Connection cnn = DriverManager.getConnection(dbURL, dbUsername,dbPassword);
Class.forName的作用
Class.forName 用于加载指定的JDBC驱动类
Class.forName 本质是通知JDBC注册这个驱动类
驱动由数据库厂商自行开发,连接字符串也不同
数据库与连接字符串
数据库 | JDBC驱动类 | 连接字符串 |
MySQL 5 | com.mysql.jdbc.Driver | jdbc:mysql://主机ip:端口号/数据库名 |
MySQL 8 | com.mysql.cj.jdbc.Driver | jdbc:mysql://主机ip:端口号/数据库名 |
Oracle | oracle.jdbc.driver.OracleDriver | jdbc:oracle:thin:@主机ip:端口号:数据库名 |
SQL Server | com.mircosoft.sqlserver.jdbc.SQLServerDriver | jdbc:mircosoft:sqlserver:主机ip:端口;databasename=数据库名 |
DriverManager
DriverManager用于注册/管理JDBC驱动程序
DriverManager.getConnection(连接字符串,用户名,密码)
返回值是Connection对象,对应数据库的物理网络连接
Connection对象
Connection对象用于JDBC与数据库的网络通信对象
java.sql.Connection是一个接口,具体由驱动厂商实现
所有数据库的操作都建立在Connection基础上
MySQL连接字符串
格式: jdbc:mysql://主机ip:端口号/数据库名称?参数列表
主机ip与端口号是可选设置,默认值为127.0.0.1与3306
参数列表采用url编码,格式:参数1=值1&参数2=值2&...
MySQL连接字符串常用参数
参数名 | 建议参数值 | 说明 |
useSSL | true(生产) false(开发) | 是否禁用ssl |
useUnicode | true | 启用Unicode编码传输数据 |
characterEncoding | UTF-8 | 使用UTF-8编码传输数据 |
serverTimezone | Asia/Shanghai | 使用东8时区时间,UTC+8 |
allowPublicKeyRetrieval | true | 允许从客户端获取公钥加密传输 |
实现按部门筛选员工数据
imooc-jdbc中的 command包 和HumanResourceApplication类
预防注入攻击
SQL注入攻击
会让数据库数据泄露, 写的sql语句加上单引号加上一个永远可以成立的条件,提取出所有数据
SQL注入攻击本质是未对原始SQL中的敏感字符做特殊处理
解决方法:放弃Statement改用PreparedStatement处理SQL
PreparedStatement
PreparedStatement 预编译Statement是Statement的子接口
PreparedStatement 对SQL进行参数化,预防SQL注入攻击
PreparedStatement比Statement执行效率更高
PreparedStatement pstm = conn.prepareStatement(sql)
pstm.setString(1,dname);
错误使用方式
select * from employee where ?= ‘abc’ 问号应该在=后面才对
select * from employee where salary = ? + 100 sql参数不允许被二次计算 在等号后面只有一个? 在传参过程中 加100
select ? from employee where ename = ? 只能在值得地方写? 在字段名的地方不能加?
JDBC实现写数据
JDBC执行INSERT语句
String sql = “insert into employee(eno, ename) value(?,?)”;
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,10);
ostmt.setString(2,”张三”);
int cnt= pstmt.executeUpdate();
System.out.println(“数据新增成功”);
JDBC执行UPDATE语句
String sql = “update employee set salary = salary+1000 where dname = ?”;
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1,”研发部”);
int cnt = pstmt.executeUpdate();
System.out.println(“研发部”+cnt+”员工提薪1000元”);
JDBC执行DELECT语句
String sql = “delete from employee where eno = ?”;
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,3395);
int cnt = pstmt.executeUpdate();
System.out.println(cnt+”名员工数据已被删除”);
JDBC中的事务管理
什么是事务
事务是以一种可靠的、一致的方式,访问和操作数据库的程序单元
要么把事情做完,要么什么都不做,不能做一半
事务依赖于数据库实现,MySQL通过事务作为数据缓冲地带
JDBC两种事务模式
JDBC允许两种事务模式
自动提交事务模式
手动提交事务模式
自动提交事务模式
自动提交事务模式是指每执行一次写操作SQL,自动提交事务
自动提交开启方法: conn.setAutoCommit(true)
自动事务是JDBC默认行为,此模式无法保证多数据一致性
手动提交事务模式
手动提交模式是指显示调用commit()与rollback()方法管理事务
手动提交开启方法:conn.setAutoCommit(false)
手动提交事务可保证多数据一致性,但必须手动调用提交/回滚方法
案例: 实现批量增加员工
imooc-jdbc中的TransactionSample类
基于实体类实现分页数据封装
imooc-jdbc中的PaginationCommand类
JDBC中Date日期对象的处理
imooc-jdbc中的insert和Query类
重点是java.util.Date转换为java.sql.Date
从String 转换为java.util.Date:
SampleDateFormat sdf = new SampleDateFormat(“yyyy-MM-dd”);
java.util.Date date = sdf.parse(String hiredate);
java.util.Date转换为java.sql.Date
long time = date.getTime();
java.sql.Date date1 = new java.sql.Date(time);
JDBC数据批处理
imooc-jdbc中的BatchSample类
- sql语句在for循环以外
- for循环内的最后加上个pstmt.addBatch();
- for循环完了 在外面加上个 pstmt.executeBatch();
连接池与JDBC进阶使用
现实中”池”的概念
把原料放在开发附近,到时候利用比较高效,就相当于物资仓库。
阿里巴巴Druid连接池
Druid是阿里巴巴开源连接池组件,是最好的连接池之一。
Druid对数据库连接进行有效管理与重用,最大化程序执行效率。
连接池负责创建管理连接,程序只负责从连接池中取用,归还。
Druid连接池配置与使用
- 需要增加Druid.jar包
- 创建druid-config.properties文件, 在文件中设置driverClassName、url、username、password
- 加载属性文件
Properties properties = new Properties();
String propertiesFile = 当前类.class.getResource(“/文件名”);
propertiesFile = new URLDecoder().decode(propertiesFile,”UTF-8”);
properties.load(new FileInputStream(propertiesFile));
- 获取DataSource 数据源对象
DataSource datasource = DruidDataSourceFactory.createDataSource(properties);
- 创建数据库连接
conn = datasource.getConnection();
- 关闭数据库
C3P0连接池
imooc-jdbc中的C3P0Sample类与c3p0-config.xml文件
Apache Commons DBUtils
commons-dbutils 是Apache提供的开源JDBC工具类库
它是对JDBC的简单封装,学习成本极低
使用commons-dbutils可以极大简化JDBC编码工作量
QueryRunner qr = new QueryRunner(dataSource);
List<Employee> list = (List<Employee>) qr.query("select * from employee limit ?,10",
new BeanListHandler(Employee.class),
new Object[]{10});