当前位置:网站首页>Idea construit le projet jfinal + génération automatique de code + test de fonctionnement de la base de données (trois méthodes)
Idea construit le projet jfinal + génération automatique de code + test de fonctionnement de la base de données (trois méthodes)
2022-07-22 19:03:00 【Xiaobai a dit】
Catalogue des articles
2.、IDEAConstructionJFinalProjets+Génération automatique de code+Fonctionnement de la base de données(Trois modes de fonctionnement)
Dans le chapitre précédent,UtiliséEclipseDansJBoltLe plug - in faitJFinalConstruction rapide du projet,Et le plug - in offre une variété d'outils de construction rapide,C'est pratique, mais pour l'instant, il est préférable de construire votre propre projet étape par étape pour mieux comprendreJFinalArchitecture et étapes du projet de construction du cadre,.En même temps, vous pouvez également comprendre les différentes informations de configuration à l'intérieur.J'ai aussi remplacé un autre outil de développementIDEAPour construire le projet,Mais les étapes et la façon dont elles sont utilisées sont liées àEclipseC'est la même chose.
Malgré l'utilisationmavenPeut faire mieuxjarGestion des versions des paquets,Mais j'ai décidé de ne pas créermavenProjets,N'utilisez que l'originalwebPour construire unJFinalProjet à tester(JFinalLe projet est conformeJava Web Projet ordinaire de spécification , Pas besoin de le traiter différemment ). Ce projet n'explique pas pourquoi , Juste la configuration +Utiliser. Après la familiarisation ,Sera ciblé surJFinal Chaque composant est étudié en détail .
1、Structure technique du projet
2、IDEACréer sousJava WebProjets
Cliquez surFinishAprèsIDEA Le projet est automatiquement créé , Jusqu'à présent, celui - ci est IDEACréationweb Le projet est terminé .
3、JFinalConfiguration du projet
Importer des paquets dépendants
mysqlDépendance:mysql-connector-java-5.1.38.jar
jfinalDépendance:jfinal-4.9.jar
druidDépendance du pool de connexion à la base de données:druid-1.1.10.jar
2. Configurationweb.xmlDocumentation
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_4_0.xsd" version="3.0">
<filter>
<filter-name>jfinal</filter-name>
<filter-class>com.jfinal.core.JFinalFilter</filter-class>
<init-param>
<param-name>configClass</param-name>
<!--RÉFÉRENCESjfinalConfigurer le chemin du paquet pour la classe-->
<param-value>com.dz.AppConfig</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>jfinal</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
CompilationjfinalConfigurer la classe——SuccessionJFinalConfig
web.xml C'est cette classe de configuration qui est configurée ,QuandwebAu début du projet, La classe de configuration sera chargée .
public class AppConfig extends JFinalConfig { @Override public void configConstant(Constants constants) { //ConfigurationJFinalValeur constante } @Override public void configRoute(Routes routes) { //Cette méthode est utilisée pour configurer le routage d'accès } @Override public void configEngine(Engine engine) { //Cette méthode est utilisée pour configurerTemplate Engine } @Override public void configPlugin(Plugins plugins) { //Cette méthode est utilisée pour configurerJFinalDePlugin } @Override public void configInterceptor(Interceptors interceptors) { //Configurer l'intercepteur global } @Override public void configHandler(Handlers handlers) { //Cette méthode est utilisée pour configurerJFinalDeHandler } @Override public void onStart() { // Rappel après le démarrage du système super.onStart(); } @Override public void onStop() { // Rappel avant l'arrêt du système super.onStop(); } }
Une fois la configuration ci - dessus terminée, le projet peut être déployé à tomcatÀ mi - chemin, Mais c'est un projet vide qui n'a pas de sens après le lancement .
Remarques:
Je suisIDEAUtilisé dansJetty Le projet de démarrage du serveur n'a pas réussi , Toujours démarrer le serveur avec succès mais ne pas charger le projet ,web.xml Le fichier n'est pas chargé . Si vous avez des amis qui savent comment résoudre le problème ou qui ont lu des articles similaires, vous pouvez recommander des liens dans la section commentaires .
4、JFinalProjet générateur de code automatique
/** * JfinalOutils de génération de code */
public class JFinalGenerator {
/** * Créer un pool de connexion à la base de données,Obtenir des informations sur la connexion à la base de données * * @return */
public static DataSource getDataSource() {
DruidPlugin druidPlugin = new DruidPlugin("jdbc:mysql://localhost:3306/jfinal_test?characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull", "root", "root");
druidPlugin.start(); // Démarrer le pool de connexion à la base de données
return druidPlugin.getDataSource(); //Obtenir une connexion à la base de données
}
public static void main(String[] args) {
// base model Nom du paquet utilisé
String baseModelPackageName = "com.dz.model.base";
// base model Chemin d'enregistrement du fichier
// System.getProperty("user.dir"): Obtenir le chemin actuel du programme
String baseModelOutputDir = System.getProperty("user.dir") + "/src/com/dz/model/base";
System.out.println("baseModelOutputDirChemin du fichier:" + baseModelOutputDir);
// model Nom du paquet utilisé (MappingKit Nom du paquet utilisé par défaut )
String modelPackageName = "com.dz.model";
// model Chemin d'enregistrement du fichier (MappingKit Avec DataDictionary Chemin d'enregistrement par défaut du fichier)
String modelOutputDir = baseModelOutputDir + "/..";
// Créer un générateur, Créer un générateur à partir des informations de connexion à la base de données
Generator generator = new Generator(getDataSource(), baseModelPackageName, baseModelOutputDir, modelPackageName, modelOutputDir);
// Configurer si les notes sont générées
generator.setGenerateRemarks(true);
// Définir le dialecte de la base de données
generator.setDialect(new MysqlDialect());
// Définir si la chaîne est générée setter Méthodes
generator.setGenerateChainSetter(false); //or true
// Ajouter un nom de table qui n'a pas besoin d'être généré
//generator.addExcludedTable("adv");
// Définir si oui ou non Model Moyenne dao Objet
generator.setGenerateDaoInModel(false);
// Définir s'il faut générer un fichier Dictionnaire
generator.setGenerateDataDictionary(true);
// Préfixe de table à supprimer
generator.setRemovedTableNamePrefixes("j_");
// Générer
generator.generate();
}
}
Une nouvelle base de données de test a été créée jfinal_test, Il y a deux tables j_userEtj_product, Les champs de la base de données ne sont pas affichés ,GénérermodelC'est tout..
Répertoire des fichiers après construction :
_MapingKit.java:Base de données etmodelFichier de cartographie pour, Besoin d'appeler dans le profil , Ajouter une relation de cartographie .
_DataDictionary.txt:Est un dictionnaire de données,Peut ne pas générer.
base: Les deux classes à l'intérieur sont des relations de cartographie avec les champs de base de données un par un , Vous pouvez obtenir les valeurs des champs de la base de données , Vous pouvez également définir des valeurs .
ProductEtUser: Hérite de deux classes de base ,En créantproductOuuser Les objets peuvent appeler séparément set/getMéthodes. Officiellement, il n'est pas recommandé d'écrire des opérations de base de données dans ces deux classes , Si vous voulez écrire .
5、Fonctionnement de la base de données
Parce que ce n'est pas encore jfinalÀ l'intérieur.junitTests, Alors, il faut d'abord écrire controller Lors d'un test d'accès . Si vous avez des amis qui font des tests ou lisent des articles similaires, vous pouvez envoyer un lien dans la section commentaires .
HelloController.java
//Distribution,Contrôle,Appelez public class HelloController extends Controller { @Inject private UserService userService; // Opération d'injection automatique au niveau de l'entreprise UserService user = new UserService(); // La méthode sans injection peut être directe newObjet //Tests public void getById() { User userById = user.getUserById(2); renderJson(userById); } // Obtenir un groupe de personnes public void getUsers() { List<User> users = userService.listUsers(); renderJson(users); } // Obtenir une personne public void getUser(@Para("userId") Integer userId) { User userById = userService.getUserById(userId); renderJson(userById); } // Pagination pour un groupe de personnes public void getPageUsers() { Page<User> userPage = userService.listPageUsers(); renderJson(userPage); } //Insérer(Mise à jour)Un homme. public void saveUserByUpdate() { int i = userService.saveUserByDbUpdate(); renderJson(i); } //Insérer(Mise à jour)Un homme. public void saveUserBySave() { boolean b = userService.saveUserByNewUser(); renderJson(b); } //Insérer(Mise à jour)Un homme. public void saveUserByRecord() { boolean b = userService.saveUserbyRecord(); renderJson(b); } }
UserService.java
//Écris.sql Déclarations et codes d'entreprise public class UserService { // Le livre objet est partagé à l'échelle mondiale , Uniquement pour les requêtes de base de données , Impossible d'héberger l'objet private static final User userDao = new User().dao(); // Obtenir un groupe de personnes public List<User> listUsers() { String sql = "select * from j_user"; List<User> users = userDao.find(sql); return users; } // Pagination pour un groupe de personnes public Page<User> listPageUsers() { //Nombre actuel de pages1, Deux par page return userDao.paginate(1, 2, "select *", " from j_user"); } // Obtenir une personne public User getUserById(Integer id) { return userDao.findById(id); } // Tout ce qui précède est une requête de base de données ,Note::dao Impossible de charger les données . // L'opération de mise à jour de la base de données ne peut pas être utilisée daoPour réaliser,Peut passerDb Classe d'outils pour implémenter . // Le support de données doit passer par new User().set("",""); Réaliser ou Db.update().Db Vous pouvez également effectuer des opérations de requête . //Db.update();Insérer des données public int saveUserByDbUpdate() { String sql = "insert into j_user(name,age,sex) values('yuqd',22,'Hommes')"; //Mode 1 int update = Db.update(sql); return update; } //new User().set().set()...save();Réalisation public boolean saveUserByNewUser() { //Mode 2:Je ne veux pas écrire.sqlVous pouvez choisir cette méthode boolean bool = new User().set("name", "yuqd_2").set("age", "23").set("sex", "Hommes2").save(); return bool; } public boolean saveUserbyRecord() { //Mode 3:Db+RecordMise à jour des données Record record = new Record().set("name", "yuqd_3").set("age", "24").set("sex", "Hommes3"); boolean j_user = Db.save("j_user", record); return j_user; } }
AppConfig.javaConfigurer la classe
À propos dejfinalClasse de configuration pour,Attention!Configuration constante、Configuration du routage、Configuration du plug - in La configuration principale du plug - in est DruidPluginPlug - ins etActiveRecordPlugin,Terminé.model Liens avec les tables de base de données .Attention à cette ligne
_MappingKit.mapping(arp);
public class AppConfig extends JFinalConfig { @Override public void configConstant(Constants constants) { constants.setDevMode(true); constants.setInjectDependency(true); // Activer l'injection dépendante . constants.setViewType(ViewType.JSP); // Définir le type de page JSP. } @Override public void configRoute(Routes routes) { routes.add("/", IndexController.class); // Page par défaut routes.add("/hello", HelloController.class, "/hello"); // Les annotations ne sont pas officiellement recommandées pour configurer le routage } @Override public void configEngine(Engine engine) { } @Override public void configPlugin(Plugins plugins) { String jdbcUrl = "jdbc:mysql://localhost:3306/jfinal_test?characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull"; String userName = "root"; String password = "root"; // Configuration druid Plug - in de pool de connexion à la base de données DruidPlugin druidPlugin = new DruidPlugin(jdbcUrl, userName, password); plugins.add(druidPlugin); // ConfigurationActiveRecordPlug - in //ActiveRecord - Oui. JFinal Un des éléments les plus fondamentaux , // Adoption ActiveRecord Pour exploiter la base de données, Cela réduira considérablement la quantité de code ,Améliorer considérablement l'efficacité du développement. ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin); // Toutes les cartes MappingKit Automatisation moyenne terminée , Notez d'abord cette section pour le moment , Après la génération automatisée, décochez _MappingKit.mapping(arp); plugins.add(arp); } @Override public void configInterceptor(Interceptors interceptors) { } @Override public void configHandler(Handlers handlers) { } @Override public void onStart() { super.onStart(); } @Override public void onStop() { super.onStop(); } }
6、Test d'accès
- Directementnew UserService()Objet pour accéder àserviceFonctionnement.
Tout ce qui suit appelle la méthode en injectant l'objet .
Par injectionserviceObjet,Obtenir tous les utilisateurs
AdoptionIdInterroger l'utilisateur actuel
Demande d'information de l'utilisateur par page
AdoptionDb.update();Mise en œuvreSqlMise à jour des déclarations
Adoptionnew User().set().save() Insérer un champ de base de données
AdoptionDb+RecordMise en œuvresqlDéclarations
Les résultats des essais ci - dessus montrent que , Les résultats de l'exploitation de la base de données ont été concluants !
Résumé
Un gros morceau de merde , Résumé en deux parties ,Génération automatique de code+Fonctionnement de la base de données.
Base de donnéesOpérations de requêteAdoption de la Déclaration:private static final User userDao = new User().dao(); Appeler la méthode de fonctionnement de la base de données .
Mise à jour de la base de données:
AdoptionDb.xxx();Mise en œuvresqlDéclarations.
AdoptionDb+Record;Mise à jour de la base de données,Record L'équivalent générique de model,Appelezset().save()Fonctionnement de la base de données.
Adoptionnew User().set().save();Fonctionnement de la base de données, Utilisé de la même façon que le deuxième .
Il peut également être modifié comme :
Mais, La clé primaire doit être spécifiée ,Sinon, il y aura une exception....
boolean bool2 = new User().set("name", "yuqd_2").set("age", "23").set("sex", "Hommes2").set("id", 1).update();
Si un ami a d'autres façons d'utiliser la base de données ou JFinal Fonctionnement de la base de données articles intéressants , Bienvenue dans la zone commentaires pour poster la connexion .
Connexion de référence:
http://www.jfinal.com/feedback/296
http://php-note.com/article/detail/aac226839952464485cdc1c66180bc30
边栏推荐
- 【链表技巧汇总】141.环形链表(简单)
- 【YOLOv5实战4】基于YOLOv5的交通标志识别系统-模型测试与评估
- 1. Closeable of qtablewidget, 2.pro/build_ pass、member,3.QString&&
- 逻辑回归中的损失函数
- 程序员面试金典面试题 01.01. 判定字符是否唯一
- [QT source code reuse] qdatetimeedit drop-down button event response
- mysql执行过程以及顺序
- Important knowledge points of go language: string, UTF-8 encoding, Rune
- 1.qt view source code
- [summary of linked list skills] 141. Circular linked list (simple)
猜你喜欢
Leetcode 105. constructing binary trees from preorder and inorder traversal sequences
用LaTeX写论文时如何加资助信息
JVM system optimization
Flink learning notes (IV) Flink runtime architecture
Leetcode 2028. find out the missing observation data
Six dimensional space
Summary of all usage of join in SQL syntax (simple example)
[summary of linked list skills] 141. Circular linked list (simple)
逻辑回归中的损失函数
MySQL statement execution order
随机推荐
Shell脚本调试技术
IP address, CIRD format URL, hostname regular expression
Recursively find the partial sum of simple alternating power series (15 points)
Summary of various materials - Network
Tcpdump simple usage
wget下载目录内的所有文件
PTA 6-11 find the median of self-determined type element sequence (25 points)
MySQL statement execution order
JVM调优实战-从零开始 | 项目有关JVM调优总结
代码—
PTA basic questions 7-28 monkeys choose the king (simple method)
Leetcode:196. delete duplicate email
Qt | boîtes de dialogue modales et non modales qdialog
OSI七层网络模型
写作单词积累
Cross entropy loss function
After the project is started, the mapper XML file is loaded circularly
【YOLOv5实战4】基于YOLOv5的交通标志识别系统-模型测试与评估
mysql执行过程以及顺序
[sliding window technique] 76. Minimum covering substring