持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。
大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的实现过程大多通过各种关系数据库来完成。
持久化的主要应用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中。
JPA:JavaEE的规范,Java persistence api: Java的持久化API. Hibernate实现了该规范.(xml/注解)
--------------------------------------------------------------------
在Java中,数据库存取技术只能通过JDBC访问数据库:
JDBC访问数据库的形式主要有两种:
1).直接使用JDBC的API去访问数据库服务器(MySQL/Oracle).
2).间接地使用JDBC的API去访问数据库服务器.
第三方O/R Mapping工具,如Hibernate, MyBatis等.(底层依然是JDBC)
JDBC是java访问数据库的基石,其他技术都是对jdbc的封装.
JDBC(Java DataBase Connectivity):
是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序.
JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。
JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。
总结: JDBC本身是java连接数据库的一个标准,是进行数据库连接的抽象层,由java编写的一组类和接口组成,接口的实现由各个数据库厂商来完成
--------------------------------------------------------------------------------
JDBC的版本(不重要):
JDBC隶属于JavaSE的范畴,伴随着JavaSE的版本升级.
Java6开始:JDBC4.0: (了解),JDBC4.0有一个新特性-无需加载注册驱动.
Java7开始:JDBC4.1:
---------------------------------------------------------------
JDBC的API在哪里?
----->JDK的API中.
java.sql包装的就是JDBC的API.
各大数据库厂商就会对JDBC的API提供实现类.--->驱动包
注意:在开发中(编写的Java代码),使用到的关于JDBC的类/接口全部引入的是java.sql包中的.
千万不要引入com.mysql..Xxx类.
面向接口编程:
JDBC的接口 变量 = new MySQL的实现();
new Oracle的实现();
获取数据库的连接
package day01_connection;
import java.sql.Connection;
import java.sql.DriverManager;
public class ConnectionDemo {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.2.254/", "root", "spgsolar1");
Thread.sleep(3000);
}
}
这里加载驱动:Class.forName("com.mysql.jdbc.Driver"); //加载驱动的同时源文件可以看出有个静态代码块执行了new的操作
java6开始无需加载驱动,其原理是在META-INF services中有个文件java.sql.Driver内容是com.mysql.jdbc.Driver
加载驱动后需要获得一个connection,于是乎用到了DriverManager.getConnection方法
现有的驱动包中包含了org.gjt.mm.mysql它是早期的加载驱动的,现在都是extends com.mysql.jdbc.Dirver了
创建表(DDL)和异常处理
package day01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Sta_Exception {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) {
//test1();
//test2();
String sql = "CREATE TABLE `t_student` (`id` bigint(20) PRIMARY KEY AUTO_INCREMENT,`name` varchar(20),`age` int(11))";
try (
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "sllsbsb");
Statement st = conn.createStatement();
){
st.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
}
}
//ddl语句的执行和异常处理 jdk1.6
private static void test2() {
String sql = "CREATE TABLE `t_student` (`id` bigint(20) PRIMARY KEY AUTO_INCREMENT,`name` varchar(20),`age` int(11))";
Connection conn = null;
Statement st = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "sllsbsb");
st = conn.createStatement();
st.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(st!=null){
st.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}finally{
try {
if(conn!=null){
conn.close();
}
} catch (Exception e3) {
e3.printStackTrace();
}
}
}
}
//实现连接后执行ddl语句
private static void test1() throws ClassNotFoundException, SQLException {
String sql = "CREATE TABLE `t_student` (`id` bigint(20) PRIMARY KEY AUTO_INCREMENT,`name` varchar(20),`age` int(11))";
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//创建连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "sllsbsb");
//创建语句对象
Statement stasql = conn.createStatement();
//执行ddl语句
stasql.executeUpdate(sql);
}
}
JDBC的DML操作
和前面的差不多,只是语句换了package day01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class DML_Demo {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String sql1 = "INSERT INTO t_student (name,age) VALUES ('西门吹雪',32)";
String sql2 = "UPDATE t_student SET name = '乔峰',age = 16 WHERE id = 1";
String sql3 = "DELETE FROM t_student WHERE id=1";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test?characterEncoding=utf-8", "root", "sllsbsb");
Statement st = conn.createStatement();
st.executeUpdate(sql3);
}
}
查询的结果集分析
JDBC的DQL操作
package day01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DQL_test {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
//m1();
//m2();
String sql = "SELECT * FROM t_student";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "sllsbsb");
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql);
while(rs.next()){
long id = rs.getLong("id");
String name = rs.getString("name");
long age = rs.getLong("age");
System.out.println("id="+id+",name="+name+",age="+age);
}
}
//获取id为2的 信息
private static void m2() throws ClassNotFoundException, SQLException {
String sql = "SELECT * FROM t_student WHERE id = 2";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test","root","sllsbsb");
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql);
if(rs.next()){
Long id = rs.getLong("id");
String name = rs.getString("name");
long age = rs.getLong("age");
System.out.println("id="+id+",name="+name+",age="+age);
}
}
//查询单行数据
private static void m1() throws ClassNotFoundException, SQLException {
String sql = "SELECT COUNT(id) FROM t_student";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "sllsbsb");
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql);
if(rs.next()){
long rows = rs.getLong("COUNT(id)");
System.out.println(rows);
}
rs.close();
st.close();
conn.close();
}
}
DAO思想
DAO设计完成后,发现代码又臭又硬,于是进行了代码的重构上.
JDBC常用的API