JDBC:OJDBC
#JDBC
Java Database Connectivity:Java访问数据库的解决方案。
SUN公司编写了JDBC定义了一套标准接口,即访问数据库的通用API,不同的数据库厂商根据各自数据库的特点去实现这些接口。
#properties也是一种配置文件
- 如db.properties的文件内容如下:
#database connection parameters
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
user=lhh
pwd=1234
- 读取它的方法
Properties p = new Properties();
p.load(DBTool.class.getClassLoader().getResourceAsStream("db.properties"))
String driver = p.getProperty("driver");
url = p.getProperty("url");
user = p.getProperty("user");
pwd = p.getProperty("pwd");
#JDBC的工作流程
##获取连接的两种方法
###DriverManager
Class.forName("oracle.jdbc.OracleDriver")
//根据url连接参数,找到与之匹配的Driver对象,调用其方法获取连接
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.0.26:1521:orcl",
"用户名","密码");
- 直接使用DriverManager的问题
- 它没有管理连接上限,并发量大时很容易导致数据库崩溃每次调用它,它都创建新连接,而不是复用连接,效率低
###连接池/数据源 - BasicDataSourcedataSource
private static BasicDataSource dataSource = new BasicDataSource();
//加载参数
dataSource.setDriverClassName(driveClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
String initSize = p.getProperty("init_size");
String maxSize = p.getProperty("max_size");
//获得连接
Connection conn = dataSource.getConnection();
连接池可以解决的问题
它能管理连接上限,避免数据库崩溃
它可以让我们复用连接,提高效率有哪些常用连接池?
DBCP
C3P0
##两种不同的语句对象Statement和PreparedStatement
###Statement
Statement适合执行静态(无条件)SQL
- 图解:
- 使用
Statement smt = conn.createStatement();
String sql = “insert into emps values(”
+ “emps_seq.nextval,‘唐僧’,‘总监’,0”
+ “,sysdate,8000.0,6000.0,2)”;
//返回sql所能影响(增删改)的行数
//该方法在执行完sql后会自动commit
int rows = smt.executeUpdate(sql);
System.out.println(rows);
###PreparedStatement
PreparedStatement适合执行动态(有条件)SQL会进行预编译。
图解
使用:
conn = DBUtil.getConnection();//创建ps对象,并让它立刻发送SQLString sql = "select * from emps where empno=?";PreparedStatement ps = conn.prepareStatement(sql);//给?赋值//ps.set类型(?的序号,?的值)ps.setInt(1, empno);//发送条件,执行SQLResultSet rs = ps.executeQuery();while(rs.next()) {System.out.println(rs.getString("ename"));System.out.println(rs.getDouble("sal"));}
##ResultSet
- 结果集的指针
###结果集元数据ResultSetMetaData
结果集元数据:对结果集进行描述(概括)的数据
包含:多少列,列名,列的类型
conn = DBUtil.getConnection();
String sql = "select * from emps order by empno";
Statement smt = conn.createStatement();
ResultSet rs = smt.executeQuery(sql);
//获取结果集元数据
ResultSetMetaData md = rs.getMetaData();
System.out.println(md.getColumnCount());
System.out.println(md.getColumnName(1));
System.out.println(md.getColumnTypeName(1));
#JDBC中的事务管理
- 自动管理事务
- JDBC会自动管理事务
- 每次调用executeUpdate()时,它会自动commit
- 一个业务只需执行一次DML时,采用自动管理事务
- 手动管理事务
- 取消自动提交:conn.setAutoCommit(false)
- 采用手动提交:conn.commit()
- 异常时要回滚:conn.rollback()
一个业务需要执行多次DML时,采用手动管理事务
- 什么是事务?
- 满足如下规则的数据库访问叫事务
原子性:事务是一个完整的过程,要么都成功,要么都失败.
一致性:事务前后的数据要保持一致,即收支平衡.
隔离性:事务访问过程中的数据,不能被别人访问.
持久性:事务一旦完成,就永久生效.
要整体的看待事务的概念,不要割裂来理解.
#批量添加
- 使用场景
在企业软件上线时,导入原始数据,则需要进行批量添加. - 如何实现
try {conn = DBUtil.getConnection();conn.setAutoCommit(false);String sql = "insert into emps values("+ "emps_seq.nextval,?,?,?,?,?,?,?)";PreparedStatement ps = conn.prepareStatement(sql);for(int i=1;i<=108;i++) {ps.setString(1, "好汉"+i);ps.setString(2, "打劫");//省略5行//将此数据暂存到ps对象上ps.addBatch();if(i%50==0) {//将ps上暂存的50条数据发送给数据库ps.executeBatch();//将ps上暂存的数据清空,以便下一轮发送ps.clearBatch();}}//为避免有零头数据,再单独发送一次ps.executeBatch();conn.commit();
#获取自动生成的主键
使用场景
在增加主外键对应的2张表的数据时,需要获得主表自动生成的主键.
使用:
//给新增加的部门添加一个员工
conn = DBUtil.getConnection();
conn.setAutoCommit(false);
//增加部门
String sql = "insert into depts values("+ "depts_seq.nextval,?,?)";
//参数2是一个字符串数组,内含主键字段名,
//即告诉ps希望它返回哪个主键字段的值.
PreparedStatement ps = conn.prepareStatement(sql, new String[]{"deptno"});
ps.setString(1, dname);
ps.setString(2, loc);
ps.executeUpdate();//从ps中获得生成的主键的值
ResultSet rs = ps.getGeneratedKeys();
rs.next();
//获取主键值时不能通过字段名获取
int deptno = rs.getInt(1);//增加员工
sql = "insert into emps values("+ "emps_seq.nextval,?,?,?,?,?,?,?)";
ps = conn.prepareStatement(sql);
ps.setString(1, ename);
//省略
conn.commit();
#DAO
#JDBC支持如下的日期类型
- java.sql.Date 年月日
- java.sql.Time 时分秒
- java.sql.Timestamp 完整日期
上述日期都是java.util.Date的子类
#JavaBean? - 满足如下规范的类
- 该类必须有包
- 该类必须有无参构造器
- 该类必须实现序列化接口
- 该类通常有get和set方法
JDBC:OJDBC相关推荐
- 查看数值类型python_python 查询数据库返回的数据类型
self.conn=MySQLdb.connect(host='localhost',port=3306, user='keystone', passwd='OptValley@4312', db=s ...
- 解决maven官方库中没有oracle jdbc驱动问题 编辑
2019独角兽企业重金招聘Python工程师标准>>> 刚研究maven不久,遇到一个比较头疼的问题,在工程里怎么下都下载不了oracle的jdbc驱动. 刚还以为是网络问题,重新下 ...
- maven添加oracle jdbc依赖
maven添加oracle jdbc依赖 由于Oracle授权问题,Maven不提供Oracle JDBC driver,为了在Maven项目中应用Oracle JDBC driver,必须手动添加到 ...
- JDBC常见面试题集锦(一)
2019独角兽企业重金招聘Python工程师标准>>> 什么是JDBC,在什么时候会用到它? JDBC的全称是Java DataBase Connection,也就是Java数据库连 ...
- Java学习笔记之:Java JDBC
一.介绍 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用java语言编写 ...
- Oracle JDBC版本区别(转)
oracle\product\11.2.0\dbhome_1\jdbc\lib ojdbc5.jar ojdbc5dms.jar ojdbc5dms_g.jar ojdbc5_g.jar ojdbc6 ...
- OJDBC版本区别 [ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别]
在使用Oracle JDBC驱动时,有些问题你是不是通过替换不同版本的Oracle JDBC驱动来解决的?最常使用的ojdbc14.jar有多个版本,classes12.jar有多个版本你了解吗? 连 ...
- Java使用ojdbc连接Oracle数据库时不能使用服务名连接的问题
最近,在做完数据库迁移后,领导要求所有的前端应用必须使用oracle的服务名连接数据库.所以在迁移数据库之前对公司内部开发系统做了全面准备.但是在迁移数据库的当晚还是遇到了问题,因为忘记考虑第三方的应 ...
- oracle驱动maven报错_在Maven仓库中添加Oracle JDBC驱动
由于Oracle授权问题,Maven3不提供Oracle JDBC driver,为了在Maven项目中应用Oracle JDBC driver,必须手动添加到本地仓库. 一.首先要得到Oracle ...
- oracle 11g jdbc jar包在哪个文件目录
一. 如果装了oracle数据库的话, 大致是这样的目录: D:\oracle\product\11.2.0\client_1\oui\jlib\classes12.jar 或者 D: ...
最新文章
- 2019天猫双11成交额达2684亿,盘点今年双11有哪些亮点!
- 区块链:新经济蓝图及导读
- php mcript(),PHP基于mcript扩展实现对称加密功能
- linux安装完怎么分区,Linux系统安装模式下硬盘分区怎么做?
- ubuntu查看版本
- spring boot示例_Spring Boot完成示例
- kalman滤波在雷达目标跟踪中的应用_简述Automotive radar中的多目标跟踪处理
- mysql数据库(1):连接与断开服务器
- php函数(检查变量、函数、键是否存在)
- linux差分包升级流程,OTA 差分升级包的制作
- python flask oauth_Flask之 flask_httpauth(HTTPTokenAuth)
- linux中波浪线是根目录吗,linux 波浪线 ~ 使用方法
- oracle decode别名,Oracle中decode函数用法 VelHong
- 网易“吃鸡”,干腾讯何事?
- Systemd 入门教程:命令篇、实战篇
- EaseUS Data Recovery Wizard 如何在Mac上恢复已删除文件?
- ArcGIS修改矢量边界(土地利用图图斑)
- python菜鸟教程网址是什么-Python菜鸟教程
- 关保条例发展历程解读
- MacBook环境下python连接oracle数据库