Java EE之JDBC技术

Java EE 之 JDBC

介绍

Java Database Connectivity(使用java操作数据库的标准接口,任何java访问数据库框架最终底层都是基于jdbc接口实现
来操作数据库的,只是框架对jdbc有所封装).JDBC是java ee众多标准其中一个。

Java Database Connectivity (JDBC) is an application programming interface (API) for the programming language Java, which defines how a client may access a database.It is part of the Java Standard Edition platform, from Oracle Corporation.It provides methods to query and update data in a database, and is oriented towards relational databases. A JDBC-to-ODBC bridge enables connections to any ODBC-accessible data source in the Java virtual machine (JVM) host environment.

如今大多数应用都是构建在关系型数据库之上的,尤其是web应用更是如此,因此访问数据库是大多数应用都要需要的。对于后端开发者而言,经常需要访问数据库存储或检索数据,java给我们提供了jdbc标准来访问关系型数据库。

持久化概念

持久化(persistence):把数据保存到可掉电式存储设备中以供之使用。大多数情况下特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以“固化”,而持久化的实现过程大多通过各种关系型数据库完成。当然也可以存储在磁盘文件、XML数据文件中。简言之数据持久化,将数据从内存保存到硬盘文件上。

jdbc示意图

JDBC连接示意图


jdbc api 如图

jdbc api核心接口和类



核心内容

JDBC的核心接口和类

(深入研究源码有助于我们得心应手的使用)

核 心 类: DriverManager(驱动管理器)
核心接口: Connection、PreparedStatement、CallableStatement、ResultSet、Statement(不推荐直接使用)

DriverManager:管理一组JDBC驱动程序的基本服务
Statement接口:用于执行静态 SQL 语句并返回它所生成结果的对象—(我称之为处理机制对象)执行sql操作时,会引起sql注入问题
PreparedStatement接口:表示预编译的 SQL 语句的对象—(我称之为预处理机制对象) 可以填充占位符,执行效率更高效
SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。
CallableStatement接口:存储过程预处理器,继承自PreparedStatement。
ResultSet接口:表示数据库结果集的数据表。它的游标有类似集合框架里迭代器功能。

JDBC连接操作数据库的步骤:

1.加载驱动                      Class来加载
2.创建Connection对象            DriverManager来获得(企业级开发使用连接池技术)
3.获得预处理机制执行语句          connection获得预处理机制,ps.executeUpdate()、ps.executeQuery();
4.获得结果集(可选)             预处理机制获得的
最后一步一定是关闭数据库资源(资源的操作一定释放资源)
备注:数据库的操作有两点要特别注意(事务、资源关闭)
注意:关闭资源时先后顺序,先打开的后关闭,犹如开门和关门。

获得数据库连接方式

1.使用Driver接口来实现(几乎不会使用)<br>
2.使用DriverManager类来连接(适合自己学习使用)<br>
3.使用数据库连接池来完成数据库连接(企业开发生产环境使用)<br>

举例:连接mysql的几个基本参数

DRIVER="com.mysql.jdbc.Driver"
URL:"jdbc:mysql://127.0.0.1:3306/test"
URL:"jdbc:mysql:///test(如果是默认本机和3306端口)"
USERNAME:"admin"
PASSWORD:"admin"
通常这些配置都是写在配置文件中properties配置文件或xml配置文件

读取属性文件java代码

//读取 jdbc.properties
//属性文件对应 Java 中的 Properties 类  它是Map子类
Properties properties = new Properties();
InputStream inStream = ReviewTest.class.getClassLoader()
        .getResourceAsStream("jdbc.properties");
properties.load(inStream)

处理sql.Date和java.util.Date的转换

//第一个Date是java.sql里的Date
//第二个Date是java.util里的Date
new Date(new Date().getTime());
//更标准的写法是:
new java.sql.Date(new java.util.Date().getTime());

方式一:(直接使用预处理器 推荐使用)

    preparedStatement=connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS;
    //执行操作
    preparedStatement.executeUpdate();
    //获得自增主键的结果集
    ResultSet resultSet=preparedStatement.getGeneratedKeys();
    //如果知道插入记录只有一条的话
    if(resultSet.next()){

        Integer id=resultSet.getInt(1);
        System.out.println("主键id: "+id);
    }
    //如果插入数据是多条记录的话
    while(resultSet.next()){

        Integer id=resultSet.getInt(1);         
        System.out.println("id "+id);
    }
    备注:通常情况下都是插入一条记录的

方式二:(使用静态的处理器 不推荐使用)

    Statement statement=connection.createStatement();   
    statement.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
    //获得自增主键结果集
    ResultSet resultSet=statement.getGeneratedKeys();
    //如果知道插入记录只有一条的话
    if(resultSet.next()){
        Integer id=resultSet.getInt(1);
        System.out.println("主键id: "+id);
    }
    //如果插入数据是多条记录的话
    while(resultSet.next()){    
        Integer id=resultSet.getInt(1);         
        System.out.println("id "+id);
    }
    备注:不管使用那种方式都需要获得对应的结果集,还要使用Statement.RETURN_GENERATED_KEYS;

访问层框架进化史

1、原生jdbc
2、简易封装jdbc的小组件(DBUtils、spring JdbcTemplate
3、半自动化orm框架ibatis/mybatis框架(个人比较喜欢)
4、全自动化orm框架hibernate框架
5、JPA持久化标准(推荐使用)

总结

JDBC技术很重要,我们应该好好研读下其源码,但是实际开发中我们通常会使用封装过的访问层框架。例如mybatis、hibernate等ORM框架。java ee标准中又提出了一项新的对象持久化标准,即JPA规范基于JPA实现规范访问数据库就会变得更加简单,是站在OOP层面去访问数据库了。

疑问

如何判断某一次执行语句是否执行成功?


参考

https://en.wikipedia.org/wiki/Java_Database_Connectivity
https://www.ibm.com/developerworks/cn/java/l-jdbcperform/
https://docs.oracle.com/javase/8/docs/api/java/sql/package-summary.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值