Maison > Java > javaDidacticiel > le corps du texte

Introduction aux méthodes de la base de données JDBC au Spring

Y2J
Libérer: 2017-05-11 10:08:05
original
1619 Les gens l'ont consulté

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;
 }
}
Copier après la connexion

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>
Copier après la connexion

fonction principale est :

public static void main(String[] args)
{ 
 ApplicationContext ac = 
  new ClassPathXmlApplicationContext("jdbc.xml");
 System.out.println(StudentManager.getInstance());
 System.out.println(StudentManager.getInstance().getJdbcTemplate());
}
Copier après la connexion

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 ligne <🎜. >

2. 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éciaux

Signification <🎜. >, 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;
 }
}
Copier après la connexion

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;
 }
}
Copier après la connexion

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;
 }
}
Copier après la connexion

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;
 }
}
Copier après la connexion

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;
}
Copier après la connexion
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 erreurs

3. 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 les

utilisations 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】

1

Tutoriel 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>
Copier après la connexion

2

Manuel du didacticiel JAVA

3. .

Analyse complète des annotations Java

Ce 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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal