作者:小周颖子 | 来源:互联网 | 2023-09-17 09:18
JavaEE之JDBC介绍JavaDatabaseConnectivity(使用java操作数据库的标准接口,任何java访问数据库框架最终底层都是基于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 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接口来实现(几乎不会使用) 2.使用DriverManager类来连接(适合自己学习使用) 3.使用数据库连接池来完成数据库连接(企业开发生产环境使用)
举例:连接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