当前位置:网站首页>Principes JDBC

Principes JDBC

2022-07-06 10:59:00 Pasteurella

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);
			
		}
		
	}
	
}

原网站

版权声明
本文为[Pasteurella]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/187/202207060912228651.html