Connexion JAVA-JDBC et apprentissage associé
Répertoire d'articles
Méthode de connexion de base JDBC
Tout d'abord, préparez-vous à télécharger et à installer Mysql ou d'autres bases de données, puis importez mysql-connector-java-5.0.8-bin.jar ou d'autres packages tiers (pour le pilote)
Puis connectez:
Connection connection = null;
PreparedStatement preparedStatement = null;
//第一步加载驱动;
Class.forName("com.mysql.jdbc.Driver");
//第二步获取连接;
// 建立与数据库的Connection连接
// 这里需要提供:
// 数据库所处于的ip:127.0.0.1 (本机)本地可以写local:
// 数据库的端口号: 3306 (mysql专用端口号)
// 数据库名称 weeklyreport
// 编码方式 UTF-8
//serverTimezone最好加一下,因为有时候会报错;
//useSSL=false
//MySQL在高版本需要指明是否进行SSL连接
//1.true 需要连接
//2.false 不需要连接
String url = "jdbc:mysql://localhost:3306/weeklyreport?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8";
String user = "root";
String password = "password";//自己的密码
connection = DriverManager.getConnection(url, user, password);
//创建statement或者preparedStatement,先用preparedStatement举例;
String sql = "insert into users2(USER_NAME,USER_PASSWORD,USER_ENTRYDATE) VALUES(?,?,?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, name);
preparedStatement.setString(2, password2);
preparedStatement.setString(3,date);
preparedStatement.executeUpdate();
//这就实现了一个插入注册信息的操作
//最后一步要实现关闭connection和preparedStatement操作;
connection.close();
preparedStatement.close();
Le complet est
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/weeklyreport?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8";
String user = "root";
String password = "password";//自己的密码
connection = DriverManager.getConnection(url, user, password);
String sql = "insert into users2(USER_NAME,USER_PASSWORD,USER_ENTRYDATE) VALUES(?,?,?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, name);
preparedStatement.setString(2, password2);
preparedStatement.setString(3,date);
preparedStatement.executeUpdate();
}catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e){
e.printStackTrace();
} finally {
try {
//一般preparedStatement关闭在connection关闭之后;
connection.close();
preparedStatement.close();
} catch (SQLException e){
e.printStackTrace();
}
}
}
Instruction SQL
1. SQL a de nombreuses autres opérations, telles que l'ajout, la suppression, la modification et la vérification
//增加
String sql = "insert into users2(USER_NAME,USER_PASSWORD,USER_ENTRYDATE) VALUES(?,?,?)";
//删除
String sql = "delete from hero where id = 5";
//更改
String sql = "update hero set name = 'name 5' where id = 3";
2. Le plus spécial est l'opération de requête;
public boolean finduser(String name2,String password2) {
ResultSet result = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
int i =0;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/weeklyreport?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8";
String user = "root";
String password = "password";
connection = DriverManager.getConnection(url, user, password);
String sql = "select * from users2 where USER_NAME= ? and USER_PASSWORD= ?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, name2);
preparedStatement.setString(2, password2);
//特殊的就是要设置一个结果集ResultSet,把结果存放在结果集中,
result =preparedStatement.executeQuery();
while(result.next()) {
i++;
}
//这里实现的功能就是在登陆的时候验证账号和密码,如果正确,那查询得到的结果集就有内容并i++最后返回true;
}catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e){
e.printStackTrace();
} finally {
try {
connection.close();
preparedStatement.close();
result.close();
//关闭结果集
} catch (SQLException e){
e.printStackTrace();
}
}
if (i == 0)
return false;
else
return true;
}
La différence entre Statement et PreparStatement
1,
La déclaration nécessite une concaténation de chaînes, une lisibilité et une maintenabilité médiocres;
Réglages des paramètres PreparedStatement , lisibles, faciles à faire des erreurs;
Statement s = connection.createStatement();
PreparedStatement preparedStatement= connection.prepareStatement(sql);
// Statement需要进行字符串拼接,可读性和维修性比较差
String sql0 = "insert into USERS1(null," + "'学生1'" + "," + "'123456'"+")";
s.execute(sql0);
String sql = "insert into USERS1(null,?,?,?)";
// PreparedStatement 使用参数设置,可读性好,不易犯错
// "insert into USERS1(null,?,?)";
preparedStatement.setString(1, "学生1");
preparedStatement.setString(2, "123456");
preparedStatement.execute();
2. PreparedStatement dispose d'un mécanisme de pré-compilation, les performances sont plus rapides que Statement
La base de données pré-compile SQL avec?
À chaque exécution, il vous suffit de transférer les paramètres dans la base de données
- Le volume de transmission réseau est inférieur à Statement
- La base de données n'a pas besoin d'être compilée, la réponse est plus rapide
3. PreparedStatement empêche les attaques par injection SQL Par exemple, lorsque le mot de passe est ajouté à OR 1 = 1 lors de la connexion, il sera lu par SQL et connecté;
La différence entre execute et executeUpdate
1. Les similitudes entre execute et executeUpdate : les deux peuvent être ajoutés, supprimés et modifiés
preparedStatement.execute();
preparedStatement.executeUpdate();
2. Différent:
execute peut exécuter l'instruction de requête,
puis via getResultSet, le jeu de résultats est retiré et
executeUpdate ne peut pas exécuter l'instruction de requête.
Différent 2:
execute renvoie un type booléen , true signifie que l'instruction de requête est exécutée, false signifie insérer, supprimer, mettre à jour, etc. Attendez que
executeUpdate renvoie un entier , indiquant le nombre de données affectées
Affaires
connection.setAutoCommit(false);
// 更改操作
String sql1 = "update hero set hp = hp +1 where id = "xuesheng1"";
statement.execute(sql1);
//第二个更新操作
// 不小心写错写成了 updata(而非update)
String sql2 = "updata users1 set score = score -1 where name = "xuesheng2"";
statement.execute(sql2);
// 手动提交
connection.commit();
Alors mettez
connection.setAutoCommit (false);
connection.commit ();
Tant qu'il y a une erreur dans la transaction entre une opération, elle ne se poursuivra pas, de manière à garantir que l'erreur ne se produise pas;
SERPENT
En fait, il s'agit de créer un objet dont les propriétés permettent de stocker un enregistrement dans la base de données puis d'étendre l'opération;
ORM = Mappage de la base de données des relations d'objets
Mappage d'objets et de bases de données relationnelles
En termes simples, un objet correspond à un enregistrement dans la base de données ;
DAO
En fait, l'idée ORM est utilisée pour encapsuler les opérations liées à la base de données dans cette classe, et le code JDBC ne peut pas être vu ailleurs.
Pool de connexion à la base de données
Créez plusieurs connexions à l'avance et attendez que les threads les utilisent. S'ils sont tous utilisés, les threads inutilisés attendront que les connexions se terminent et reviennent au pool de connexions à la base de données; et ces connexions ne seront pas fermées, mais seront continuellement recyclées, donc Gagnez du temps pour démarrer et fermer la connexion.
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class ConnectionPool {
List<Connection> cs = new ArrayList<Connection>();
int size;
public ConnectionPool(int size) {
this.size = size;
init();
}
public void init() {
//这里恰恰不能使用try-with-resource的方式,因为这些连接都需要是"活"的,不要被自动关闭了
try {
Class.forName("com.mysql.jdbc.Driver");
for (int i = 0; i < size; i++) {
Connection c = DriverManager
.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8", "root", "admin");
cs.add(c);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public synchronized Connection getConnection() {
while (cs.isEmpty()) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Connection c = cs.remove(0);
return c;
}
public synchronized void returnConnection(Connection c) {
cs.add(c);
this.notifyAll();
}
}
//代码来自how2j网站