当前位置:网站首页>Principes JDBC
Principes JDBC
2022-07-06 10:59:00 【Pasteurella】
Catalogue des articles
- Mode de connexion à la base de données
- Mode 1:DriverImplémenter des objets de classe pour obtenir des connexions
- Mode 2:“Itération du mode 1”,Sans tiersapiRendre le programme plus portable
- Mode 3:DriverManagerRemplacerDriver
- Mode 4:Charger l'entraînement,Pas besoin d'afficher le pilote d'enregistrement.
- Mode 5(finalÉdition):Nécessaire pour connecter la base de données4Les informations de base sont déclarées dans le fichier de configuration,En lisant le profil,Obtenir la connexion
- PreparedStatementRequête
- PourCustomersAjouter, supprimer et modifier des tableaux
- EncapsulationJDBCUtils
- PourCustomersAjout, suppression et modification du tableau général
- PourCustomersL'opération de requête du tableau renvoie un enregistrement
- PourCustomersOpérations de requête communes pour les tables
- L'ajout, la suppression et la modification d'une transaction de base de données ne sont pas pris en compte
- Ajout, suppression et modification généraux après prise en compte des transactions dans la base de données
- Requêtes communes après prise en compte des transactions de base de données
- JDBCUtils(Y compris le pool de connexion)
- BaseDAO/DAO
- DbUtils
Mode de connexion à la base de données
Si oui, si la version du paquet pilote est 8.xEt si,propertiesDans le fichierdriverClassLe chemin verscom.mysql.cj.jdbc.Driver,Ce n'est pas l'originalcom.mysql.jdbc.Driver
Mode 1:DriverImplémenter des objets de classe pour obtenir des connexions
@Test
public void testConnection1() throws SQLException {
// AccèsDriverImplémenter des objets de classe
Driver driver = new com.mysql.jdbc.Driver();
// url:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
// `jdbc:mysql`:Accord
// localhost:ipAdresse
// 3306:Par défautmysqlNuméro de port pour
// test:testBase de données
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8";
// Encapsuler le nom d'utilisateur et le mot de passe dansPropertiesMoyenne
Properties info = new Properties();
info.setProperty("user", "root");
info.setProperty("password", "abc123");
Connection conn = driver.connect(url, info);
System.out.println(conn);
}
Description:Le code ci - dessus montre explicitement queAPI
Mode 2:“Itération du mode 1”,Sans tiersapiRendre le programme plus portable
@Test
public void testConnection2() throws Exception {
// 1.AccèsDriverImplémenter des objets de classe:Utiliser la réflexion
//AppelezClassMéthode statique pour obtenirClassExemple de classe:forName(String classPath)
Class clazz = Class.forName("com.mysql.jdbc.Driver");
//AppelezClassObjetnewInstance() Méthode pour obtenir la classe d'exécution (new com.mysql.jdbc.Driver())Objet de
Driver driver = (Driver) clazz.newInstance();
// 2.Fournir la base de données à laquelle se connecter
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8";
// 3.Fournir le nom d'utilisateur et le mot de passe nécessaires à la connexion
Properties info = new Properties();
info.setProperty("user", "root");
info.setProperty("password", "abc123");
// 4.Obtenir la connexion
Connection conn = driver.connect(url, info);
System.out.println(conn);
}
Description:Par rapport au mode 1,L'Instanciation de réflexion est utilisée iciDriver,Ne pas représenter une base de données tierce partie dans le CodeAPI.Incarne l'idée de Programmation orientée interface.
Mode 3:DriverManagerRemplacerDriver
@Test
public void testConnection3() throws Exception {
// 1.AccèsDriverObjet de la classe d'implémentation
Class clazz = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver) clazz.newInstance();
// 2.Fournit des informations de base sur les trois autres connexions:
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8";
String user = "root";
String password = "abc123";
// Enregistrer le pilote
DriverManager.registerDriver(driver);
// Obtenir la connexion
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
Description:UtiliserDriverManagerImplémenter la connexion à la base de données.Comprendre la nécessité d'obtenir une connexion4Éléments de base.
Mode 4:Charger l'entraînement,Pas besoin d'afficher le pilote d'enregistrement.
@Test
public void testConnection4() throws Exception {
// 1. Fournit des informations de base sur les trois connexions :
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8";
String user = "root";
String password = "abc123";
// 2.ChargementDriver
Class.forName("com.mysql.jdbc.Driver");
// Par rapport au mode 3 , Les opérations suivantes peuvent être omises: :
// Driver driver = (Driver) clazz.newInstance();
// // Enregistrer le pilote
// DriverManager.registerDriver(driver);
// Pourquoi omettre ce qui précède? ?
/* * InmysqlDeDriverDans la classe de mise en œuvre, Les actions suivantes sont déclarées: : * static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } } */
// 3.Obtenir la connexion
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
Description:Il n'est pas nécessaire d'enregistrer explicitement le pilote.Parce queDriverManagerUn bloc de code statique existe déjà dans le code source de,Mise en œuvre de l'enregistrement des pilotes.
Mode 5(finalÉdition):Nécessaire pour connecter la base de données4Les informations de base sont déclarées dans le fichier de configuration,En lisant le profil,Obtenir la connexion
/*Les avantages de cette approche? * 1.La séparation des données du Code est réalisée.Découplage réalisé * 2.Si vous devez modifier les informations du profil,Évitez de reconditionner le programme.*/
@Test
public void getConnection5() throws Exception{
//1.Lire dans le fichier de configuration4Informations de base
//.classAccèsClassExemple de classe
//getClassLoader Obtient le chargeur de classe système pour la classe
//getResourceAsStreamObtient le flux d'entrée du fichier spécifié sous le chemin de classe
InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties pros = new Properties();
pros.load(is);
String user = pros.getProperty("user");
String password = pros.getProperty("password");
String url = pros.getProperty("url");
String driverClass = pros.getProperty("driverClass");
//2.Charger l'entraînement--ChargementDriver
Class.forName(driverClass);
// Enregistrer le pilote Driver Bloc de code statique déclaré dans la classe d'implémentation
//3.Obtenir la connexion
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
Parmi eux,Déclaration du profil dans le projetsrcSous la table des matières:【jdbc.properties】
user=root
password=abc123
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
driverClass=com.mysql.jdbc.Driver
Description:Enregistrer les informations de configuration en utilisant le profil,Charger le fichier de configuration dans le Code
Avantages de l'utilisation de profils:
①La séparation du Code et des données est réalisée,Si vous devez modifier les informations de configuration,Modifier directement dans le profil,Pas besoin de code profond
②Si les informations de configuration sont modifiées,Évitez le processus de recompilation.
PreparedStatementRequête
jdbc.properties
user=root
password=abc123
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
driverClass=com.mysql.jdbc.Driver
PourCustomersAjouter, supprimer et modifier des tableaux
public class PreparedStatementUpdateTest {
//ModifiercustomersUn enregistrement du tableau
@Test
public void testUpdate(){
Connection conn = null;
PreparedStatement ps = null;
try {
//1.Obtenir une connexion à la base de données
conn = JDBCUtils.getConnection();
//2.PrécompilésqlDéclarations,RetourPreparedStatementExemples
String sql = "update customers set name = ? where id = ?";
ps = conn.prepareStatement(sql);
//3.Remplir les substituants
ps.setObject(1,"Mozart");
ps.setObject(2, 18);
//4.Mise en œuvre
ps.execute();
} catch (Exception e) {
e.printStackTrace();
}finally{
//5.Fermeture des ressources
JDBCUtils.closeResource(conn, ps);
}
}
// VerscustomersAjouter un enregistrement au tableau
@Test
public void testInsert() {
Connection conn = null;
PreparedStatement ps = null;
try {
// 1.Lire dans le fichier de configuration4Informations de base
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
Properties pros = new Properties();
pros.load(is);
String user = pros.getProperty("user");
String password = pros.getProperty("password");
String url = pros.getProperty("url");
String driverClass = pros.getProperty("driverClass");
// 2.Charger l'entraînement
Class.forName(driverClass);
// 3.Obtenir la connexion
conn = DriverManager.getConnection(url, user, password);
//4.PrécompilésqlDéclarations,RetourPreparedStatementExemples
String sql = "insert into customers(name,email,birth)values(?,?,?)";//?:Placeholder
ps = conn.prepareStatement(sql);
//5.Remplir les substituants
ps.setString(1, "Nezha");
ps.setString(2, "[email protected]");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
java.util.Date date = sdf.parse("1000-01-01");
ps.setDate(3, new Date(date.getTime()));
//6.Exécution des opérations
ps.execute();
} catch (Exception e) {
e.printStackTrace();
}finally{
//7.Fermeture des ressources
try {
if(ps != null)
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
EncapsulationJDBCUtils
public class JDBCUtils {
/** * @Description Obtenir une connexion à la base de données */
public static Connection getConnection() throws Exception {
// 1.Lire dans le fichier de configuration4Informations de base
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
Properties pros = new Properties();
pros.load(is);
String user = pros.getProperty("user");
String password = pros.getProperty("password");
String url = pros.getProperty("url");
String driverClass = pros.getProperty("driverClass");
// 2.Charger l'entraînement
Class.forName(driverClass);
// 3.Obtenir la connexion
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
}
/** * @Description Fermer les connexions etStatementFonctionnement */
public static void closeResource(Connection conn,Statement ps){
try {
if(ps != null)
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
/** * @Description Fermer l'opération ressource */
public static void closeResource(Connection conn,Statement ps,ResultSet rs){
try {
if(ps != null)
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(rs != null)
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
PourCustomersAjout, suppression et modification du tableau général
//Opérations générales d'ajout, de suppression et de modification
public void update(String sql,Object ...args){
//sqlLe nombre de substituants dans est le même que la longueur du paramètre variable!
Connection conn = null;
PreparedStatement ps = null;
try {
//1.Obtenir une connexion à la base de données
conn = JDBCUtils.getConnection();
//2.PrécompilésqlDéclarations,RetourPreparedStatementExemples
ps = conn.prepareStatement(sql);
//3.Remplir les substituants
for(int i = 0;i < args.length;i++){
ps.setObject(i + 1, args[i]);//Erreur de déclaration des paramètres de prudence!!
}
//4.Mise en œuvre
ps.execute();
} catch (Exception e) {
e.printStackTrace();
}finally{
//5.Fermeture des ressources
JDBCUtils.closeResource(conn, ps);
}
}
PourCustomersL'opération de requête du tableau renvoie un enregistrement
public class CustomerForQuery {
@Test
public void testQuery1() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet resultSet = null;
try {
conn = JDBCUtils.getConnection();
String sql = "select id,name,email,birth from customers where id = ?";
ps = conn.prepareStatement(sql);
ps.setObject(1, 1);
// Mise en œuvre,Et renvoie l'ensemble de résultats
resultSet = ps.executeQuery();
// Traitement de l'ensemble de résultats
if (resultSet.next()) {
// next():Déterminer si l'élément suivant de l'ensemble de résultats contient des données,Si les données sont retournéestrue,Et pointeur vers le bas;Si vous revenezfalse,Le pointeur ne descend pas.
// Obtient les valeurs des champs pour les données actuelles
int id = resultSet.getInt(1);
String name = resultSet.getString(2);
String email = resultSet.getString(3);
Date birth = resultSet.getDate(4);
// Mode 1:
// System.out.println("id = " + id + ",name = " + name + ",email = " + email + ",birth = " + birth);
// Mode 2:
// Object[] data = new Object[]{id,name,email,birth};
// Mode 3:Encapsulation des données en tant qu'objet(Recommandations)
Customer customer = new Customer(id, name, email, birth);
System.out.println(customer);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn, ps, resultSet);
}
}
//-------------------------------------------------------------------
PourCustomersOpérations de requête communes pour les tables
public Customer queryForCustomers(String sql, Object... args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
// Obtenir des métadonnées pour l'ensemble de résultats :ResultSetMetaData
ResultSetMetaData rsmd = rs.getMetaData();
// AdoptionResultSetMetaDataObtient le nombre de colonnes dans l'ensemble de résultats
int columnCount = rsmd.getColumnCount();
if (rs.next()) {
Customer cust = new Customer();
// Traiter chaque colonne d'une ligne de données de l'ensemble de résultats
for (int i = 0; i < columnCount; i++) {
// Obtenir la valeur de colonne
Object columValue = rs.getObject(i + 1);
// Obtenir le nom de colonne pour chaque colonne
// String columnName = rsmd.getColumnName(i + 1);
String columnLabel = rsmd.getColumnLabel(i + 1);
// Voilà.custObjet spécifiécolumnNamePropriétés,Assigner commecolumValue:Par réflexion
Field field = Customer.class.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(cust, columValue);
}
return cust;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn, ps, rs);
}
return null;
}
@Test
public void testQueryForCustomers() {
String sql = "select id,name,birth,email from customers where id = ?";
Customer customer = queryForCustomers(sql, 13);
System.out.println(customer);
sql = "select name,email from customers where name = ?";
Customer customer1 = queryForCustomers(sql, "Jay Chou");
System.out.println(customer1);
}
}
L'ajout, la suppression et la modification d'une transaction de base de données ne sont pas pris en compte
// ****************** Opérations de transfert sans tenir compte des transactions de la base de données **************************
/* * Pour les fiches techniquesuser_tableDis: AAL'utilisateur donneBBTransferts d'utilisateurs100 * * update user_table set balance = balance - 100 where user = 'AA'; update * user_table set balance = balance + 100 where user = 'BB'; */
@Test
public void testUpdate() {
String sql1 = "update user_table set balance = balance - 100 where user = ?";
update(sql1, "AA");
// Exception au réseau analogique
System.out.println(10 / 0);
String sql2 = "update user_table set balance = balance + 100 where user = ?";
update(sql2, "BB");
System.out.println("Transfert réussi");
}
// Opérations générales d'ajout, de suppression et de modification---version 1.0
public int update(String sql, Object... args) {
// sqlLe nombre de substituants dans est le même que la longueur du paramètre variable!
Connection conn = null;
PreparedStatement ps = null;
try {
// 1.Obtenir une connexion à la base de données
conn = JDBCUtils.getConnection();
// 2.PrécompilésqlDéclarations,RetourPreparedStatementExemples
ps = conn.prepareStatement(sql);
// 3.Remplir les substituants
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);// Erreur de déclaration des paramètres de prudence!!
}
// 4.Mise en œuvre
return ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
// Modifier pour soumettre automatiquement les données
// Utilisation de la broche principale pour l'utilisation du pool de connexion à la base de données
try {
conn.setAutoCommit(true);
} catch (SQLException e) {
e.printStackTrace();
}
// 5.Fermeture des ressources
JDBCUtils.closeResource(conn, ps);
}
return 0;
}
Ajout, suppression et modification généraux après prise en compte des transactions dans la base de données
@Test
public void testUpdateWithTx() {
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
System.out.println(conn.getAutoCommit());// true
// 1.Annulation de la soumission automatique des données
conn.setAutoCommit(false);
String sql1 = "update user_table set balance = balance - 100 where user = ?";
update(conn, sql1, "AA");
// Exception au réseau analogique
System.out.println(10 / 0);
String sql2 = "update user_table set balance = balance + 100 where user = ?";
update(conn, sql2, "BB");
System.out.println("Transfert réussi");
// 2.Présentation des données
conn.commit();
} catch (Exception e) {
e.printStackTrace();
// 3.Données de rollback
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
JDBCUtils.closeResource(conn, null);
}
}
//-------------------------------------------------------------------
// Opérations générales d'ajout, de suppression et de modification---version 2.0 (Considérez la question.)
public int update(Connection conn, String sql, Object... args) {
// sqlLe nombre de substituants dans est le même que la longueur du paramètre variable!
PreparedStatement ps = null;
try {
// 1.PrécompilésqlDéclarations,RetourPreparedStatementExemples
ps = conn.prepareStatement(sql);
// 2.Remplir les substituants
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);// Erreur de déclaration des paramètres de prudence!!
}
// 3.Mise en œuvre
return ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 4.Fermeture des ressources
JDBCUtils.closeResource(null, ps);
}
return 0;
}
Requêtes communes après prise en compte des transactions de base de données
public <T> T getInstance(Connection conn, Class<T> clazz, String sql, Object... args) {
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
// Obtenir des métadonnées pour l'ensemble de résultats :ResultSetMetaData
ResultSetMetaData rsmd = rs.getMetaData();
// AdoptionResultSetMetaDataObtient le nombre de colonnes dans l'ensemble de résultats
int columnCount = rsmd.getColumnCount();
if (rs.next()) {
T t = clazz.newInstance();
// Traiter chaque colonne d'une ligne de données de l'ensemble de résultats
for (int i = 0; i < columnCount; i++) {
// Obtenir la valeur de colonne
Object columValue = rs.getObject(i + 1);
// Obtenir le nom de colonne pour chaque colonne
// String columnName = rsmd.getColumnName(i + 1);
String columnLabel = rsmd.getColumnLabel(i + 1);
// Voilà.tObjet spécifiécolumnNamePropriétés,Assigner commecolumValue:Par réflexion
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, columValue);
}
return t;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(null, ps, rs);
}
return null;
}
JDBCUtils(Y compris le pool de connexion)
public class JDBCUtils {
/** * @Description Obtenir une connexion à la base de données */
public static Connection getConnection() throws Exception {
// 1.Lire dans le fichier de configuration4Informations de base
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
Properties pros = new Properties();
pros.load(is);
String user = pros.getProperty("user");
String password = pros.getProperty("password");
String url = pros.getProperty("url");
String driverClass = pros.getProperty("driverClass");
// 2.Charger l'entraînement
Class.forName(driverClass);
// 3.Obtenir la connexion
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
}
//-------------------------------------------------------------------
/** * UtiliserDruidTechnologie des pools de connexion à la base de données */
private static DataSource source;
static{
try {
Properties pros = new Properties();
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
pros.load(is);
source = DruidDataSourceFactory.createDataSource(pros);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection1() throws SQLException{
Connection conn = source.getConnection();
return conn;
}
//-------------------------------------------------------------------
/** * @Description UtiliserDBCP Technologie du pool de connexion à la base de données obtenir la connexion à la base de données */
//Créer unDBCPPool de connexion à la base de données
private static DataSource source1;
static{
try {
Properties pros = new Properties();
FileInputStream is = new FileInputStream(new File("src/dbcp.properties"));
pros.load(is);
source1 = BasicDataSourceFactory.createDataSource(pros);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection2() throws Exception{
Connection conn = source1.getConnection();
return conn;
}
//-------------------------------------------------------------------
/** * @Description UtiliserC3P0 Technologie du pool de connexion à la base de données */
//Le pool de connexion à la base de données n'a besoin que d'un.
private static ComboPooledDataSource cpds = new ComboPooledDataSource("hellc3p0");
public static Connection getConnection4() throws SQLException{
Connection conn = cpds.getConnection();
return conn;
}
//-------------------------------------------------------------------
//-------------------------------------------------------------------
//-------------------------------------------------------------------
/** * @Description Fermer les connexions etStatementFonctionnement */
public static void closeResource(Connection conn,Statement ps){
try {
if(ps != null)
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
/** * @Description FermerResultSet Action sur les ressources de l'ensemble de résultats */
public static void closeResource(Connection conn,Statement ps,ResultSet rs){
try {
if(ps != null)
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(rs != null)
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//-------------------------------------------------------------------
/** * @Description Utiliserdbutils.jarDisponible enDbUtilsClasse d'outils,Réaliser la fermeture des ressources */
public static void closeResource1(Connection conn,Statement ps,ResultSet rs){
// try {
// DbUtils.close(conn);
// } catch (SQLException e) {
// e.printStackTrace();
// }
// try {
// DbUtils.close(ps);
// } catch (SQLException e) {
// e.printStackTrace();
// }
// try {
// DbUtils.close(rs);
// } catch (SQLException e) {
// e.printStackTrace();
// }
DbUtils.closeQuietly(conn);
DbUtils.closeQuietly(ps);
DbUtils.closeQuietly(rs);
}
}
BaseDAO/DAO
DAO: data(base) access object
/** * Encapsulé pour effectuer des opérations générales de base sur la base de données */
public abstract class BaseDAO<T> {
//Obtenir des génériquesTDeClassObjet,Obtenir le type générique,Les génériques ne sont déterminés que lorsqu'ils sont hérités par une sous - classe
private Class<T> clazz ;
// public BaseDAO(){
//
// }
{
//Adoptionthis Obtenir la classe à laquelle appartient la classe mère de la classe à laquelle appartient la classe , Conversion forcée à une classe mère avec des génériques , Obtenir un tableau générique , Prenez le premier type générique
// Parce que c'est une classe abstraite héritée par une sous - classe , Une méthode statique ou une méthode de constructeur est appelée lorsqu'un objet de sous - classe est créé et qu'un constructeur de classe parent est appelé
// Transmis en ce moment this La valeur est la valeur de la classe d'appel, c'est - à - dire la valeur de la classe d'héritage ou de la Sous - classe qui hérite de la classe mère. )
// this.getClass() Obtient le type de sous - classe qui appelle la classe mère
// getGenericSuperclass()Le type de classe parent utilisé pour obtenir la classe courante
//Obtenir le courantBaseDAOLes enfants héritent des génériques de la classe mère
Type genericSuperclass = this.getClass().getGenericSuperclass();
// ParameterizedTypeReprésente un type avec des génériques
ParameterizedType paramType = (ParameterizedType) genericSuperclass;
//Obtient les paramètres génériques de la classe mère
// getActualTypeArgumentsObtenir le type de générique spécifique
// Cette méthode renvoie unType Tableau générique des types
Type[] typeArguments = paramType.getActualTypeArguments();
//Obtenir le type de générique spécifique·Premier paramètre du générique
clazz = (Class<T>) typeArguments[0];
}
//-------------------------------------------------------------------
// Opérations générales d'ajout, de suppression et de modification---version 2.0 (Considérez la question.)
public int update(Connection conn, String sql, Object... args) {
// sqlLe nombre de substituants dans est le même que la longueur du paramètre variable!
PreparedStatement ps = null;
try {
// 1.AccèsPreparedStatementExemples,PrécompilésqlDéclarations
ps = conn.prepareStatement(sql);
// 2.Remplir les substituants
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);//Object Prévenir les erreurs de déclaration des paramètres
}
// 3.Mise en œuvreexecuteUpdate Renvoie le nombre de lignes d'action
return ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 4.Fermeture des ressources
JDBCUtils.closeResource(null, ps);
}
return 0;
}
//-------------------------------------------------------------------
// Opérations générales de recherche,Utilisé pour renvoyer un enregistrement dans la Feuille de données(version 2.0:Considérez la question.)
public T getInstance(Connection conn, String sql, Object... args) {
//
PreparedStatement ps = null;
ResultSet rs = null;
try {
// 1.AccèsPreparedStatement()Exemples,PrécompilésqlDéclarations
ps = conn.prepareStatement(sql);
// 2.Remplir les substituants
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
// 3.Mise en œuvreexecuteQuery()RetourResultSetObjet de l'ensemble de résultats
rs = ps.executeQuery();
// getMetaData()Obtenir des métadonnées pour l'ensemble de résultats :ResultSetMetaData
ResultSetMetaData rsmd = rs.getMetaData();
// Par métadonnéesgetColumnCount()Obtient le nombre de colonnes dans l'ensemble de résultats
int columnCount = rsmd.getColumnCount();
// 4. Traitement des données de ligne de l'ensemble de résultats ,Déterminer si l'élément suivant de l'ensemble de résultats contient des données,Si les données sont retournéestrue,Et pointeur vers le bas;Si vous revenezfalse,Le pointeur ne descend pas.
if (rs.next()) {
//Créer une valeur de retourTObjet de type
T t = clazz.getDeclaredConstructor().newInstance();
// 5. Traiter chaque colonne d'une ligne de données de l'ensemble de résultats
for (int i = 0; i < columnCount; i++) {
// Obtenir la valeur de colonne
Object columValue = rs.getObject(i + 1);
// Obtenir le nom de colonne pour chaque colonne
// String columnName = rsmd.getColumnName(i + 1);
String columnLabel = rsmd.getColumnLabel(i + 1);
// Voilà.tObjet spécifiécolumnLabelPropriétés,Assigner commecolumValue:Par réflexion
//En coursclazz La valeur de est la valeur d'une sous - classe héritant d'un type générique défini dans la classe mère ( Voir l'en - tête du Code pour plus de détails )
//getDeclaredField()Appeler une propriété privée,Obtient la propriété du nom de la variable spécifiée dans la classe d'exécution
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, columValue);
}
return t;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(null, ps, rs);
}
return null;
}
//-------------------------------------------------------------------
// Opérations générales de recherche,Utilisé pour renvoyer un ensemble de plusieurs enregistrements dans une table de données(version 2.0:Considérez la question.)
public List<T> getForList(Connection conn, String sql, Object... args) {
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
// Obtenir des métadonnées pour l'ensemble de résultats :ResultSetMetaData
ResultSetMetaData rsmd = rs.getMetaData();
// AdoptionResultSetMetaDataObtient le nombre de colonnes dans l'ensemble de résultats
int columnCount = rsmd.getColumnCount();
// Créer un objet de collection
ArrayList<T> list = new ArrayList<T>();
while (rs.next()) {
T t = clazz.getDeclaredConstructor().newInstance();
// Traiter chaque colonne d'une ligne de données de l'ensemble de résultats:Voilà.tAttribution de la propriété spécifiée par l'objet
for (int i = 0; i < columnCount; i++) {
// Obtenir la valeur de colonne
Object columValue = rs.getObject(i + 1);
// Obtenir le nom de colonne pour chaque colonne
// String columnName = rsmd.getColumnName(i + 1);
String columnLabel = rsmd.getColumnLabel(i + 1);
// Voilà.tObjet spécifiécolumnNamePropriétés,Assigner commecolumValue:Par réflexion
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, columValue);
}
list.add(t);
}
return list;
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(null, ps, rs);
}
return null;
}
//-------------------------------------------------------------------
//Méthode générale d'interrogation des valeurs spéciales
public <E> E getValue(Connection conn,String sql,Object...args){
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sql);
for(int i = 0;i < args.length;i++){
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
if(rs.next()){
return (E) rs.getObject(1);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtils.closeResource(null, ps, rs);
}
return null;
}
}
DbUtils
/* * commons-dbutils - Oui. Apache Une source ouverte fournie par l'Organisation JDBCBibliothèque de classes d'outils,Encapsulation de l'ajout, de la suppression et de la modification de la base de données * */
public class QueryRunnerTest {
//Test insert
@Test
public void testInsert() {
Connection conn = null;
try {
QueryRunner runner = new QueryRunner();
conn = JDBCUtils.getConnection3();
String sql = "insert into customers(name,email,birth)values(?,?,?)";
int insertCount = runner.update(conn, sql, "Cai xukun","[email protected]","1997-09-08");
System.out.println("Ajouté" + insertCount + "Enregistrement (s)");
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtils.closeResource(conn, null);
}
}
//Test Query
/* * BeanHander:- Oui.ResultSetHandlerClasse d'implémentation de l'interface,Utilisé pour encapsuler un enregistrement dans un tableau. */
@Test
public void testQuery1(){
Connection conn = null;
try {
QueryRunner runner = new QueryRunner();
conn = JDBCUtils.getConnection3();
String sql = "select id,name,email,birth from customers where id = ?";
BeanHandler<Customer> handler = new BeanHandler<>(Customer.class);
Customer customer = runner.query(conn, sql, handler, 23);
System.out.println(customer);
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtils.closeResource(conn, null);
}
}
/* * BeanListHandler:- Oui.ResultSetHandlerClasse d'implémentation de l'interface,Utilisé pour encapsuler un ensemble de plusieurs enregistrements dans un tableau. */
@Test
public void testQuery2() {
Connection conn = null;
try {
QueryRunner runner = new QueryRunner();
conn = JDBCUtils.getConnection3();
String sql = "select id,name,email,birth from customers where id < ?";
BeanListHandler<Customer> handler = new BeanListHandler<>(Customer.class);
List<Customer> list = runner.query(conn, sql, handler, 23);
list.forEach(System.out::println);
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtils.closeResource(conn, null);
}
}
/* * MapHander:- Oui.ResultSetHandlerClasse d'implémentation de l'interface,Correspond à un enregistrement dans le tableau. * Prenez le champ et la valeur du champ correspondant commemapDanskeyEtvalue */
@Test
public void testQuery3(){
Connection conn = null;
try {
QueryRunner runner = new QueryRunner();
conn = JDBCUtils.getConnection3();
String sql = "select id,name,email,birth from customers where id = ?";
MapHandler handler = new MapHandler();
Map<String, Object> map = runner.query(conn, sql, handler, 23);
System.out.println(map);
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtils.closeResource(conn, null);
}
}
/* * MapListHander:- Oui.ResultSetHandlerClasse d'implémentation de l'interface,Plusieurs enregistrements dans le tableau correspondant. * Prenez le champ et la valeur du champ correspondant commemapDanskeyEtvalue.Prends ça.mapAjouter àListMoyenne */
@Test
public void testQuery4(){
Connection conn = null;
try {
QueryRunner runner = new QueryRunner();
conn = JDBCUtils.getConnection3();
String sql = "select id,name,email,birth from customers where id < ?";
MapListHandler handler = new MapListHandler();
List<Map<String, Object>> list = runner.query(conn, sql, handler, 23);
list.forEach(System.out::println);
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtils.closeResource(conn, null);
}
}
/* * ScalarHandler:Pour interroger des valeurs spéciales */
@Test
public void testQuery5(){
Connection conn = null;
try {
QueryRunner runner = new QueryRunner();
conn = JDBCUtils.getConnection3();
String sql = "select count(*) from customers";
ScalarHandler handler = new ScalarHandler();
Long count = (Long) runner.query(conn, sql, handler);
System.out.println(count);
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtils.closeResource(conn, null);
}
}
@Test
public void testQuery6(){
Connection conn = null;
try {
QueryRunner runner = new QueryRunner();
conn = JDBCUtils.getConnection3();
String sql = "select max(birth) from customers";
ScalarHandler handler = new ScalarHandler();
Date maxBirth = (Date) runner.query(conn, sql, handler);
System.out.println(maxBirth);
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtils.closeResource(conn, null);
}
}
/* * PersonnalisationResultSetHandlerClasse d'implémentation pour */
@Test
public void testQuery7(){
Connection conn = null;
try {
QueryRunner runner = new QueryRunner();
conn = JDBCUtils.getConnection3();
String sql = "select id,name,email,birth from customers where id = ?";
ResultSetHandler<Customer> handler = new ResultSetHandler<Customer>(){
@Override
public Customer handle(ResultSet rs) throws SQLException {
// System.out.println("handle");
// return null;
// return new Customer(12, "Jackie Chan", "[email protected]", new Date(234324234324L));
if(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
Date birth = rs.getDate("birth");
Customer customer = new Customer(id, name, email, birth);
return customer;
}
return null;
}
};
Customer customer = runner.query(conn, sql, handler,23);
System.out.println(customer);
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtils.closeResource(conn, null);
}
}
}
边栏推荐
- MySQL 20 MySQL data directory
- Global and Chinese market of transfer switches 2022-2028: Research Report on technology, participants, trends, market size and share
- NPM an error NPM err code enoent NPM err syscall open
- API learning of OpenGL (2004) gl_ TEXTURE_ MIN_ FILTER GL_ TEXTURE_ MAG_ FILTER
- Postman uses scripts to modify the values of environment variables
- MySQL flush operation
- Invalid default value for 'create appears when importing SQL_ Time 'error reporting solution
- IDEA 导入导出 settings 设置文件
- Emotional classification of 1.6 million comments on LSTM based on pytoch
- Baidu Encyclopedia data crawling and content classification and recognition
猜你喜欢
CSDN question and answer module Title Recommendation task (I) -- Construction of basic framework
MySQL18-MySQL8其它新特性
Installation and use of MySQL under MySQL 19 Linux
Mysql33 multi version concurrency control
[recommended by bloggers] C # generate a good-looking QR code (with source code)
[recommended by bloggers] background management system of SSM framework (with source code)
CSDN问答标签技能树(一) —— 基本框架的构建
35 is not a stumbling block in the career of programmers
MySQL主從複制、讀寫分離
CSDN question and answer module Title Recommendation task (II) -- effect optimization
随机推荐
Idea import / export settings file
记某公司面试算法题:查找一个有序数组某个数字出现的次数
How to change php INI file supports PDO abstraction layer
Texttext data enhancement method data argument
MySQL31-MySQL事务日志
CSDN问答标签技能树(五) —— 云原生技能树
MySQL22-逻辑架构
虚拟机Ping通主机,主机Ping不通虚拟机
C language string function summary
Navicat 導出錶生成PDM文件
Adaptive Bezier curve network for real-time end-to-end text recognition
Invalid default value for 'create appears when importing SQL_ Time 'error reporting solution
Mysql34 other database logs
Bytetrack: multi object tracking by associating every detection box paper reading notes ()
Mysql26 use of performance analysis tools
MySQL27-索引优化与查询优化
Ansible实战系列三 _ task常用命令
Mysql22 logical architecture
CSDN问答模块标题推荐任务(二) —— 效果优化
[Li Kou 387] the first unique character in the string