当前位置:网站首页>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.provider
Cré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.entity
Cré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.parser
Cré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.provider
Cré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.~~
边栏推荐
- Is it necessary for project managers to take NPDP? I'll tell you the answer
- nmap工具介绍及常用命令
- MySQL查询为什么没走索引?这篇文章带你全面解析
- The body has a mysterious margin of 8px
- What kind of MES system is a good system
- 2022国内十大工业级三维视觉引导企业一览
- SQLite3 data storage location created by Android
- Codeforces Round #643 (Div. 2)——B. Young Explorers
- 系统测试的类型有哪些,我给你介绍
- Redux使用
猜你喜欢
A comprehensive and detailed explanation of static routing configuration, a quick start guide to static routing
【SolidWorks】修改工程图格式
ANSI / nema- mw- 1000-2020 magnetic iron wire standard Latest original
What are the types of system tests? Let me introduce them to you
nacos-微服务网关Gateway组件 +Swagger2接口生成
日志特征选择汇总(基于天池比赛)
如何制作企业招聘二维码?
Get familiar with XML parsing quickly
Sword finger offer II 041 Average value of sliding window
Usage of hydraulic rotary joint
随机推荐
The function of carbon brush slip ring in generator
Exit of processes and threads
[target tracking] |atom
nmap工具介绍及常用命令
滑环在直驱电机转子的应用领域
用户之声 | 对于GBase 8a数据库学习的感悟
Version 2.0 of tapdata, the open source live data platform, has been released
图解网络:揭开TCP四次挥手背后的原理,结合男女朋友分手的例子,通俗易懂
Application of slip ring in direct drive motor rotor
ArrayList源码深度剖析,从最基本的扩容原理,到魔幻的迭代器和fast-fail机制,你想要的这都有!!!
Capability contribution three solutions of gbase were selected into the "financial information innovation ecological laboratory - financial information innovation solutions (the first batch)"
ROS problems (topic types do not match, topic datatype/md5sum not match, MSG XXX have changed. rerun cmake)
跨模态语义关联对齐检索-图像文本匹配(Image-Text Matching)
Redux usage
cv2-drawline
Sword finger offer II 041 Average value of sliding window
Redismission source code analysis
From starfish OS' continued deflationary consumption of SFO, the value of SFO in the long run
第七章 行为级建模
Js中forEach map无法跳出循环问题以及forEach会不会修改原数组