Cet article présente principalement la construction du framework JDBC de base basé sur Spring ; l'ajout, la suppression, la modification et l'interrogation de JDBC basé sur Spring, etc., qui a une très bonne valeur de référence ; . Voyons cela avec l'éditeur ci-dessous
Pool de connexions à la base de données
Pour une application de base de données simple, l'accès à la base de données n'étant pas très fréquent, vous pouvez simplement lorsque vous avez besoin d'accéder à la base de données, vous créez une nouvelle connexion et la fermez lorsque vous avez terminé. Cela n'entraînera aucune surcharge de performances. Mais pour une application de base de données complexe, la situation est complètement différente. L'établissement et la fermeture fréquents de connexions réduiront considérablement les performances du système, car l'utilisation des connexions est devenue un goulot d'étranglement des performances du système.
En établissant un pool de connexions à la base de données et un ensemble de politiques de gestion de l'utilisation des connexions, l'effet de réutilisation des connexions peut être obtenu, de sorte qu'une connexion à la base de données puisse être en toute sécurité et réutilisée efficacement, évitant ainsi besoin d'une base de données La surcharge liée à l'établissement et à la fermeture fréquents de connexions. Le principe de base du
pool de connexions à la base de données est de maintenir un certain nombre de connexions à la base de données dans le pool d'objets internes et d'exposer les méthodes d'acquisition et de retour des connexions à la base de données à l'extérieur. Par exemple : les utilisateurs externes peuvent obtenir la connexion via la méthode getConnection, puis renvoyer la connexion via la méthode releaseConnection après utilisation. Notez que la connexion n'est pas fermée pour le moment, mais est recyclée par le gestionnaire de pool de connexions et préparée pour la suivante. utiliser.
Avantages apportés par la technologie du pool de connexions aux bases de données :
1. Réutilisation des ressources
En raison de Les connexions à la base de données sont réutilisées, évitant ainsi une surcharge de performances causée par la création et la libération fréquentes de liens. D'autre part, sur la base de la réduction de la consommation du système, cela améliore également la stabilité de l'environnement d'exploitation du système (réduit la fragmentation de la mémoire et le traitement temporaire de la base de données/le nombre de threads)
2. Vitesse de réponse du système plus rapide
Pendant le processus d'initialisation du pool de connexions à la base de données, plusieurs pools de connexions à la base de données sont souvent créés et placés dans le pool pour la sauvegarde. À ce stade, l'initialisation de la connexion est terminée. Pour le traitement des demandes métier, les connexions disponibles existantes sont directement utilisées pour éviter la surcharge de temps liée au processus d'initialisation et de libération de la connexion à la base de données, réduisant ainsi le temps de réponse global du système
3. Gestion unifiée des connexions pour éviter les fuites de connexion à la base de données
Dans une implémentation de pool de connexions à la base de données relativement complète, la récupération forcée peut être basée sur le paramètre de délai d'expiration d'occupation de connexion prédéfini. La connexion occupée évite ainsi les fuites de ressources qui peuvent survenir lors des opérations régulières de connexion à la base de données.
Il existe actuellement de nombreux produits de pool de connexions à des bases de données, notamment :
1, dbcp
dbcp, le pool de connexions à la base de données produit par Apache, est recommandé par l'équipe de développement Spring. Il est activement développé et est un produit de pool de connexions à la base de données extrêmement largement utilisé. Cependant, depuis Internet
2, c3p0
le pool de connexions à la base de données recommandé par l'équipe de développement Hibernate, qui implémente la liaison des sources de données et JNDI
3. Proxool
Proxool a une bonne réputation et il n'y a pas de commentaires négatifs (par exemple, dbcp n'est pas utilisé par Hibernate). car Hibernate pense qu'il y a trop de bugs. Recommandé) est également le pool de connexions à la base de données recommandé par l'équipe de développement d'Hibernate, mais il n'y a pas beaucoup d'utilisateurs et le développement n'est pas assez actif. Ce pool de connexions fournit la fonction de surveillance du pool de connexions, qui est pratique et facile à utiliser, ce qui facilite la détection des fuites du pool de connexions
Création du framework de base JDBC basé sur Spring
Parlons-en d'abord. Utilisez Spring pour implémenter JDBC. Le pool de connexions à la base de données utilise DBCP recommandé par l'équipe de développement de Spring et nécessite trois packages jar :
1. jar. Il est disponible sur le site officiel. Cliquez sur J'ai téléchargé
2.commons.pool-1.6.jar, qui est disponible sur le site officiel. Cliquez ici pour télécharger
3. .collections4-4.0.jar, disponible sur le site officiel
Après avoir téléchargé ces trois packages jar, veuillez les importer dans votre propre projet (remarque : n'oubliez pas d'importer le MySql package). Bien que dbcp et pool aient des versions dbcp2 et pool2, elles sont disponibles sur le site officiel d'Apache. Elles peuvent être téléchargées, mais l'adresse de téléchargement de la version de dbcp1 et pool1 est fournie ici. L'une des raisons est que dbcp2 et pool2. ne peut s'exécuter que dans JDK 1.7 et supérieur, tandis que dbcp1 et pool1 peuvent s'exécuter dans JDK 1.6 Run, étant donné que le JRE par défaut fourni avec MyEclipse10 est la version 1.6, alors téléchargez et utilisez dbcp1 et pool1 ici. Si vous voulez dbcp2 et pool2, vous pouvez les télécharger depuis le site officiel d'Apache. Cependant, veuillez noter que dbcp2 doit être associé à pool2 et que dbcp1 doit être associé à pool1. Ils ne peuvent pas être utilisés de manière interchangeable.
JDBC, j'ai déjà écrit un article. La création de base de données et les classes d'entités sont toutes utilisées dans l'article original. Ici, je viens de déplacer le JDBC natif vers Spring JDBC. . Ajoutez plus de fonctions, la catégorie de gestion des étudiants est :
public class StudentManager { private JdbcTemplate jdbcTemplate; private static StudentManager instance = new StudentManager(); public static StudentManager getInstance() { return instance; } public JdbcTemplate getJdbcTemplate() { return jdbcTemplate; } public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } }
Le fichier de configuration XML de Spring s'appelle jdbc.xml, et jdbc.xml s'écrit comme :
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <!-- 驱动包名 --> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <!-- 数据库地址 --> <property name="url" value="jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8;" /> <!-- 用户名 --> <property name="username" value="root" /> <!-- 密码 --> <property name="password" value="root" /> <!-- 最大连接数量 --> <property name="maxActive" value="150" /> <!-- 最小空闲连接 --> <property name="minIdle" value="5" /> <!-- 最大空闲连接 --> <property name="maxIdle" value="20" /> <!-- 初始化连接数量 --> <property name="initialSize" value="30" /> <!-- 连接被泄露时是否打印 --> <property name="logAbandoned" value="true" /> <!-- 是否自动回收超时连接 --> <property name="removeAbandoned" value="true" /> <!-- 超时等待时间(以秒为单位) --> <property name="removeAbandonedTimeout" value="10" /> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="studentManager" class="com.xrq.jdbc.StudentManager" factory-method="getInstance"> <property name="jdbcTemplate" ref="jdbcTemplate" /> </bean> </beans>
public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("jdbc.xml"); System.out.println(StudentManager.getInstance()); System.out.println(StudentManager.getInstance().getJdbcTemplate()); }
fonctionne sans aucun problème. J'obtiens l'adresse de référence de StudentManager et l'adresse de référence de l'attribut jdbcTemplate dans StudentManager, indiquant que toute la connexion et l'injection ne posent aucun problème.
JDBCTemple est le modèle JDBC le plus basique de Spring, utilisant JDBC et de simples indexparamètresrequête pour fournir un accès simple à la base de données. En plus de JDBCTemplate, Spring propose également deux classes : NamedParameterJdbcTemplate et SimpleJdbcTemplate. La première peut lier des valeurs aux paramètres nommés dans SQL lors de l'exécution de requêtes au lieu d'utiliser des index. La seconde profite des fonctionnalités de Java 5 telles que l'autoboxing, les génériques et <.>Paramètre variable liste pour simplifier l'utilisation des modèles JDBC. Lequel utiliser dépend des préférences personnelles. JdbcTemplate est utilisé ici, donc JdbcTemplate est ajouté à la classe de gestion des étudiants.
De plus : 1. dbcp fournit de nombreux paramètres pour la configuration utilisateur. La signification de chaque paramètre est écrite dans le . Pour connaître la signification de chaque paramètre, vous pouvez la vérifier en ligne2. Faites attention à l'attribut url de dbcp. L'url fait référence à l'adresse de connexion à la base de données doit être convertie lorsque vous rencontrez des
caractères spéciauxSignification , donc le "&" devient ici "&", sinon une erreur sera signalée Ajouter, supprimer, modifier et vérifier JDBC en fonction de Spring
Partie ci-dessus du framework de base de Spring JDBC est construit. Voyons comment le code Java implémente CRUD Dans ce processus, jdbc.xml n'a pas besoin d'être modifié.1. Ajoutez des informations sur l'étudiant, le code est :
2. Supprimez les
informations sur l'étudiant spécifiées en fonction de l'identifiant, le code est :
.// 添加学生信息 public boolean addStudent(Student student) { try { jdbcTemplate.update("insert into student values(null,?,?,?)", new Object[]{student.getStudentName(), student.getStudentAge(), student.getStudentPhone()}, new int[]{Types.VARCHAR, Types.INTEGER, Types.VARCHAR}); return true; } catch (Exception e) { return false; } }
3. Mettre à jour les informations sur l'étudiant en fonction de l'identifiant , le code est :
// 根据Id删除单个学生信息 public boolean deleteStudent(int id) { try { jdbcTemplate.update("delete from student where studentId = ?", new Object[]{id}, new int[]{Types.INTEGER}); return true; } catch (Exception e) { return false; } }
4. Interroger les informations sur l'étudiant en fonction de l'identifiant, le code est : .
5. Pour interroger toutes les informations sur les étudiants, le code est :// 根据Id更新指定学生信息 public boolean updateStudent(int Id, Student student) { try { jdbcTemplate.update("update student set studentName = ?, studentAge = ?, studentPhone = ? where studentId = ?", new Object[]{student.getStudentName(), student.getStudentAge(), student.getStudentPhone(), Id}, new int[]{Types.VARCHAR, Types.INTEGER, Types.VARCHAR, Types.INTEGER}); return true; } catch (Exception e) { return false; } }Il s'agit d'une simple opération CRUD Avec ces 5 comme base, le reste peut être étendu sur la base de. ces 5, je ne continuerai donc pas à écrire en détail. Poursuivant, permettez-moi de parler de quelques points à noter :
// 根据学生Id查询单个学生信息 public Student getStudent(int id) { try { return (Student)jdbcTemplate.queryForObject("select * from student where studentId = ?", new Object[]{id}, new int[]{Types.INTEGER}, new RowMapper<Student>(){ public Student mapRow(ResultSet rs, int arg1) throws SQLException { Student student = new Student(rs.getInt(1), rs.getString(2), rs.getInt(3), rs.getString(4)); return student; } }); } // 根据Id查询学生信息抛异常, 不管什么原因, 认为查询不到该学生信息, 返回null catch (DataAccessException e) { return null; } }
1 Par expérience personnelle, à l'exception de la dernière requête, il est recommandé d'ajouter try. ..catch... bloque les autres, car dans Lorsque l'opération échoue, une exception
sera levée// 查询所有学生信息 public List<Student> getStudents() { List<Map<String, Object>> resultList = jdbcTemplate.queryForList("select * from student"); List<Student> studentList = null; if (resultList != null && !resultList.isEmpty()) { studentList = new ArrayList<Student>(); Map<String, Object> map = null; for (int i = 0; i < resultList.size(); i++) { map = resultList.get(i); Student student = new Student( (Integer)map.get("studentId"), (String)map.get("studentName"), (Integer)map.get("studentAge"), (String)map.get("studentPhone") ); studentList.add(student); } } return studentList; }Si vous l'attrapez, vous saurez que l'opération a échoué. Sinon, le programme sera terminé. , et vous ne saurez pas si l'opération a réussi ou échoué 2. Lors de l'ajout ou de la mise à jour d'informations, il n'est pas recommandé d'utiliser chaque champ à opérer comme paramètre formel. être une classe d'entité Student. Ceci est plus conforme aux
orientés objetprincipes de conception
, deuxièmement, il existe de nombreux champs dans la liste des paramètres formels, ce qui peut facilement conduire à des erreurs3. Pour les méthodes de mise à jour et de requête, s'il y a des espaces réservés ?, il est recommandé de choisir surcharge avec les types de paramètres Méthode, précisez le type de champ de chaque espace réservé, tout comme ce que j'ai écrit dans le code ci-dessus
Enfin, voici lesutilisations de base de jdbcTemplate, il existe de nombreuses méthodes dans jdbcTemplate , je n'entrerai pas dans les détails une par une. Vous pouvez l'essayer vous-même, ou. vous pouvez consulter la documentation Spring API
.Lire les données dans le fichier de configuration
Avant, nous avons configuré certaines propriétés de la connexion à la base de données dans db.properties, ce qui facilite la modification, mais ici est-il codé en dur dans jdbc.xml, nous devons donc réfléchir à un moyen de lire la configuration à partir de db.properties. Le contexte aide les développeurs à y parvenir. Jetez un œil à la façon dont jdbc.xml est écrit :【Recommandations associées】
1Tutoriel vidéo gratuit Java
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <context:property-placeholder location="classpath:db.properties"/> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <!-- 驱动包名 --> <property name="driverClassName" value="${mysqlpackage}" /> <!-- 数据库地址 --> <property name="url" value="${mysqlurl}" /> <!-- 用户名 --> <property name="username" value="${mysqlname}" /> <!-- 密码 --> <property name="password" value="${mysqlpassword}" /> <!-- 最大连接数量 --> <property name="maxActive" value="150" /> <!-- 最小空闲连接 --> <property name="minIdle" value="5" /> <!-- 最大空闲连接 --> <property name="maxIdle" value="20" /> <!-- 初始化连接数量 --> <property name="initialSize" value="30" /> <!-- 连接被泄露时是否打印 --> <property name="logAbandoned" value="true" /> <!-- 是否自动回收超时连接 --> <property name="removeAbandoned" value="true" /> <!-- 超时等待时间(以秒为单位) --> <property name="removeAbandonedTimeout" value="10" /> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="studentManager" class="com.xrq.jdbc.StudentManager" factory-method="getInstance"> <property name="jdbcTemplate" ref="jdbcTemplate" /> </bean> </beans>
2
Manuel du didacticiel JAVAAnalyse complète des annotations JavaCe qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!