#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中的事务管理

  1. 自动管理事务
  • JDBC会自动管理事务
  • 每次调用executeUpdate()时,它会自动commit
  • 一个业务只需执行一次DML时,采用自动管理事务
  1. 手动管理事务
  • 取消自动提交:conn.setAutoCommit(false)
  • 采用手动提交:conn.commit()
  • 异常时要回滚:conn.rollback()
    一个业务需要执行多次DML时,采用手动管理事务
  1. 什么是事务?
  • 满足如下规则的数据库访问叫事务
    原子性:事务是一个完整的过程,要么都成功,要么都失败.
    一致性:事务前后的数据要保持一致,即收支平衡.
    隔离性:事务访问过程中的数据,不能被别人访问.
    持久性:事务一旦完成,就永久生效.
    要整体的看待事务的概念,不要割裂来理解.
    #批量添加
  1. 使用场景
    在企业软件上线时,导入原始数据,则需要进行批量添加.
  2. 如何实现
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?
  • 满足如下规范的类
  1. 该类必须有包
  2. 该类必须有无参构造器
  3. 该类必须实现序列化接口
  4. 该类通常有get和set方法

JDBC:OJDBC相关推荐

  1. 查看数值类型python_python 查询数据库返回的数据类型

    self.conn=MySQLdb.connect(host='localhost',port=3306, user='keystone', passwd='OptValley@4312', db=s ...

  2. 解决maven官方库中没有oracle jdbc驱动问题 编辑

    2019独角兽企业重金招聘Python工程师标准>>> 刚研究maven不久,遇到一个比较头疼的问题,在工程里怎么下都下载不了oracle的jdbc驱动. 刚还以为是网络问题,重新下 ...

  3. maven添加oracle jdbc依赖

    maven添加oracle jdbc依赖 由于Oracle授权问题,Maven不提供Oracle JDBC driver,为了在Maven项目中应用Oracle JDBC driver,必须手动添加到 ...

  4. JDBC常见面试题集锦(一)

    2019独角兽企业重金招聘Python工程师标准>>> 什么是JDBC,在什么时候会用到它? JDBC的全称是Java DataBase Connection,也就是Java数据库连 ...

  5. Java学习笔记之:Java JDBC

    一.介绍 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用java语言编写 ...

  6. Oracle JDBC版本区别(转)

    oracle\product\11.2.0\dbhome_1\jdbc\lib ojdbc5.jar ojdbc5dms.jar ojdbc5dms_g.jar ojdbc5_g.jar ojdbc6 ...

  7. OJDBC版本区别 [ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别]

    在使用Oracle JDBC驱动时,有些问题你是不是通过替换不同版本的Oracle JDBC驱动来解决的?最常使用的ojdbc14.jar有多个版本,classes12.jar有多个版本你了解吗? 连 ...

  8. Java使用ojdbc连接Oracle数据库时不能使用服务名连接的问题

    最近,在做完数据库迁移后,领导要求所有的前端应用必须使用oracle的服务名连接数据库.所以在迁移数据库之前对公司内部开发系统做了全面准备.但是在迁移数据库的当晚还是遇到了问题,因为忘记考虑第三方的应 ...

  9. oracle驱动maven报错_在Maven仓库中添加Oracle JDBC驱动

    由于Oracle授权问题,Maven3不提供Oracle JDBC driver,为了在Maven项目中应用Oracle JDBC driver,必须手动添加到本地仓库. 一.首先要得到Oracle ...

  10. oracle 11g jdbc jar包在哪个文件目录

    一. 如果装了oracle数据库的话, 大致是这样的目录:     D:\oracle\product\11.2.0\client_1\oui\jlib\classes12.jar 或者     D: ...

最新文章

  1. 2019天猫双11成交额达2684亿,盘点今年双11有哪些亮点!
  2. 区块链:新经济蓝图及导读
  3. php mcript(),PHP基于mcript扩展实现对称加密功能
  4. linux安装完怎么分区,Linux系统安装模式下硬盘分区怎么做?
  5. ubuntu查看版本
  6. spring boot示例_Spring Boot完成示例
  7. kalman滤波在雷达目标跟踪中的应用_简述Automotive radar中的多目标跟踪处理
  8. mysql数据库(1):连接与断开服务器
  9. php函数(检查变量、函数、键是否存在)
  10. linux差分包升级流程,OTA 差分升级包的制作
  11. python flask oauth_Flask之 flask_httpauth(HTTPTokenAuth)
  12. linux中波浪线是根目录吗,linux 波浪线 ~ 使用方法
  13. oracle decode别名,Oracle中decode函数用法 VelHong
  14. 网易“吃鸡”,干腾讯何事?
  15. Systemd 入门教程:命令篇、实战篇
  16. EaseUS Data Recovery Wizard 如何在Mac上恢复已删除文件?
  17. ArcGIS修改矢量边界(土地利用图图斑)
  18. python菜鸟教程网址是什么-Python菜鸟教程
  19. 关保条例发展历程解读
  20. MacBook环境下python连接oracle数据库

热门文章

  1. 【产品】产品经理手册
  2. 安装英伟达驱动,提示驱动和windows版本不兼容或是硬件不兼容的问题
  3. IAR for ARM系列教程(一)_新建软件工程详细过程
  4. 基于Jsp的简单论坛(BBS)的设计与实现(附代码)
  5. Cobalt Strike Profile 学习记录
  6. 【数学建模】历年数学建模国赛评价类题目汇总
  7. Recycler 病毒(jwgkvsq.vmx)手动查杀
  8. 文件夹病毒残余文件的解决办法
  9. mysql recovery_MySQL Recovery
  10. 关于Vue项目导入谷歌翻译api