软件架构方式介绍:
一、JDBC概述
JDBC (Java DataBase Connection) 是通过JAVA访问数据库
1.1 数据的持久化
- 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的实现过程大多通过各种关系数据库来完成。
- 持久化的主要应用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中。
1.2 Java中的数据存储技术
在Java中,数据库存取技术可分为如下几类:
- JDBC直接访问数据库
- JDO (Java Data Object )技术
- 第三方O/R工具,如Hibernate, Mybatis 等
JDBC是java访问数据库的基石,JDO、Hibernate、MyBatis等只是更好的封装了JDBC。
二、获取数据库连接
五种数据库连接方式:
package connection;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import org.junit.Test;
import com.mysql.jdbc.JDBC42CallableStatement;
public class ConnectionTest {
// 方式一
@Test
public void testConnection1() throws SQLException {
System.out.println("方法一:");
// java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库
// 厂商提供不同的实现。下面是mysql对Driver这个接口的具体实现类,存放在com.mysql.jdbc包中,这个类所在的jar
// 包需要我们导入,导入的是5.1.7版本的。
// 创建的dirver对象就是实现了Driver接口的mysql的具体实现对象,创建该对象的时候就会 加载与注册JDBC驱动
Driver driver = new com.mysql.jdbc.Driver();
System.out.println("成功加载驱动");
// 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到数据库的连接。
// ?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
String url = "jdbc:mysql://localhost:3306/test";
// 将用户名和密码封装在properities中
Properties info = new Properties();
info.setProperty("user", "root");
info.setProperty("password", "730136");
Connection connection = driver.connect(url, info);
System.out.println(connection);
}
// 上面的程序new com.mysql.jdbc.Driver();出现了第三方的API,我们只想通过JDBC使用数据库,并不 想牵连到数据库和JDBC之间的关系
// 方式二:如下的程序中不出现第三方的API,使得程序有更好的可移植性
@Test
public void testConnection2() throws Exception {
System.out.println("方法二:");
// 1.加载与注册驱动,通过反射动态获取实现获取Driver的实现类对象
// 目的都是创建类的实例,所以最终效果是一样的。反射的效率不高,但是为什么还需要反射呢,这是因为反射有更大的灵活性。
//有了反射我们就可以将需要创建的类的信息写入配置文件,这样在程序运行时动态指定需要创建哪个类的实例。
Class clazz = Class.forName("com.mysql.jdbc.Driver");
Constructor constructor = clazz.getConstructor();
// 通过构造器实例化
Driver driver = (Driver) constructor.newInstance();
// Driver driver = (Driver) clazz.getDeclaredConstructor().newInstance();
System.out.println("成功加载驱动");
// 2.提供要连接的数据库地址
String url = "jdbc:mysql://localhost:3306/test";
// 3.将用户名和密码封装在properities中
Properties info = new Properties();
info.setProperty("user", "root");
info.setProperty("password", "730136");
// 4.创建连接
Connection connection = driver.connect(url, info);
System.out.println(connection);
}
// @Test
// public void testConnection4() throws Exception {
// //1.获取Driver接口实现类对象,使用反射实现
// Class clazz = Class.forName("com.mysql.jdbc.Driver");
// Class clazz = Class.forName("com.mysql.jdbc.Driver()"); 注意书写规范!!!!!!!多一个括号
// System.out.println("1");
// //使用反射的方式创建一个对象
// //构造器
// Constructor constructor = clazz.getConstructor();
// System.out.println("2");
// //通过构造器实例化
// Driver driver = (Driver) constructor.newInstance();
// System.out.println("3");
// System.out.println("成功加载驱动");
// //2.提供要连接的数据库
// String url = "jdbc:mysql://localhost:3306/test";
//
// //3.将用户名和密码封装在properities中
// Properties info = new Properties();
// info.setProperty("user", "root");
// info.setProperty("password", "730136");
//
// //4.创建连接
// Connection connection = driver.connect(url, info);
//
// System.out.println(connection);
//
// }
// 方式三:使用DriverManager替换Driver
@Test
public void testConnection3() throws Exception {
System.out.println("方法三:");
// 1.获取Driver接口实现类对象,使用反射实现
Class clazz = Class.forName("com.mysql.jdbc.Driver");
// 使用反射的方式创建一个对象
// 构造器
Constructor constructor = clazz.getConstructor();
// 通过构造器实例化
Driver driver = (Driver) constructor.newInstance();
// 2.注册驱动,没有这一步也可以成功
DriverManager.registerDriver(driver);
// 3.提供要连接的数据库
String url = "jdbc:mysql://localhost:3306/test";
// 4.提供用户名和密码
String user = "root";
String password = "730136";
// 5.获取连接
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println(connection);
}
//方法四:可以只是加载驱动,不用显式的注册驱动了
@Test
public void testConnection4() throws Exception {
System.out.println("方法四:");
// 1.加载注册驱动,不再需要driver对象
//下面的这些都不需要,加载Driver的mysql实现类的时候,它里面有一个静态代码块用来注册驱动
/*
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
*/
Class.forName("com.mysql.jdbc.Driver");
// // 使用反射的方式创建一个对象
// // 构造器
// Constructor constructor = clazz.getConstructor();
// // 通过构造器实例化
// Driver driver = (Driver) constructor.newInstance();
//
// // 2.注册驱动,没有这一步也可以成功
// DriverManager.registerDriver(driver);
// 3.提供要连接的数据库
String url = "jdbc:mysql://localhost:3306/test";
// 4.提供用户名和密码
String user = "root";
String password = "730136";
// 5.获取连接
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println(connection);
}
// 方式五(最终版):将数据库连接需要的四个基本信息声明在配置文件中,通过读取配置文件的方式,创建连接
/*
* 1.实现了数据与代码的分离,实现了解耦
* 2.如果要修改配置文件信息,避免了修改代码重新打包,提高效率
*/
@Test
public void testConnection5() throws Exception {
System.out.println("方法五:");
// 1.读取配置文件下的四个基本信息,通过类加载器加载,ctrl+1生成
InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
//注意!!!!!properties拼写
Properties properties = new Properties();
properties.load(is);
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
String driverClass = properties.getProperty("driverClass");
//2.加载驱动
Class.forName(driverClass);
// 3.获取连接
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println(connection);
}
}
user=root
password=123456
url=jdbc:mysql://localhost:3306/test
driverClass=com.mysql.jdbc.Driver
三、使用PreparedStatement实现CRUD操作
3.1 操作和访问数据库