历史问题
市面上有非常多的数据库,本来我们是需要根据不同的数据库学习不同的API,极不方便。
ODBC的诞生
ODBC是 Open Database Connectivity的英文简写。它是一种用来在相关或不相关的数据库管理系统(DBMS)中存取数据的,用C语言实现的,标准应用程序数据接口。通过ODBC API,应用程序可以存取保存在多种不同数据库管理系统(DBMS)中的数据,而不论每个DBMS使用了何种数据存储格式和编程接口。
JDBC(Java Data Base Connectivity)诞生
由于java的平台无关性面向对象等特征,导致其用户量激增,但是ODBC没有这两大特点,java的有点无法突出,JDBC应运而生。
是什么:
它是可以执行SQL语句的Java API。(对应着DAO层(data access object,数据访问对象))
其实可以好好细品一下JDBC,把接口定义出来,反正你给我实现就对了,无论数据库怎么变,用的时候是同一套API
jdbc如何解决(以mysql为例)
(也就是这6大步骤)
-
通过驱动实现实体类和数据库的连接,dirver,加载驱动
Class.forName("com.mysql.jdbc.Driver");
-
获取与数据库连接的对象-Connetcion,
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/zhongfucheng", "root", "root");
获取到连接之后就在连接上实现数据处理
-
创建执行对象,
Statement st = conn.createStatement();
-
执行SQL语句,拿到结果集
resultSet = statement.executeQuery("SELECT * FROM users");
-
封装结果集
while (resultSet.next()) { System.out.println(resultSet.getString(1)); System.out.println(resultSet.getString(2)); }
-
关闭连接
/* * 关闭资源,后调用的先关闭 * * 关闭之前,要判断对象是否存在 * */ if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if (statement != null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } }
PreparedStatement接口与Statement接口的区别
- Statement对象编译SQL语句时,如果SQL语句有变量,就需要使用分隔符来隔开,如果变量非常多,就会使SQL变得非常复杂。PreparedStatement可以使用占位符,简化sql的编写
- Statement会频繁编译SQL。PreparedStatement可对SQL进行预编译,提高效率,预编译的SQL存储在PreparedStatement对象中
- PreparedStatement防止SQL注入。(Statement通过分隔符’++’,编写永等式,可以不需要密码就进入数据库)
数据库连接池
为什么我们要使用数据库连接池
数据库的连接的建立和关闭是非常消耗资源的,频繁地打开、关闭连接造成系统性能低下
常见的数据库连接池
C3P0、DBCP、Druid。
mysql的分页
/*
Mysql分页语法:
@start---偏移量,不设置就是从0开始【也就是(currentPage-1)*lineSize】
@length---长度,取多少行数据
*/
SELECT *
FROM 表名
LIMIT [START], length;
/*
例子:
我现在规定每页显示5行数据,我要查询第2页的数据
分析:
1:第2页的数据其实就是从第6条数据开始,取5条
实现:
1:start为5【偏移量从0开始】
2:length为5
Mysql从(currentPage-1)*lineSize开始取数据,取lineSize条数据
*/
jdbc的事务管理
首先设置setautocommit(false)
当所有的sql语句都执行无误后,commit
如果出现问题执行rollback
使用savepoint保存中间点。