当前位置:网站首页>Beaucoup d'enfants ne savent pas grand - chose sur le principe sous - jacent du cadre orm, non, ice River vous emmène 10 minutes à la main "un cadre orm minimaliste" (collectionnez - le maintenant)
Beaucoup d'enfants ne savent pas grand - chose sur le principe sous - jacent du cadre orm, non, ice River vous emmène 10 minutes à la main "un cadre orm minimaliste" (collectionnez - le maintenant)
2022-07-08 01:55:00 【Glacier】
Bonjour tout le monde,Je suis iceberg~~
Ces derniers temps, beaucoup de petits amisORMLa mise en œuvre du cadre est intéressante,Beaucoup de lecteurs ont demandé sur Ice River Wechat:Glacier,Tu le sais.ORMComment le cadre a - t - il été mis en œuvre??CommeMyBatisEtHibernateCe genre deORMCadre,Comment sont - ils réalisés??
Afin de permettre aux partenaires de mieux comprendreORMPrincipes de mise en œuvre du cadre,Ice River a décidé de faire une version minimalisteORMCadre,Laissez les gars voir ce que c'est.ORMCadre?ORMComment fonctionne exactement le cadre?ORMComment les cadres cartographient les objets de programme aux données de la base de données?Mais,On commence officiellement.ORMAvant le cadre,Nous devons d'abord découvrir ce qu'estORMCadre.
Qu'est - ce queORMCadre?
ORMNom complet:Object Relational Mapping,Traduit en chinois:Cartographie des relations objet.C'est - à - direORMLe cadre est le cadre de cartographie des relations objet,Il décrit les détails de la cartographie des objets et des relations au moyen de métadonnées,ORMLe cadre fonctionne,Les données peuvent être maintenues dans la base de données en fonction de la relation entre la correspondance et la cartographie.
En fait...,Essentiellement,ORMLe cadre met principalement en œuvre la cartographie des objets du programme aux données de la base de données relationnelle..Dis - le en blanc:ORMLe cadre consiste à relier les entités et les relations entre elles.,Convertir en équivalentSQLDéclarations,AdoptionSQLInstruction Operation Database,Persistance des données dans la base de données,Et effectuer les opérations correspondantes d'ajout, de suppression et de modification des données.
Les types les plus couramment utilisésORMLe cadre est::MyBatis、HibernateEtJFinal.
Pince à mainORMCadre
Ici., On a simulé un coup de main HibernateMise en œuvre du cadreORM, Les petits amis peuvent aussi simuler d'autres ORMMise en œuvre du cadre, Les principes de base sont communs . Si tout le monde simule une autre mise en œuvre manuelle du cadre ORMHeure,En cas de problème, Peut parler en privé de moi pour communiquer , Ce que je vois ,Je répondrai à tout le monde pour la première fois.
C'est bon,Dis - le et fais - le,On y va.

@TableMise en œuvre des annotations
Tout d'abord,,Nous créons unio.mykit.annotation.jdk.db.provider JavaSac,IciJavaLe paquet crée [email protected],@TableLes annotations sont marquées àJavaEn classe, Indique à quelle table de données la classe courante sera cartographiée dans la base de données ,Comme suit.
package io.mykit.annotation.jdk.db.provider;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/** * PersonnalisationTableNotes * @author binghe * */
@Inherited
@Target({
ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Table {
String value() default "";
}
@ColumnMise en œuvre des annotations
La même chose.,Inio.mykit.annotation.jdk.db.providerCréer [email protected],@Column Annotation annotée sur les champs de la classe , Indique à quel champ de la classe courante est mappé dans la table de données ,Comme suit.
package io.mykit.annotation.jdk.db.provider;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/** * PersonnalisationColumnNotes * @author binghe * */
@Inherited
@Target({
ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Column {
String value() default "";
}
Regarde ça., Qu'il ait été utilisé MyBatis Le petit ami de HibernatePetit ami de, Je suppose que tout le monde le saura ?C'est vrai,@TableNotes [email protected],Que ce soit dansMyBatisLe cadre ouHibernateDans le cadre, Sont utilisés pour .Ici., Nous incluons la version minimaliste ORMDans le cadre, Ces deux notes classiques ont également été utilisées .
Créer une classe d'entité
Inio.mykit.annotation.jdk.db.provider.entityCréer une classe d'entité sous le paquetUser,[email protected] [email protected] Les annotations sont marquées séparément sur UserClasse etUser Sur les champs de la classe , Cartographiez - le aux tableaux de données de la base de données et aux champs des tableaux de données ,Comme suit.
package io.mykit.annotation.jdk.db.provider.entity;
import io.mykit.annotation.jdk.db.provider.Column;
import io.mykit.annotation.jdk.db.provider.Table;
/** * Personnaliser les entités qui utilisent des annotations * @author binghe * */
@Table("t_user")
public class User implements Serializable{
@Column("id")
private String id;
@Column("name")
private String name;
public User() {
super();
}
public User(String id, String name) {
super();
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
}
Annoter la mise en œuvre de la classe d'analyse
Inio.mykit.annotation.jdk.db.provider.parserCréer unAnnotationParserCatégorie,AnnotationParser La classe est au cœur du cadre , Il est responsable de l'analyse des annotations annotées sur les classes d'entités , Et cartographier la classe d'entité correspondante et ses informations de champ sur la Feuille de données et le champ correspondants ,Comme suit.
package io.mykit.annotation.jdk.db.provider.parser;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import io.mykit.annotation.jdk.db.provider.Column;
import io.mykit.annotation.jdk.db.provider.Table;
/** * Résoudre les annotations personnalisées * @author binghe * */
public class AnnotationParser {
/** * Assembler les critères de requête par annotation ,Générer une instruction de requête * @param obj * @return */
public static String assembleSqlFromObj(Object obj) {
Table table = obj.getClass().getAnnotation(Table.class);
StringBuffer sbSql = new StringBuffer();
String tableName = table.value();
sbSql.append("select * from " + tableName + " where 1=1 ");
Field[] fileds = obj.getClass().getDeclaredFields();
for (Field f : fileds) {
String fieldName = f.getName();
String methodName = "get" + fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
try {
Column column = f.getAnnotation(Column.class);
if (column != null) {
Method method = obj.getClass().getMethod(methodName);
Object v = method.invoke(obj);
if (v != null) {
if (v instanceof String) {
String value = v.toString().trim();
// Déterminer si le paramètre est in Paramètre de type 1,2,3
if (value.contains(",")) {
//EnlevezvalueDans,
String sqlParams = value.replace(",", "").trim();
//value Le milieu est plein de chiffres
if(isNum(sqlParams)){
sbSql.append(" and " + column.value() + " in (" + value + ") ");
}else{
String[] split = value.split(",");
//Oui.valueRéinitialiser à null
value = "";
for(int i = 0; i < split.length - 1; i++){
value += "'"+split[i]+"',";
}
value += "'"+split[split.length - 1]+"'";
sbSql.append(" and " + column.value() + " in (" + value + ") ");
}
} else {
if(value != null && value.length() > 0){
sbSql.append(" and " + column.value() + " like '%" + value + "%' ");
}
}
} else {
sbSql.append(" and " + column.value() + "=" + v.toString() + " ");
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return sbSql.toString();
}
/** * Vérifiez si la valeur donnée est id Type 1. Vérifier le nom du champ 2. Vérifier les valeurs des champs * * @param target * @return */
public static boolean isNum(String target) {
boolean isNum = false;
if (target.toLowerCase().contains("id")) {
isNum = true;
}
if (target.matches("\\d+")) {
isNum = true;
}
return isNum;
}
}
Jusqu'ici., Notre version minimaliste ORM Le cadre sera mis en place , Mais ce n'est pas encore fait , On va aussi le tester et le valider .
Mise en œuvre de la classe test
Inio.mykit.annotation.jdk.providerCréer sous le paquetAnnotationTest Catégorie, Pour tester la minimalité de notre mise en œuvre ORMEffets du cadre,Les détails sont les suivants:.
package io.mykit.annotation.jdk.provider;
import org.junit.Test;
import io.mykit.annotation.jdk.db.provider.entity.User;
import io.mykit.annotation.jdk.db.provider.parser.AnnotationParser;
import io.mykit.annotation.jdk.provider.parser.AnnotationProcessor;
/** * Tester les annotations personnalisées * @author binghe * */
public class AnnotationTest {
@Test
public void testDBAnnotation(){
User testDto = new User("123", "34");
User testDto1 = new User("123", "test1");
User testDto2 = new User("", "test1,test2,test3,test4");
String sql = AnnotationParser.assembleSqlFromObj(testDto);
String sql1 = AnnotationParser.assembleSqlFromObj(testDto1);
String sql2 = AnnotationParser.assembleSqlFromObj(testDto2);
System.out.println(sql);
System.out.println(sql1);
System.out.println(sql2);
}
}
Exécution des tests
On tourneAnnotationTest#testDBAnnotation()Méthodes, La ligne de commande affiche les informations suivantes .
select * from t_user where 1=1 and id like '%123%' and name like '%34%'
select * from t_user where 1=1 and id like '%123%' and name like '%test1%'
select * from t_user where 1=1 and name in ('test1','test2','test3','test4')
Je vois., Nous avons testé , Il n'y a pas de SQLDéclarations, Au lieu de créer directement UserObjet de la classe,Et appelleAnnotationParser#assembleSqlFromObj()Analyser, Et Convertit l'objet de classe d'entité correspondant en SQLDéclaration retournée.
En fait...,MyBatisEtHibernate Le principe de base sous - jacent de ,Vous avez appris?? Si vous ne comprenez pas, parlez - moi en privé . Ouvrez rapidement votre environnement de développement , Une version minimaliste à la main ORMLe cadre.!!
Si vous avez des questions, laissez un message ci - dessous.,Si l'article vous aide un peu, Bienvenue à envoyer à d'autres petits partenaires ~~
C'est bon,Viens ici aujourd'hui.,Je suis iceberg,On se voit la prochaine fois.~~
À la fin
Si vous voulez entrer dans une grande usine,Je veux une promotion et une augmentation.,Ou être confus par votre travail actuel,Vous pouvez me faire confiance.,J'espère que certaines de mes expériences vous aideront.~~
Lectures recommandées:
- 《La pratique donne la vérité:Décryptage de l'architecture du système de tir instantané le plus puissant de l'ensemble du réseau,Toutes les secondes ne sont pas des secondes.!!》
- 《De zéro à des centaines de millions d'utilisateurs,Comment optimiser pas à pasMySQLDe la base de données?(Collection recommandée)》
- 《J'ai encore optimisé le système de correction de données massives avec Multithreading dans le cadre du Service de commerce électronique à 100 millions de flux,Les performances ont encore augmenté200%!!(Tout le séchage,Collection recommandée)》
- 《J'ai optimisé le système de correction de données massives avec Multithreading dans le cadre d'un service de commerce électronique à 100 millions de niveaux de trafic,Amélioration directe des performances200%!!(Tout le séchage,Collection recommandée)》
- 《Je l'utilise.10Le diagramme résume ce meilleur parcours d'apprentissage pour la programmation simultanée!!(Collection recommandée)》
- 《Une serrure plus rapide qu'une serrure de lecture - écriture dans un scénario de haute concurrence,J'ai été complètement humilié après avoir vu ça.!!(Collection recommandée)》
- 《Résumé de l'optimisation de la performance la plus complète de l'ensemble du réseau!!(Traitement de l'hématémèse glaciaire,Collection recommandée)》
- 《Trois jours, c'est fini.MyBatis,N'hésitez pas à demander.!!(Traitement de l'hématémèse glaciaire,Collection recommandée)》
- 《Conseillez aux jeunes qui viennent de travailler:Pour entrer dans une grande usine,Ces connaissances en programmation simultanée sont quelque chose que vous devez maîtriser!Parcours d'apprentissage complet!!(Collection recommandée)》
- 《Conseillez aux jeunes qui viennent de travailler:Pour entrer dans une grande usine,Ces compétences de base sont ce que vous devez maîtriser!Parcours d'apprentissage complet!!(Collection recommandée)》
- 《Conseillez aux jeunes qui viennent de travailler:Plus tôt ces bases d'ordinateur et de système d'exploitation seront connues, mieux ce sera!C'est trop long.!!(Collection recommandée)》
- 《J'ai mis trois jours à développer un jeu national pour tous les âges,Prise en charge de la musique,Le code source complet et les commentaires sont maintenant ouverts(Collection recommandée)!!》
- 《Je suis un programmeur hautement simultané pour le noyau le plus dur du réseau,CSDNBlogueurs les plus concernés,Tout le monde est d'accord??(Collection recommandée)》
- 《Cinq ans après l'obtention du diplôme,Du salaire mensuel3000Un million de dollars par an.,Quelles sont mes compétences de base??(Collection recommandée)》
- 《J'ai envahi la fille d'à côté.Wifi,Découverte...(Marchandises sèches sur le terrain,Collection recommandée)》
- 《N'essaie pas si facilement.“Panda brûlant de l'encens”,Non.,Je regrette.!》
- 《Entraînement secret pour le festival Qingming“Panda brûlant de l'encens”,Mon ordinateur est un panda.“J'ai donné ma vie.”!》
- 《7.3Explosion du foieJava8Nouvelles caractéristiques,Je ne crois pas que tu puisses finir.!(Collection recommandée)》
- 《Quelle expérience de débrancher un serveur pendant les heures de pointe?》
- 《Le plus complet du réseauLinuxRésumé des commandes!!(Le plus complet de tous les temps.,Collection recommandée)》
- 《AvecPythonJ'ai écrit un outil.,Parfait.MySQL!!(Collection recommandée)》
- 《SimpleDateFormatPourquoi la classe n'est - elle pas Thread - Safe??(Six solutions jointes,Collection recommandée)》
- 《MySQL 8Les trois nouveaux index,Directement.MySQLC'est parti.,Tu ne le sais pas encore.!!(Collection recommandée)》
- 《Terminé.SpringCode source,J'ai ouvert ce cadre de cache distribué!!(Collection recommandée)》
- 《100 millions de niveaux de flux élevés et de produits du système de tir instantané“Surproduction”C'est,Uniquement parce queJDKCes deux énormes fosses existent dans le conteneur synchrone!!(Enregistrement de la marche sur la fosse,Collection recommandée)》
- 《Conseillez aux jeunes qui viennent de travailler:Pour bien apprendre la programmation simultanée,Les trous dans ces conteneurs simultanés sont quelque chose que vous devez remarquer!!(Collection recommandée)》
- 《Les outils de déclaration de l'entreprise sont trop difficiles à utiliser,J'ai passé trois jours àExcelOutils,C'est très utile d'appeler directement la soeur de l'opérateur,Open Source now!!(Collection recommandée)》
- 《Conseillez aux jeunes qui viennent de travailler:Pour entrer dans une grande usine,Ces compétences de base en programmation simultanée sont ce que vous devez maîtriser!!(Collection recommandée)》
- 《Ali intervieweur:Comment résoudre correctement le problème de surproduction des stocks dans le système de contrôle de la concurrence?(Collection recommandée)》
- 《RedisRésumé des cinq principaux types de données et scénarios d'utilisation!!(Y compris les cas réels complets,Collection recommandée)》
C'est bon,Viens ici aujourd'hui.,Les gars, c'est super、Collection、Commentaires,Un bouton et trois marches consécutives.,Je suis iceberg,On se voit la prochaine fois.~~
边栏推荐
- 剑指 Offer II 041. 滑动窗口的平均值
- If time is a river
- Apache multiple component vulnerability disclosure (cve-2022-32533/cve-2022-33980/cve-2021-37839)
- Node JS maintains a long connection
- CV2 read video - and save image or video
- Kwai applet guaranteed payment PHP source code packaging
- C语言-Cmake-CMakeLists.txt教程
- 日志特征选择汇总(基于天池比赛)
- burpsuite
- DataWorks值班表
猜你喜欢

I don't know. The real interest rate of Huabai installment is so high

adb工具介绍

How to make enterprise recruitment QR code?

Exit of processes and threads

Capability contribution three solutions of gbase were selected into the "financial information innovation ecological laboratory - financial information innovation solutions (the first batch)"

burpsuite

Summary of log feature selection (based on Tianchi competition)

【目标跟踪】|DiMP: Learning Discriminative Model Prediction for Tracking

滑环使用如何固定

nacos-微服务网关Gateway组件 +Swagger2接口生成
随机推荐
Codeforces Round #649 (Div. 2)——A. XXXXX
CV2 read video - and save image or video
A comprehensive and detailed explanation of static routing configuration, a quick start guide to static routing
微软 AD 超基础入门
由排行榜实时更新想到的数状数值
2022国内十大工业级三维视觉引导企业一览
Matlab r2021b installing libsvm
Mysql database (2)
Why did MySQL query not go to the index? This article will give you a comprehensive analysis
【目标跟踪】|atom
Redismission source code analysis
The method of using thread in PowerBuilder
静态路由配置全面详解,静态路由快速入门指南
Redission源码解析
Is it necessary for project managers to take NPDP? I'll tell you the answer
什么样的MES系统才是好系统
WPF custom realistic wind radar chart control
Redisson分布式锁解锁异常
剑指 Offer II 041. 滑动窗口的平均值
How to make enterprise recruitment QR code?