当前位置:网站首页>Tutoriel de démarrage rapide JDBC
Tutoriel de démarrage rapide JDBC
2022-06-12 17:42:00 【* Night Star River ℡】
Contenu principal
- JDBCUtiliser
- JDBCClasse d'outils
- JDBCOpérations de contrôle
Objectifs pédagogiques
- Être capable de comprendreJDBCLe concept de
- Capable d'utiliserDriverManager Catégorie
- Capable d'utiliser Connection Interface
- Capable d'utiliser Statement Interface
- Capable d'utiliser ResultSet Interface
- Capable de dire SQL Causes de l'injection et solutions
- Capable de passer à travers PreparedStatement Achèvement de l & apos; augmentation、Supprimer、Modifier、Regarde.
- Capable de le faire PreparedStatement Modifier le cas de connexion
JDBC
Concept
Java DataBase Connectivity Java Connexion à la base de données, JavaBase de données des opérations linguistiques
Nature
C'est officiel.(sunEntreprises)Un ensemble de règles définies pour le fonctionnement de toutes les bases de données relationnelles,Interface.
Chaque fabricant de base de données implémente cette interface,Fournir un pilote de base de donnéesjarSac.
Nous pouvons utiliser cet ensemble d'interfaces(JDBC)Programmation,Le Code réellement exécuté est le pilotejarClasses d'implémentation dans le paquet.
Les avantages
1) Si un programmeur doit développer un programme pour accéder à la base de données,Il suffit d'appeler JDBC La méthode dans l'interface est OK,Ne vous concentrez pas sur la façon dont la classe est implémentée.
2) Utiliser le même ensemble Java Code,Pour accéder à d'autres JDBC Bases de données prises en charge

Démarrage rapide
Étapes
* Étapes:
1. Importer le lecteurjarSac mysql-connector-java-5.1.37-bin.jar
1.Créer dans un projetlibsTable des matières
2.Copiermysql-connector-java-5.1.37-bin.jarAu projetlibsSous la table des matières
3.Inlibs Sélectionnez ce que vous souhaitez ajouter dans le répertoire jarSac,Puis clic droit-->Bulid Path-->Add to Build Path
2. Enregistrer le pilote
3. Obtenir l'objet de connexion à la base de données Connection
4. Définitionsql
5. Obtenir l'exécutionsqlObjet de l'instruction Statement
6. Mise en œuvresql,Accepter les résultats retournés
7. Résultats du traitement
8. Libérer des ressources
Détailler chaque objet central
1. DriverManager
DriverManager:Drive Management Object
* Fonction:
1. Enregistrer le pilote:Dites au programme quel pilote de base de données utiliserjar
static void registerDriver(Driver driver) :Enregistrer avec le pilote donné DriverManager .
Utilisation du Code d'écriture: Class.forName("com.mysql.jdbc.Driver");
Découverte en regardant le code source:Incom.mysql.jdbc.DriverBloc de code statique présent dans la classe
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
Attention!:mysql5Entraînement arrièrejarLe paquet peut omettre les étapes pour enregistrer le pilote.
2. Obtenir une connexion à la base de données:
* Méthodes:static Connection getConnection(String url, String user, String password)
* Paramètres:
* url:Spécifier le chemin de connexion
* Syntaxe:jdbc:mysql://ipAdresse(Nom de domaine):Numéro de port/Nom de la base de données
* Exemple:jdbc:mysql://localhost:3306/db3
* Détails:Si la machine est connectéemysqlServeur,EtmysqlLe port par défaut du service est3306,EturlPeut être abrégé en:jdbc:mysql:///Nom de la base de données
* user:Nom d'utilisateur
* password:Mot de passe
2. Connection
Connection:Objet de connexion à la base de données
1. Fonction:
1. Obtenir l'exécutionsql Objet de
* Statement createStatement()
* PreparedStatement prepareStatement(String sql)
2. Services de gestion:
* Ouvrir la transaction:setAutoCommit(boolean autoCommit) :Appeler cette méthode pour définir les paramètres àfalse,C'est - à - dire que la transaction est ouverte
* Soumettre une transaction:commit()
* Opérations de rollback:rollback()
3. Statement
1. Mise en œuvresql
1. boolean execute(String sql) :Peut exécuter n'importe quelsql Compris.
2. int executeUpdate(String sql) :Mise en œuvreDML(insert、update、delete)Déclarations、DDL(create,alter、drop)Déclarations
* Valeur de retour:Nombre de lignes affectées,Peut être déterminé par le nombre de lignes affectéesDMLSi l'instruction a été exécutée avec succès Valeur de retour>0A été exécuté avec succès,Au contraire,A échoué..
3. ResultSet executeQuery(String sql) :Mise en œuvreDQL(select)Déclarations
Exercice:
1.studentTableau Ajouter un enregistrement
2. studentTableau Modifier l'enregistrement
3. studentTableau Supprimer un enregistrement
//Charger l'entraînement,Connexion à la base de données,Libérer des ressources
package com.zhibang.utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
/** * Charger l'entraînement,Connexion à la base de données,Libérer des ressources * @author La pluie tombe sur les étoiles * */
public class Utils {
private static String driver = "com.mysql.jdbc.Driver";// Charger le paquet d'entraînement
private static String url = "jdbc:mysql://localhost:3306/girls";//Connexion à la base de données localhostPour le localid girlsPour le nom de la table de base de données
private static String urname = "root";//Nom d'utilisateur
private static String pass = "3306";//Mot de passe
/** * Charger le paquet d'entraînement */
static {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/** * Connexion à la base de données * @return */
public static Connection getConnection() {
Connection con = null;
try {
con = DriverManager.getConnection(url,urname,pass);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
/** * Release Connection,PreparedStatement,ResultSet Ressources * @param con * @param ps * @param rst */
public static void close(Connection con,PreparedStatement ps,ResultSet res) {
try {
if(con!=null) {
con.close();
}
if(ps!=null) {
ps.close();
}
if(res!=null) {
res.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/** * Release Connection,PreparedStatement Ressources * @param con * @param ps */
public static void close_1(Connection con,PreparedStatement ps) {
try {
if(con!=null) {
con.close();
}
if(ps!=null) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//Classe d'étudiants
package com.zhibang.student;
/** * Données du tableau * @author La pluie tombe sur les étoiles * */
public class student {
private int id;//Numéro d'étudiant
private String uname;//Nom d'utilisateur
private String psw;//Mot de passe
public student() {
}
public student(int id2, String uname, String psw) {
super();
this.id = id2;
this.uname = uname;
this.psw = psw;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPsw() {
return psw;
}
public void setPsw(String psw) {
this.psw = psw;
}
@Override
public String toString() {
return "student [id=" + id + ", uname=" + uname + ", psw=" + psw + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((psw == null) ? 0 : psw.hashCode());
result = prime * result + ((uname == null) ? 0 : uname.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
student other = (student) obj;
if (id != other.id)
return false;
if (psw == null) {
if (other.psw != null)
return false;
} else if (!psw.equals(other.psw))
return false;
if (uname == null) {
if (other.uname != null)
return false;
} else if (!uname.equals(other.uname))
return false;
return true;
}
}
- studentTableau Ajouter un enregistrement
// Ramassez vos mains précieuses et écoutez les cours pour les réaliser
public static int getinsert(student st) {
String sql = "INSERT INTO admin(`username`,`password`) VALUES ('"+ st.getUname() +"','"+ st.getPsw() +"')";
int n = 0;
try {
con = Utils.getConnection();
ps = con.prepareStatement(sql);
n = ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
Utils.close_1(con, ps);
}
return n;
}
- studentTableau Modifier l'enregistrement
// Ramassez vos mains précieuses et écoutez les cours pour les réaliser
public static int getupdate(student st) {
String sql = "UPDATE admin SET `password`='"+ st.getPsw() +"' WHERE id="+ st.getId() +"";
int n = 0;
try {
con = Utils.getConnection();
ps = con.prepareStatement(sql);
n = ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
Utils.close_1(con, ps);
}
return n;
}
- studentTableau Supprimer un enregistrement
// Ramassez vos mains précieuses et écoutez les cours pour les réaliser
public static int getdelect(student st) {
String sql = "DELETE FROM admin WHERE id="+ st.getId() +"";
int n = 0;
try {
con = Utils.getConnection();
ps = con.prepareStatement(sql);
n = ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
Utils.close_1(con, ps);
}
return n;
}
- Mise en œuvreDDLDéclarations
// Ramassez vos mains précieuses et écoutez les cours pour les réaliser
//Ajouter
student st = new student();
st.setUname("ccc");
st.setPsw("244542");
int n = UserDao.getinsert(st);
if(n>0) {
System.out.println("Soumis avec succès");
}else {
System.out.println("Échec de la soumission");
}
//Modifier
student st = new student();
st.setId(1);
st.setPsw("2113");
int n = UserDao.getupdate(st);
if(n>0) {
System.out.println("Soumis avec succès");
}else {
System.out.println("Échec de la soumission");
}
//Supprimer
student st = new student();
st.setId(6);
int n = UserDao.getdelect(st);
if(n>0) {
System.out.println("Soumis avec succès");
}else {
System.out.println("Échec de la soumission");
}
4. ResultSet
* boolean next(): Le curseur descend d'une ligne,Déterminer si la ligne courante est la fin de la dernière ligne(Y a - t - il des données),Si oui,Renvoiefalse,Sinon, retourneztrue
* getXxx(Paramètres):Obtenir des données
* Xxx:Représente le type de données Par exemple:: int getInt() , String getString()
* Paramètres:
1. int:Nombre de colonnes représentatives,De1C'est parti. Par exemple:: getString(1)
2. String:Nom de la colonne représentative. Par exemple:: getDouble("balance")
* Attention!:
* Utiliser les étapes:
1. Le curseur descend d'une ligne
2. Déterminer s'il y a des données
3. Obtenir des données
//Boucle pour déterminer si le curseur est à la fin de la dernière ligne.
while(rs.next()){
//Obtenir des données
//6.2 Obtenir des données
int id = rs.getInt(1);
String name = rs.getString("name");
double balance = rs.getDouble(3);
System.out.println(id + "---" + name + "---" + balance);
}

* Exercice:
* Définir une méthode,RequêtestudentLes données du tableau l'encapsulent comme objet,Puis chargez la collection,Retour.
1. DéfinitionstudentCatégorie
2. Définir la méthode public List<student> findAll(){}
3. Méthode de réalisation select * from student;
//Charger l'entraînement,Connexion à la base de données,Libérer des ressources
package com.zhibang.utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
/** * Charger l'entraînement,Connexion à la base de données,Libérer des ressources * @author La pluie tombe sur les étoiles * */
public class Utils {
private static String driver = "com.mysql.jdbc.Driver";// Charger le paquet d'entraînement
private static String url = "jdbc:mysql://localhost:3306/girls";//Connexion à la base de données localhostPour le localid girlsPour le nom de la table de base de données
private static String urname = "root";//Nom d'utilisateur
private static String pass = "3306";//Mot de passe
/** * Charger le paquet d'entraînement */
static {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/** * Connexion à la base de données * @return */
public static Connection getConnection() {
Connection con = null;
try {
con = DriverManager.getConnection(url,urname,pass);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
/** * Release Connection,PreparedStatement,ResultSet Ressources * @param con * @param ps * @param rst */
public static void close(Connection con,PreparedStatement ps,ResultSet res) {
try {
if(con!=null) {
con.close();
}
if(ps!=null) {
ps.close();
}
if(res!=null) {
res.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/** * Release Connection,PreparedStatement Ressources * @param con * @param ps */
public static void close_1(Connection con,PreparedStatement ps) {
try {
if(con!=null) {
con.close();
}
if(ps!=null) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Code de mise en œuvre(studentCatégorie):
// Ramassez vos mains précieuses et écoutez les cours pour les réaliser
package com.zhibang.student;
/** * Données du tableau * @author La pluie tombe sur les étoiles * */
public class student {
private int id;//Numéro d'étudiant
private String uname;//Nom d'utilisateur
private String psw;//Mot de passe
public student() {
}
public student(int id2, String uname, String psw) {
super();
this.id = id2;
this.uname = uname;
this.psw = psw;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPsw() {
return psw;
}
public void setPsw(String psw) {
this.psw = psw;
}
@Override
public String toString() {
return "student [id=" + id + ", uname=" + uname + ", psw=" + psw + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((psw == null) ? 0 : psw.hashCode());
result = prime * result + ((uname == null) ? 0 : uname.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
student other = (student) obj;
if (id != other.id)
return false;
if (psw == null) {
if (other.psw != null)
return false;
} else if (!psw.equals(other.psw))
return false;
if (uname == null) {
if (other.uname != null)
return false;
} else if (!uname.equals(other.uname))
return false;
return true;
}
}
Code de mise en œuvre(Lire la classe)
// Ramassez vos mains précieuses et écoutez les cours pour les réaliser
public static List<student> getselect() {
String sql="select * from student";
List<student> li = new ArrayList<student>();
try {
con = Utils.getConnection();
ps = con.prepareStatement(sql);
res = ps.executeQuery();
while (res.next()) {
int id = res.getInt("id");
String uname = res.getNString("username");
String psw = res.getString("password");
li.add(new student(id, uname, psw));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
Utils.close(con, ps, res);
}
return li;
}
5. PreparedStatement
1. SQLProblèmes d’injection:C'est un épissage.sqlHeure,Un peu.sqlMot - clé spécial pour participer à l'épissage des chaînes.Peut causer des problèmes de sécurité
1. Saisissez l'utilisateur au hasard,Saisissez le mot de passe:a' or 'a' = 'a
2. sql:select * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a'
2. RésolutionsqlProblèmes d’injection:UtiliserPreparedStatementObjet à résoudre
3. PrécompiléSQL:Utilisation des paramètres?Comme substituant
4. Étapes:
1. Importer le lecteurjarSac mysql-connector-java-5.1.37-bin.jar
2. Enregistrer le pilote
3. Obtenir l'objet de connexion à la base de données Connection
4. Définitionsql
* Attention!:sqlUtilisation des paramètres pour?Comme substituant. Par exemple::select * from user where username = ? and password = ?;
5. Obtenir l'exécutionsqlObjet de l'instruction PreparedStatement Connection.prepareStatement(String sql)
6. Voilà.?Affectation:
* Méthodes: setXxx(Paramètres1,Paramètres2)
* Paramètres1:?Numéro de localisation De1 C'est parti.
* Paramètres2:?Valeur de
7. Mise en œuvresql,Accepter les résultats retournés,Pas besoin de passersqlDéclarations
8. Résultats du traitement
9. Libérer des ressources
5. Attention!:Sera utilisé plus tardPreparedStatementPour compléter toutes les opérations d'ajout, de suppression, de modification et de recherche
1. Peut empêcherSQLInjection
2. Plus efficace
ExtractionJDBCClasse d'outils : JDBCUtils
Description
* Objectif:écriture simplifiée
* Analyse:
1. Le pilote d'enregistrement est aussi appelé extraction
2. Extraire une méthode pour obtenir l'objet de connexion
* Besoins:Ne voulez pas passer de paramètres(Des ennuis.),Il faut aussi garantir la polyvalence des classes d'outils.
* Résolution:Profil
jdbc.properties
url=
user=
password=
3. Extraire une méthode pour libérer les ressources
Réalisation concrète
Enregistrer le pilote
public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
/** * Lecture du fichier,Il suffit d'une lecture pour obtenir ces valeurs.Utiliser des blocs de code statiques */
static{
//Lire le fichier de ressources,Obtenir la valeur.
try {
//1. CréationPropertiesClasse set.
Properties pro = new Properties();
//AccèssrcComment les fichiers sous le chemin--->ClassLoader Chargeur de classe
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL res = classLoader.getResource("jdbc.properties");
String path = res.getPath();
System.out.println(path);
//2. Charger le fichier
// pro.load(new FileReader("E:\\eclipse-workspace\\First\\src\\jdbc.properties"));
pro.load(new FileReader(path));
//3. Obtenir des données,Affectation
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
//4. Enregistrer le pilote
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
// IO Mode de chargement du flux propertiesDocumentation
InputStream inputStream = ClassLoader.getSystemResourceAsStream("/jdbc.properties");
// InputStream inputStream = LoadPropertiesFile.class.getResourceAsStream("/jdbc.properties");
Properties prop = new Properties();
prop.load(inputStream);
Extraire une méthode pour obtenir l'objet de connexion
/** * Obtenir la connexion * @return Objet de connexion */
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
/** * Libérer des ressources * @param stmt * @param conn */
public static void close(Statement stmt,Connection conn){
if( stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if( conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Extraire une méthode pour libérer les ressources
/** * Libérer des ressources * @param stmt * @param conn */
public static void close(ResultSet rs,Statement stmt, Connection conn){
if( rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if( stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if( conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Exercice
* Exercice:
* Besoins:
1. Saisissez le nom d'utilisateur et le mot de passe via le clavier
2. Déterminer si l'utilisateur s'est connecté avec succès
* select * from user where username = "" and password = "";
* Si çasqlIl y a des résultats de recherche,Ça marche.,Au contraire,A échoué.
* Étapes:
1. Créer une table de base de données user
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(32),
PASSWORD VARCHAR(32)
);
INSERT INTO USER VALUES(NULL,'zhangsan','123');
INSERT INTO USER VALUES(NULL,'lisi','234');
2. Mise en œuvre du Code
Mise en œuvre du Code
//Charger l'entraînement,Connexion à la base de données,Libérer des ressources
package com.zhibang.utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
/** * Charger l'entraînement,Connexion à la base de données,Libérer des ressources * @author La pluie tombe sur les étoiles * */
public class Utils {
private static String driver = "com.mysql.jdbc.Driver";// Charger le paquet d'entraînement
private static String url = "jdbc:mysql://localhost:3306/girls";//Connexion à la base de données localhostPour le localid girlsPour le nom de la table de base de données
private static String urname = "root";//Nom d'utilisateur
private static String pass = "3306";//Mot de passe
/** * Charger le paquet d'entraînement */
static {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/** * Connexion à la base de données * @return */
public static Connection getConnection() {
Connection con = null;
try {
con = DriverManager.getConnection(url,urname,pass);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
/** * Release Connection,PreparedStatement,ResultSet Ressources * @param con * @param ps * @param rst */
public static void close(Connection con,PreparedStatement ps,ResultSet res) {
try {
if(con!=null) {
con.close();
}
if(ps!=null) {
ps.close();
}
if(res!=null) {
res.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/** * Release Connection,PreparedStatement Ressources * @param con * @param ps */
public static void close_1(Connection con,PreparedStatement ps) {
try {
if(con!=null) {
con.close();
}
if(ps!=null) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//Selon le nom d'utilisateur et le mot de passe
public static boolean getnamepass(String name,String pass) {
if(name==null&&pass==null) {
return false;
}
try {
con = Utils.getConnection();
// String sql = "select * from admin where username='"+ name +"' and password='"+ pass +"'";
//PréventionsqlInjection
String sql = "select * from admin where username=? and password=?";
ps = con.prepareStatement(sql);
ps.setString(1, name);
ps.setString(2, pass);
res = ps.executeQuery();
return res.next();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
Utils.close(con, ps, res);
}
return false;
}
//Catégorie de mise en œuvre
Scanner sc = new Scanner(System.in);
System.out.println("Veuillez saisir un nom d'utilisateur:");
String name = sc.next();
System.out.println("Veuillez saisir le mot de passe:");
String pass = sc.next();
boolean getnamepass = UserDao.getnamepass(name, pass);
if(getnamepass) {
System.out.println("Connexion réussie!!!");
}else {
System.out.println("Mauvais nom d'utilisateur ou mot de passe!!!");
}
JDBCOpérations de contrôle
Description
1. Services:Une opération commerciale comportant plusieurs étapes.Si cette opération commerciale est gérée par transaction,Ces étapes sont soit réussies en même temps,Soit ils échouent en même temps.
2. Fonctionnement:
1. Ouvrir la transaction
2. Soumettre une transaction
3. Opérations de rollback
3. UtiliserConnectionObjet pour gérer la transaction
* Ouvrir la transaction:setAutoCommit(boolean autoCommit) :Appeler cette méthode pour définir les paramètres àfalse,C'est - à - dire que la transaction est ouverte
* En courssqlAvant d'ouvrir la transaction
* Soumettre une transaction:commit()
* Quand toutsqlToutes les transactions engagées ont été effectuées
* Opérations de rollback:rollback()
* IncatchTransaction de ROLLBACK moyen
Réalisation
public class AccountDao {
/* * Modifier le solde de l'utilisateur spécifié */
public void updateBalance(Connection con, String name,double balance) {
try {
String sql = "UPDATE account SET balance=balance+? WHERE name=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setDouble(1,balance);
pstmt.setString(2,name);
pstmt.executeUpdate();
}catch (Exception e) {
throw new RuntimeException(e);
}
}
}
public class Demo1 {
/* * Démonstration de la méthode de transfert * Toutes les pairesConnectLes opérations deServiceTraitement effectué par la couche * Prends toutconnectionL'opération est cachée,Cela nécessite l'utilisation de gadgets personnalisés(day19_1) * */
public void transferAccounts(String from,String to,double money) {
//Opérations sur transactions
Connection con = null;
try{
con = JdbcUtils.getConnection();
con.setAutoCommit(false);
AccountDao dao = new AccountDao();
dao.updateBalance(con,from,-money);//Voilà.fromMoins le montant correspondant
if (true){
throw new RuntimeException("Excusez - moi,Échec du transfert");
}
dao.updateBalance(con,to,+money);//Voilà.toPlus le montant correspondant
//Soumettre une transaction
con.commit();
} catch (Exception e) {
try {
con.rollback();
} catch (SQLException e1) {
e.printStackTrace();
}
throw new RuntimeException(e);
}
}
@Test
public void fun1() {
transferAccounts("zs","ls",100);
}
}
}
dao.updateBalance(con,to,+money);//Voilà.toPlus le montant correspondant
//Soumettre une transaction
con.commit();
} catch (Exception e) {
try {
con.rollback();
} catch (SQLException e1) {
e.printStackTrace();
}
throw new RuntimeException(e);
}
}
@Test
public void fun1() {
transferAccounts("zs","ls",100);
}
}
边栏推荐
- Selenium element positioning
- 5-5 configuring MySQL replication log point based replication
- Two ways of tensorflow2 training data sets
- SQL游标(cursor)详细说明及内部循环使用示例
- R language calculates data Table specifies the mean value of a numeric variable when the value of one grouped variable is fixed and another grouped variable
- Evolution and thinking of Taobao native R & D mode | DX R & D mode
- 徽商期货开户可靠吗?资金安全吗?
- Arm64棧回溯
- Unprecedented analysis of Milvus source code architecture
- 续2 asp.net core 路由程序基础使用演示0.2 默认控制器数据的获取到
猜你喜欢

C#操作数据库增查业务数据值内容案例学校表

Notes on user experience elements: user centered product design

字节飞书人力资源套件三面

Arm64棧回溯

Tensorflow prompts typeerror: unsupported operand type (s) for *: 'float' and 'nonetype‘

office应用程序无法正常启动0xc0000142
![[CSP]202012-2期末预测之最佳阈值](/img/40/9b59bd692bcfe05d16614cc6d55d1f.png)
[CSP]202012-2期末预测之最佳阈值

Introduction to several common functions of fiddler packet capturing (stop packet capturing, clear session window contents, filter requests, decode, set breakpoints...)

The significance of writing technology blog

Some introduction to FPC flexible circuit board design
随机推荐
Microsoft Office MSDT Code Execution Vulnerability (cve-2022-30190) vulnerability recurrence
分辨率与行场同步信号的关系 场消隐
566. 重塑矩阵
Go variables
Li Kou today's question 926 Flip string to monotonic increment
Kill program errors in the cradle with spotbugs
Tensorflow prompts typeerror: unsupported operand type (s) for *: 'float' and 'nonetype‘
消息队列存储消息数据的 MySQL 表格
Detailed description of SQL cursor and example of internal recycling
String的split方法的使用
The R language uses the tablestack function of epidisplay package to generate statistical analysis tables based on grouped variables (including descriptive statistical analysis, hypothesis test, diffe
Understanding of binary search
Two ways of tensorflow2 training data sets
Cesium抛物线方程
32-bit MCU mm32f0040 with smart micro high performance M0 kernel
First acquaintance with go language
R语言使用epiDisplay包的tableStack函数基于分组变量生成统计分析表(包含描述性统计分析、假设检验、不同数据使用不同的统计量和假设检验方法)、自定义配置是否显示统计检验内容
Memory control of node
TensorFlow2训练数据集的两种方式
How to view, modify, and delete SSH