Если в статье есть что-то неуместное, пожалуйста, поправьте меня.Если вам нравится читать в WeChat, вы также можете подписаться на мой публичный аккаунт WeChat:
好好学java
, доступ к высококачественным учебным ресурсам.
1. JDBC
Подключение к базе данных JAVA Соединение с базой данных Java.
JDBC (Java DataBase Connectivity, соединение с базой данных java) — это Java API для выполнения операторов SQL, который может обеспечить унифицированный доступ к различным реляционным базам данных, состоит из набора классов и интерфейсов, написанных на языке Java. JDBC предоставляет эталон, на основе которого можно создавать более продвинутые инструменты и интерфейсы, позволяющие разработчикам баз данных писать приложения для баз данных, и JDBC также является торговой маркой.
2. Почему появляется JDBC
Своего рода правила доступа к базе данных и спецификации, предоставляемые компанией SUN.Поскольку существует много типов баз данных и широко используется язык Java, компания Sun предоставляет своего рода спецификации для других поставщиков баз данных для реализации базовых правил доступа. Наша программа Java должна использовать только драйвер jdbc, предоставленный компанией Sun.
В-третьих, драйвер базы данных
После установки базы данных наше приложение не может напрямую использовать базу данных и должно использовать соответствующий драйвер базы данных для работы с базой данных через драйвер. По сути, это JDBC-реализация интерфейса производителя базы данных, то есть jar-файл класса реализации для таких интерфейсов, как Connection.
4. Общие интерфейсы
1. Интерфейс драйвера
Интерфейс драйвера предоставляется производителем базы данных, и вам, как Java-разработчику, нужно использовать только интерфейс драйвера. Для подключения к базе данных в программировании сначала должен быть загружен драйвер базы данных конкретного производителя, а разные базы данных имеют разные методы загрузки. как:
-
Загрузите драйвер MySql: Class.forName("com.mysql.jdbc.Driver");
-
Загрузите драйвер Oracle: Class.forName("oracle.jdbc.driver.OracleDriver");
2. интерфейс подключения
Соединение Соединение (сеанс) с определенной базой данных, выполняет операторы sql в контексте соединения и возвращает результаты. Метод DriverManager.getConnection(url, user, password) основан на подключении к базе данных, определенном в URL-адресе JDBC.
-
Подключиться к базе данных MySql: Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");
-
Подключение к базе данных Oracle: Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:database", "user", "password");
-
Подключитесь к базе данных SqlServer: Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://host:port; DatabaseName=database", "user", "password");
Общий метод:
- createStatement(): создать объект оператора, который отправляет sql в базу данных.
- prepareStatement(sql) : создает объект PrepareStatement, который отправляет предварительно скомпилированный sql в базу данных.
- prepareCall(sql): создает объект callableStatement, который выполняет хранимую процедуру.
- setAutoCommit(boolean autoCommit): Укажите, будет ли транзакция автоматически зафиксирована.
- commit(): фиксирует транзакцию по ссылке.
- rollback() : откатить транзакцию по этой ссылке.
3. Интерфейс заявления
Объект, используемый для выполнения статического оператора SQL и возврата полученного результата.
Три класса операторов:
- Заявление: создается createStatement для отправки простых операторов SQL (без параметров).
- PreparedStatement: унаследован от интерфейса Statement, созданного с помощью prepareStatement, который используется для отправки инструкций SQL с одним или несколькими параметрами. Объекты PreparedStatement более эффективны, чем объекты Statement, и могут предотвратить внедрение SQL, поэтому мы обычно используем PreparedStatement.
- CallableStatement: наследуется от интерфейса PreparedStatement, создается методом prepareCall и используется для вызова хранимой процедуры.
Общие методы заявления:
- выполнить (строка sql): запустить оператор и вернуть, есть ли набор результатов
- executeQuery(String sql): запустите оператор select и верните набор результатов ResultSet.
- executeUpdate(String sql): запустить операцию вставки/обновления/удаления и вернуть количество обновленных строк.
- addBatch(String sql) : Поместите несколько операторов sql в пакет.
- executeBatch(): отправляет пакет операторов SQL в базу данных для выполнения.
4. Интерфейс набора результатов
ResultSet предоставляет методы для получения полей разных типов, обычно используемые:
- GetString (String ColumnName): получает объекты данных, такие как varchar, char и т. д. в базе данных.
- GetFloat (InDex): GetFloat: получение объектов данных, которые являются типами с плавающей запятой в базе данных.
- getDate (int index), getDate (String columnName): получить данные типа Date в базе данных.
- getBoolean (int index), getBoolean (String columnName): получить данные логического типа в базе данных.
- getObject(int index), getObject(String columnName): получить любой тип данных в базе данных.
ResultSet также предоставляет методы для прокрутки набора результатов:
- next(): перейти к следующей строке
- Предыдущий(): перейти на предыдущую строку
- absolute(int row): перейти к указанной строке
- beforeFirst(): переместите начало результирующего набора.
- afterLast() : перейти в конец набора результатов.
После использования закройте объект и соединение по очереди:ResultSet → Заявление → Соединение
Пять, основные шаги использования JDBC
1. Зарегистрируйте драйвер
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
2. Установите соединение
//DriverManager.getConnection("jdbc:mysql://localhost/test?user=SIHAI&password=SIHAI");
//2. 建立连接 参数一: 协议 + 访问的数据库 , 参数二: 用户名 , 参数三: 密码。
conn = DriverManager.getConnection("jdbc:mysql://localhost/student", "root", "root");
3. Создать выписку
//3. 创建statement , 跟数据库打交道,一定需要这个对象
st = conn.createStatement();
4. Выполните sql, чтобы получить ResultSet
//4. 执行查询 , 得到结果集
String sql = "select * from t_stu";
rs = st.executeQuery(sql);
5. Пройдитесь по набору результатов
//5. 遍历查询每一条记录
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println("id="+id + "===name="+name+"==age="+age);
}
6. Освободите ресурсы
if (rs != null) {
try {
rs.close();
} catch (SQLException sqlEx) { } // ignore
rs = null;
}
Шесть, построение класса инструментов JDBC
1. Интеграция работы по выпуску ресурсов
/**
* 释放资源
* @param conn
* @param st
* @param rs
*/
public static void release(Connection conn , Statement st , ResultSet rs){
closeRs(rs);
closeSt(st);
closeConn(conn);
}
private static void closeRs(ResultSet rs){
try {
if(rs != null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
rs = null;
}
}
private static void closeSt(Statement st){
try {
if(st != null){
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
st = null;
}
}
private static void closeConn(Connection conn){
try {
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
conn = null;
}
}
2. Антивторичная регистрация водителя
/**
* 获取连接对象
* @return
*/
public static Connection getConn(){
Connection conn = null;
try {
Class.forName(driverClass);
//静态代码块 ---> 类加载了,就执行。 java.sql.DriverManager.registerDriver(new Driver());
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//DriverManager.getConnection("jdbc:mysql://localhost/test?user=monty&password=greatsqldb");
//2. 建立连接 参数一: 协议 + 访问的数据库 , 参数二: 用户名 , 参数三: 密码。
conn = DriverManager.getConnection(url, name, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
3. Используйте файл конфигурации свойств
- Объявите файл xxx.properties под src и выложите содержимое:
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/student
name=root
password=root
- В классе инструмента используйте статический блок кода для чтения свойств
static{
try {
//1. 创建一个属性配置对象
Properties properties = new Properties();
InputStream is = new FileInputStream("jdbc.properties"); //对应文件位于工程根目录
//使用类加载器,去读取src底下的资源文件。 后面在servlet //对应文件位于src目录底下
//InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
//导入输入流。
properties.load(is);
//读取属性
driverClass = properties.getProperty("driverClass");
url = properties.getProperty("url");
name = properties.getProperty("name");
password = properties.getProperty("password");
} catch (Exception e) {
e.printStackTrace();
}
}
Исходный код выглядит следующим образом:
public class JDBCUtil {
static String driverClass = null;
static String url = null;
static String name = null;
static String password= null;
static{
try {
//1. 创建一个属性配置对象
Properties properties = new Properties();
InputStream is = new FileInputStream("jdbc.properties");
//使用类加载器,去读取src底下的资源文件。 后面在servlet
// InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
//导入输入流。
properties.load(is);
//读取属性
driverClass = properties.getProperty("driverClass");
url = properties.getProperty("url");
name = properties.getProperty("name");
password = properties.getProperty("password");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接对象
* @return
*/
public static Connection getConn(){
Connection conn = null;
try {
Class.forName(driverClass);
//静态代码块 ---> 类加载了,就执行。 java.sql.DriverManager.registerDriver(new Driver());
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//DriverManager.getConnection("jdbc:mysql://localhost/test?user=monty&password=greatsqldb");
//2. 建立连接 参数一: 协议 + 访问的数据库 , 参数二: 用户名 , 参数三: 密码。
conn = DriverManager.getConnection(url, name, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* 释放资源
* @param conn
* @param st
* @param rs
*/
public static void release(Connection conn , Statement st , ResultSet rs){
closeRs(rs);
closeSt(st);
closeConn(conn);
}
private static void closeRs(ResultSet rs){
try {
if(rs != null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
rs = null;
}
}
private static void closeSt(Statement st){
try {
if(st != null){
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
st = null;
}
}
private static void closeConn(Connection conn){
try {
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
conn = null;
}
}
}
7. CRUD базы данных
- операция вставки
INSERT INTO t_stu (NAME , age) VALUES ('wangqiang',28)
INSERT INTO t_stu VALUES (NULL,'wangqiang2',28)
// 1. 获取连接对象
conn = JDBCUtil.getConn();
// 2. 根据连接对象,得到statement
st = conn.createStatement();
//3. 执行添加
String sql = "insert into t_stu values(null , 'aobama' , 59)";
//影响的行数, ,如果大于0 表明操作成功。 否则失败
int result = st.executeUpdate(sql);
if(result >0 ){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
- удалить операцию
DELETE FROM t_stu WHERE id = 6
// 1. 获取连接对象
conn = JDBCUtil.getConn();
// 2. 根据连接对象,得到statement
st = conn.createStatement();
//3. 执行添加
String sql = "delete from t_stu where name='aobama'";
//影响的行数, ,如果大于0 表明操作成功。 否则失败
int result = st.executeUpdate(sql);
if(result >0 ){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
- операция запроса
SELECT * FROM t_stu
// 1. 获取连接对象
conn = JDBCUtil.getConn();
// 2. 根据连接对象,得到statement
st = conn.createStatement();
// 3. 执行sql语句,返回ResultSet
String sql = "select * from t_stu";
rs = st.executeQuery(sql);
// 4. 遍历结果集
while (rs.next()) {
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println(name + " " + age);
}
- операция обновления
UPDATE t_stu SET age = 38 WHERE id = 1;
// 1. 获取连接对象
conn = JDBCUtil.getConn();
// 2. 根据连接对象,得到statement
st = conn.createStatement();
//3. 执行添加
String sql = "update t_stu set age = 26 where name ='qyq'";
//影响的行数, ,如果大于0 表明操作成功。 否则失败
int result = st.executeUpdate(sql);
if(result >0 ){
System.out.println("更新成功");
}else{
System.out.println("更新失败");
}
8. Используйте модульные тесты для проверки кода
1. Определите класс TestXXX, который определяет метод testXXX.
Это название не обязательно должно быть именно таким, но с таким названием проще понять смысл теста, поэтому рекомендуется знать название по имени.
2. Добавьте поддержку junit.
Щелкните проект правой кнопкой мыши --- добавьте библиотеку --- Junit --- Junit4
3. Добавьте к методу аннотацию, которая фактически является меткой.
/**
* 使用junit执行单元测试
*/
public class TestDemo {
@Test
public void testQuery() {
// 查询
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
// 1. 获取连接对象
conn = JDBCUtil.getConn();
// 2. 根据连接对象,得到statement
st = conn.createStatement();
// 3. 执行sql语句,返回ResultSet
String sql = "select * from t_stu";
rs = st.executeQuery(sql);
// 4. 遍历结果集
while (rs.next()) {
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println(name + " " + age);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.release(conn, st, rs);
}
}
@Test
public void testInsert(){
// 查询
Connection conn = null;
Statement st = null;
try {
// 1. 获取连接对象
conn = JDBCUtil.getConn();
// 2. 根据连接对象,得到statement
st = conn.createStatement();
//3. 执行添加
String sql = "insert into t_stu values(null , 'aobama' , 59)";
//影响的行数, ,如果大于0 表明操作成功。 否则失败
int result = st.executeUpdate(sql);
if(result >0 ){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCUtil.release(conn, st);
}
}
@Test
public void testDelete(){
// 查询
Connection conn = null;
Statement st = null;
try {
// 1. 获取连接对象
conn = JDBCUtil.getConn();
// 2. 根据连接对象,得到statement
st = conn.createStatement();
//3. 执行添加
String sql = "delete from t_stu where name='aobama'";
//影响的行数, ,如果大于0 表明操作成功。 否则失败
int result = st.executeUpdate(sql);
if(result >0 ){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCUtil.release(conn, st);
}
}
@Test
public void testUpdate(){
// 查询
Connection conn = null;
Statement st = null;
try {
// 1. 获取连接对象
conn = JDBCUtil.getConn();
// 2. 根据连接对象,得到statement
st = conn.createStatement();
//3. 执行添加
String sql = "update t_stu set age = 26 where name ='qyq'";
//影响的行数, ,如果大于0 表明操作成功。 否则失败
int result = st.executeUpdate(sql);
if(result >0 ){
System.out.println("更新成功");
}else{
System.out.println("更新失败");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCUtil.release(conn, st);
}
}
}
4. Выберите имя метода с помощью курсора, а затем щелкните правой кнопкой мыши, чтобы выполнить модульный тест. Или откройте представление структуры, а затем выберите метод, щелкнув правой кнопкой мыши, чтобы выполнить его.
9. Режим Дао
Объект доступа к данным
DAO (объект доступа к данным) Объект доступа к данным — это объектно-ориентированный интерфейс базы данных, который предоставляет механизм базы данных Microsoft Jet (используемый Microsoft Access) и позволяет разработчикам Visual Basic напрямую подключаться к другим базам данных через ODBC к таблице Access. DAO лучше всего подходят для односистемных приложений или небольших локальных дистрибутивов.
1. Создайте новый интерфейс dao, в котором объявляются правила доступа к базе данных.
/**
* 定义操作数据库的方法
*/
public interface UserDao {
/**
* 查询所有
*/
void findAll();
}
2. Создайте новый класс реализации dao для реализации определенных ранее правил.
public class UserDaoImpl implements UserDao{
@Override
public void findAll() {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
//1. 获取连接对象
conn = JDBCUtil.getConn();
//2. 创建statement对象
st = conn.createStatement();
String sql = "select * from t_user";
rs = st.executeQuery(sql);
while(rs.next()){
String userName = rs.getString("username");
String password = rs.getString("password");
System.out.println(userName+"="+password);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.release(conn, st, rs);
}
}
}
3. Используйте реализацию напрямую
@Test
public void testFindAll(){
UserDao dao = new UserDaoImpl();
dao.findAll();
}
10. Вопросы безопасности заявлений
1. Выполнение оператора на самом деле представляет собой объединение операторов sql. Сначала соедините операторы SQL, а затем выполните их вместе.
String sql = "select * from t_user where username='"+ username +"' and password='"+ password +"'";
UserDao dao = new UserDaoImpl();
dao.login("admin", "100234khsdf88' or '1=1");
SELECT * FROM t_user WHERE username='admin' AND PASSWORD='100234khsdf88' or '1=1'
//前面先拼接sql语句, 如果变量里面带有了 数据库的关键字,那么一并认为是关键字。 不认为是普通的字符串。
rs = st.executeQuery(sql);
PrepareStatement
Этот объект должен заменить предыдущий объект оператора.
- Предварительно обработайте данный оператор sql и выполните проверку его синтаксиса по сравнению с предыдущим оператором. Используйте заполнитель ? в операторе sql, чтобы заменить переменную, которая будет передана позже. Значение переменной, которое появится позже, будет обработано как строка, и ключевые слова не будут сгенерированы.
String sql = "insert into t_user values(null , ? , ?)";
ps = conn.prepareStatement(sql);
//给占位符赋值 从左到右数过来,1 代表第一个问号, 永远你是1开始。
ps.setString(1, userName);
ps.setString(2, password);
Подготовленное заявление против заявления
(1) При использовании PreparedStatement читабельность и ремонтопригодность кода выше, чем при использовании Statement.
(2) PreparedStatement может максимизировать производительность.
DBServer обеспечивает оптимизацию производительности для подготовленных операторов. Поскольку предварительно скомпилированный оператор может вызываться повторно, код выполнения оператора после компиляции компилятором DBServer кэшируется, поэтому при следующем вызове, если это тот же предварительно скомпилированный оператор, его не нужно компилировать. , если параметры передаются напрямую в Скомпилированный оператор выполняет код и выполняется.
В операторе оператора, даже если это одна и та же операция, но поскольку содержимое данных отличается, весь оператор не может быть сопоставлен, и нет смысла кэшировать оператор. Дело в том, что ни одна база данных не кэширует скомпилированный код выполнения обычных операторов. Таким образом, входящий оператор компилируется один раз при каждом его выполнении.
(3) PreparedStatement может гарантировать безопасность, но у Statement есть проблемы с безопасностью, такие как SQL-инъекция.
Одиннадцать, транзакции базы данных
1 Обзор
В базе данных так называемая транзакция относится к группе логических операций, которые переводят данные из одного состояния в другое.
Для обеспечения непротиворечивости данных в базе данных манипулирование данными должно представлять собой дискретный набор логических единиц: когда все это завершено, непротиворечивость данных может поддерживаться, а когда часть операции в этой единице дает сбой, всю транзакцию следует рассматривать как единое целое, при ошибках следует откатить все операции после начальной точки до исходного состояния.
Операция транзакции: сначала определите и запустите транзакцию, а затем измените данные. В это время, если вы зафиксируете (COMMIT), эти изменения будут навсегда сохранены. Если вы откатитесь (ROLLBACK), система управления базой данных откажется от всех ваши изменения и обратно в состояние, когда транзакция была запущена.
2. ACID-свойства транзакций
2.1 Атомарность
Атомарность означает, что транзакция является неделимой единицей работы, и операции в транзакции выполняются либо все, либо ни одна из них.
2.2 Консистенция
Транзакция должна вызывать переход базы данных из одного согласованного состояния в другое. (Данные не повреждены)
2.3 Изоляция
Изоляция транзакции означает, что выполнение транзакции не может быть нарушено другими транзакциями, то есть операции и данные, используемые в транзакции, изолированы от других параллельных транзакций, и одновременно выполняемые транзакции не могут мешать друг другу.
2.4 Долговечность
Долговечность означает, что как только транзакция зафиксирована, ее изменения в данных в базе данных являются постоянными, и последующие операции и сбои базы данных не должны иметь никакого влияния на нее.
3. Обработка транзакций JDBC
В JDBC транзакции автоматически фиксируются по умолчанию.Каждый раз, когда выполняется оператор SQL, если выполнение выполняется успешно, оно будет автоматически зафиксировано в базе данных и не может быть отменено.
Чтобы выполнить несколько операторов SQL как транзакцию, вызовите setAutoCommit(false); для объекта Connection, чтобы отменить транзакцию автоматической фиксации:
conn.setAutoCommit(false);
После успешного выполнения всех операторов SQL вызовите метод commit(); для фиксации транзакции.
conn.commit();
Когда возникает исключение, вызовите метод rollback(); для отката транзакции и, как правило, выполните операцию отката в модуле catch.
conn.rollback();
Метод фиксации текущей транзакции можно получить с помощью метода подключения getAutoCommit().
Примечание. InnoDB, механизм хранения базы данных в MySQL, поддерживает транзакции, а MyISAM — нет.
12. Пакетная обработка операторов JDBC
1 Обзор
Когда вам нужно вставлять или обновлять записи в пакетах. Можно использовать механизм пакетного обновления Java, который позволяет одновременно отправлять несколько операторов в базу данных для пакетной обработки. Часто более эффективно, чем отдельная обработка фиксации.
Оператор пакетной обработки JDBC включает следующие два метода:
- addBatch(String): добавление инструкций или параметров SQL, которые необходимо обрабатывать пакетами;
- executeBatch(); выполнять операторы пакетной обработки;
Обычно мы сталкиваемся с двумя случаями пакетного выполнения операторов SQL:
- Пакетная обработка нескольких операторов SQL;
- Пакетная передача параметров оператора SQL;
2. Пакетная обработка выписки
Statement sm = conn.createStatement();
sm.addBatch(sql1);
sm.addBatch(sql2);
...
//批量处理
sm.executeBatch()
//清除sm中积攒的参数列表
sm.clearBatch();
3. Пакетные параметры PreparedStatement
preparedStatement ps = conn.preparedStatement(sql);
for(int i=1;i<100000;i++){
ps.setInt(1, i);
ps.setString(2, "name"+i);
ps.setString(3, "email"+i);
ps.addBatch();
if((i+1)%1000==0){
//批量处理
ps.executeBatch();
//清空ps中积攒的sql
ps.clearBatch();
}
}
Примечание. MySQL не поддерживает пакетную обработку.
Пакетная обработка должна установить верхний предел.Когда sql в списке пакетной обработки накапливается до определенного количества, он должен быть выполнен, и после завершения выполнения список пакетной обработки должен быть очищен.
Как правило, пакетная обработка используется при импорте данных в Excel.
13. Используйте JDBC для обработки метаданных
1 Обзор
После того, как Java получает соединение через JDBC, она получает объект Connection, из которого можно получить различную информацию о системе управления базой данных, включая различные таблицы в базе данных, различные столбцы в таблице, типы данных, триггеры, хранимые процедуры и т. д. Информация. На основе этой информации JDBC может получить доступ к базе данных, о которой реализация не знает заранее.
Методы получения этой информации реализованы на объектах класса DatabaseMetaData, а объект DataBaseMetaData получен на объекте Connection.
2. Получить метаданные базы данных
Класс DatabaseMetaData предоставляет множество методов для получения различной информации об источнике данных, с помощью которых можно очень подробно узнать информацию о базе данных:
- getURL(): возвращает объект String, представляющий URL-адрес базы данных.
- getUserName(): возвращает имя пользователя, подключенного к текущей системе управления базами данных.
- isReadOnly(): возвращает логическое значение, указывающее, разрешает ли база данных только операции чтения.
- getDatabaseProductName(): возвращает название продукта базы данных.
- getDatabaseProductVersion(): возвращает номер версии базы данных.
- getDriverName(): возвращает имя драйвера драйвера.
- getDriverVersion(): возвращает номер версии драйвера.
3. ResultSetMetaData
Объект, который можно использовать для получения информации о типах и свойствах столбцов в объекте ResultSet:
- getColumnName(int column): получить имя указанного столбца
- getColumnCount(): возвращает количество столбцов в текущем объекте ResultSet.
- getColumnTypeName(int column): извлекает имя типа для конкретной базы данных указанного столбца.
- getColumnDisplaySize(int column): указывает максимальную стандартную ширину указанного столбца в символах.
- isNullable(int column): указывает, допускает ли значение в указанном столбце значение NULL.
- isAutoIncrement(int column): указывает, следует ли автоматически нумеровать указанные столбцы, чтобы эти столбцы по-прежнему были доступны только для чтения.
14. Создайте прокручиваемый, обновляемый набор записей
1. Statement
Statement stmt = conn.createStatement(type,concurrency);
2. PreparedStatement
PreparedStatement stmt = conn.prepareStatement(sql,type,concurrency);
описание типа:
Тип набора результатов | инструкция |
---|---|
TYPE_FORWARD_ONLY | Набор результатов нельзя прокручивать, его можно прокручивать только вперед |
TYPE_SCROLL_INSENSITIVE | Двусторонняя прокрутка, но не обновленная вовремя, то есть если данные в базе были изменены, то это не будет отражено в ResultSet |
TYPE_SCROLL_SENSITIVE | Двусторонняя прокрутка и своевременное отслеживание обновлений базы данных для изменения данных в ResultSet |
Описание параллелизма (тип параллелизма):
Параллелизм ResultSet (тип параллелизма) | инструкция |
---|---|
CONCUR_READ_ONLY | Набор результатов недоступен для обновления базы данных |
CONCUR_UPDATABLE | Набор результатов можно использовать для обновления базы данных. |
3. Использование набора результатов с прокруткой ResultSet
First:перемещает указатель на первую строку этого объекта ResultSet
Last:перемещает указатель на последнюю строку этого объекта ResultSet
beforeFirst:перемещает указатель в начало этого объекта ResultSet, непосредственно перед первой строкой
afterLast:перемещает указатель в конец этого объекта ResultSet сразу после последней строки
isFirst:Получает, находится ли указатель в первой строке этого объекта ResultSet
isLast:Получает, находится ли указатель на последней строке этого объекта ResultSet
isBeforeFirst:извлекает, находится ли указатель перед первой строкой этого объекта ResultSet
isAfterLast:извлекает, находится ли указатель после последней строки этого объекта ResultSet
Relative:Перемещайте указатель по относительным линиям (положительным или отрицательным).
Next:Переместить указатель вниз на одну строку от текущей позиции
Previous:перемещает указатель на предыдущую строку этого объекта ResultSet
Absolute:перемещает указатель на заданный номер строки этого объекта ResultSet
как:
rs.absolute(80); //将指针移动到ResultSet 对象的第80行记录。
**Примечание.** Эта функция действительна для данных Oralce. Но это недопустимо в базе данных Mysql, Mysql поддерживает толькоTYPE_SCROLL_INSENSITIVE,CONCUR_READ_ONLY
.
15. Пул соединений JDBC
1. Зачем использовать пул соединений JDBC
Обычные соединения JDBC с базой данных получаются с помощью DriverManager.Каждый раз, когда соединение с базой данных устанавливается, соединение должно быть загружено в память, а затем должны быть проверены имя пользователя и пароль. Когда требуется соединение с базой данных, оно запрашивается из базы данных, и соединение разрывается после завершения выполнения. Этот метод потребует много ресурсов и времени. Ресурсы подключения к базе данных плохо используются повторно.Если в сети одновременно находятся сотни или даже тысячи людей, частые операции подключения к базе данных будут занимать много системных ресурсов и даже вызывать сбои сервера.
Каждое соединение с базой данных должно быть разорвано после использования. В противном случае, если программа не закроется из-за исключения, это вызовет утечку памяти в системе баз данных, что в конечном итоге приведет к перезапуску базы данных.
Этот вид разработки не может контролировать количество создаваемых объектов подключения, а системные ресурсы будут распределяться без учета, слишком большое количество подключений также может привести к утечкам памяти и сбоям сервера.
Чтобы решить проблему подключения к базе данных в традиционной разработке, можно использовать технологию пула подключений к базе данных.
2. Пул соединений с базой данных (пул соединений)
Основная идея пула соединений с базой данных заключается в создании «буферного пула» для соединений с базой данных. Заранее поместите определенное количество соединений в буферный пул.Когда вам нужно установить соединение с базой данных, вам нужно всего лишь взять одно из «буферного пула» и вернуть его после использования.
Пул соединений с базой данных отвечает за выделение, управление и освобождение соединений с базой данных.Он позволяет приложениям повторно использовать существующее соединение с базой данных вместо его повторной установки.
Пул соединений с базой данных создаст определенное количество соединений с базой данных в пуле соединений во время инициализации, и количество этих соединений с базой данных задается минимальным числом соединений с базой данных. Независимо от того, используются ли эти соединения с базой данных, пул соединений всегда будет иметь как минимум это количество соединений. Максимальное количество подключений к базе данных в пуле подключений ограничивает максимальное количество подключений, которое может занимать пул подключений.Когда количество подключений, запрашиваемых приложением к пулу подключений, превышает максимальное количество подключений, эти запросы будут добавлены в очередь ожидания.
3. Как работает пул соединений с базой данных
4. Преимущества использования пула соединений с базой данных
(1) Повторное использование ресурсов:
Поскольку соединения с базой данных используются повторно, можно избежать большого снижения производительности, вызванного частым созданием и освобождением соединений. С другой стороны, на основе снижения потребления системы также повышается стабильность операционной среды системы.
(2) более высокая скорость отклика системы
В процессе инициализации пула соединений с базой данных часто создается несколько соединений с базой данных, которые помещаются в резервный пул соединений. На этом инициализация соединения завершена. Для обработки бизнес-запросов напрямую используются существующие доступные соединения, что позволяет избежать дополнительных затрат времени на инициализацию и освобождение соединения с базой данных, тем самым сокращая время отклика системы.
(3) Новые способы распределения ресурсов
Для системы, в которой несколько приложений совместно используют одну и ту же базу данных, конфигурация пула соединений с базой данных на уровне приложения может ограничить максимальное количество соединений с базой данных, доступных для приложения, и предотвратить монополизацию приложением всех ресурсов базы данных.
(4) Унифицированное управление соединениями во избежание утечки соединения с базой данных. В относительно полной реализации пула соединений с базой данных занятые соединения могут быть принудительно восстановлены в соответствии с настройкой тайм-аута перед занятием, что позволяет избежать возможной утечки ресурсов в обычных операциях соединения с базой данных.
5. Введение в общие пулы соединений с базами данных
Пул соединений с базой данных JDBC представлен javax.sql.DataSource.DataSource — это просто интерфейс, который обычно реализуется серверами (Weblogic, WebSphere, Tomcat), а некоторые организации с открытым исходным кодом предоставляют реализации, такие как:
- Пул соединений с базой данных DBCP
- Пул соединений с базой данных C3P0
- Пул соединений с базой данных Proxpool
Среди них чаще используются DBCP и C3P0.
Версии Tomcat до 7.0 использовали commons-dbcp в качестве реализации пула соединений.
Источники данных отличаются от подключений к базе данных. Нет необходимости создавать несколько источников данных. Это фабрика, которая создает подключения к базе данных, поэтому всему приложению нужен только один источник данных.
Когда доступ к базе данных заканчивается, программа закрывает соединение с базой данных, как и раньше:conn.close();
Но он не закрывает физическое соединение с базой данных, а просто освобождает соединение с базой данных и возвращает его в пул соединений с базой данных.
Это об основах.Надеюсь всем поможет.Если будут вопросы,можете общаться.