当前位置:网站首页>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);
}
}
}
边栏推荐
- [recommended by bloggers] background management system of SSM framework (with source code)
- NPM an error NPM err code enoent NPM err syscall open
- Ansible practical Series III_ Task common commands
- Global and Chinese market of wafer processing robots 2022-2028: Research Report on technology, participants, trends, market size and share
- Postman Interface Association
- API learning of OpenGL (2004) gl_ TEXTURE_ MIN_ FILTER GL_ TEXTURE_ MAG_ FILTER
- MySQL28-数据库的设计规范
- A brief introduction to the microservice technology stack, the introduction and use of Eureka and ribbon
- MySQL 20 MySQL data directory
- MySQL flush operation
猜你喜欢
A brief introduction to the microservice technology stack, the introduction and use of Eureka and ribbon
MySQL26-性能分析工具的使用
Mysql26 use of performance analysis tools
Solution: log4j:warn please initialize the log4j system properly
Moteur de stockage mysql23
CSDN问答标签技能树(五) —— 云原生技能树
[recommended by bloggers] asp Net WebService background data API JSON (with source code)
MySQL 20 MySQL data directory
MySQL20-MySQL的数据目录
【博主推荐】C#MVC列表实现增删改查导入导出曲线功能(附源码)
随机推荐
[C language foundation] 04 judgment and circulation
Mysql21 user and permission management
Mysql22 logical architecture
[ahoi2009]chess Chinese chess - combination number optimization shape pressure DP
[recommended by bloggers] C WinForm regularly sends email (with source code)
MySQL19-Linux下MySQL的安装与使用
Mysql27 index optimization and query optimization
Win10: how to modify the priority of dual network cards?
The virtual machine Ping is connected to the host, and the host Ping is not connected to the virtual machine
Global and Chinese market of wafer processing robots 2022-2028: Research Report on technology, participants, trends, market size and share
Detailed reading of stereo r-cnn paper -- Experiment: detailed explanation and result analysis
Breadth first search rotten orange
JDBC原理
Development of C language standard
CSDN question and answer module Title Recommendation task (II) -- effect optimization
Pytoch LSTM implementation process (visual version)
Installation and use of MySQL under MySQL 19 Linux
MySQL18-MySQL8其它新特性
1. Mx6u learning notes (VII): bare metal development (4) -- master frequency and clock configuration
Emotional classification of 1.6 million comments on LSTM based on pytoch