my

阅读 / 问答 / 标签

my dear 什么意思

亲爱的

全结肠型,(mayO)中的myO2分是什么意思?

松哈尔滨医科大学第一临床医学院普外一科  (黑龙江   哈尔滨   150001)【关键词】移行性综合肌电 ;Roux2en2 Y综合征【中图分类号】R6561 6 ;R333【文献标识码】A   在临床实践中 ,一些胃大部分切除术后发生碱性反流性胃炎、倾倒综合征的患者 ,往往需要第 2 次手术行胃 空肠Roux2en2 Y吻合1。 然而 30 %~50 %胃空肠 Roux2en2 Y吻合术后的患者 ,出现了 恶心、呕吐、腹胀以及上腹痛等症状 ,尤其在进餐后加重 ,甚至发生营养不良 、胃粪石形成等 ,这组症状被 称 为 Roux2en2 Y 滞 留 综 合 征 ( Roux2en2 Y stasis syn2drome) 。 本文从电生理的角度对其发生和防治进行总结。1   移行性综合肌电 (migrating myoelectric complex ,MMC) 及其调控机制1. 1  MMC 简介  MMC 是空腹状态下 ,胃肠反复发生并能向消化道下段(尾端) 移行或扩布的周期性综合电变化。 首先由美国 Szurszewski J H于 1969 年在狗小肠实验中发现 ,其后 Code CF 于 1972 年提出完整概念 ,将 MMC 周期划分为 4个时相 :在空腹时 ,平滑肌规律地产生慢波 ,但负载其上的峰电位则有周期性的变化 , Ⅰ相表现为只有慢波而缺少峰电位 ,这一时相没有平滑肌蠕动和分节运动发生 ,称为静止期 ;Ⅱ相为在部分慢波上负载有峰电位 ,平滑肌在这一时期可发生蠕动和不规律的分节运动 ,称为不规律峰电活动期 ; Ⅲ相为所有慢波上几乎都负载有大振幅、成簇的峰电位 ,这时伴发规律的分节运动 ,称为规律峰电活动期 ,与其相对应的是一系列扩布性的收缩 ,对小肠内容物产生强烈的推进作用 ,它于每次进食之间 ,周期性的清扫胃肠内容物 ; Ⅳ相为从 Ⅲ相过渡到 Ⅰ相出现的短暂峰电活动期。MMC 控制消化间期移行性复合运动时相的收缩时间和扩布方向 。 只有在 MMC 周期中爆发密集峰电位才能引发移行性复合运动 Ⅲ 相的剧烈收缩运动 。 MMC Ⅲ 相总是在移行性复合运动 Ⅲ相之前发生 ,并与移行性复合运动时程吻合。 MMC 规律地从胃十二指肠和空肠上段开始 ,缓慢地向小肠下段扩布 ,并在它的 Ⅲ 相中伴发规律的分节运动 。1. 2  神经对移行性综合

ikon my type有谁翻唱这首歌中文版吗,求歌词中文

这首歌没有中文版的,只是他们为了上湖南跨年专门写的而已!

My english teacher is a p______ man.

patient有耐心的

My wish (我的愿望)60个单词左右 一篇英语作文 小学五年级水平 急啊 最好加翻译啊

没有就是没有

我的愿望优秀英语作文(My wish)

  I have a lot of wishes, get 500W lottery is my daydream. everyday I miss it. my school is very beautiful in summer.   there are so many flowers and trees. there are five studying building for we learning.

my good friend 英语作文加翻译

My Good Friend My good friend is Mei. She"s a girl. She is my classmate. Mei is tall and thin. She has two big eyes and long hair. She likes listening to music and reading books. Sometimes we listen to music together. She likes summer. Because she can swim in the summer holiday. She likes pink and white. She is in Class Four, Grade Six with me. She usually goes to school by motor cycle. Sometimes she goes to school on foot. We often go shopping together on the weekend. We will be good friends forever. My Good Friend I have a good friend.She is my classmate,her name is Tracy.She is a pretty girl. She studies in Tiandong No.2 Middle school,she is in Class 1,Grade 1.She studies hard all day.And she can speaks Japanese English and Chinese very well.So she often help my English and Japanese.I thank you for her help. And I help her math, too.Because my math is very good. We learn from each other and help each other. Tracy often in a white T-shirt and a black skirt.We are all think shi is a lovely girl.And Tracy likes sports very much. She likes playing basketball,bassball,ping-pongball and badminton very much. So we are often play them. Tracy has a big famili,there are nine people in her family.They are her mother,her father,her brother sister,her uncle,her aunt,her grandparents ang her.She loves her family very much. My good friend My name is Michelle. In my class, there is a girl. She has a round face, a small nose, two big eyes, a small mouth and two big ears. Her eyes look like grapes. Her hair is short and black. She is tall and beautiful. She looks like a middle school student. Do you know who is she? Yes, she is Fanny, one of my good friends. Fanny is a good girl at school. In class, she listens to her teachers carefully. She studies English very well. She often helps us to solve problems. She is very quiet, sometimes she is very active. When class is over, she goes out of the classroom to play games with her classmates. She is very friendly to them. She is a good girl at home, too. After supper, she always helps her mother clean the room. Then she watches TV for a short time if mother permits. She seems to have a special interest in music. Any time she hears the music, she will dance. Though she dances badly, she still loses herself in the music. I think she will be a dancer in the future. But she wants to be a writer. This is my good friend. We feel happy when we are together. What about your good friend? Can you tell me something about your good friend? 我的好朋友 我的好朋友叫may。她是个女孩。她是我的同学。 may又高又瘦。她有一双大眼睛,长头发。她喜欢听音乐,看书。有时我们听音乐结合在一起。她喜欢夏天。因为她能游在暑假的时候。她喜欢粉红色和白色的。她是六年级四班与我同在。她经常骑自行车上学摩托车。有时她走路去上学。我们经常在周末一起去购物。 我们将会永远都是好朋友。 我有一个好朋友她是我的同学,她的名字是麦迪. 她是一个可爱的女孩。 她在第二中学浙,她是一年级(1)班的. 她努力学习所有的日子. 她会说日语和汉语和英语很好所以她经常帮助我的英语和日语我感谢她的帮助。我帮她数学因为我的数学很好。我们互相学习,互相帮助。 麦迪经常穿着白色t恤和黑色的裙子我们都认为是一个可爱的女孩和特雷西还非常喜欢运动。她喜欢打篮球,bassball,ping-pongball和羽毛球。非常谢谢你。所以我们经常打他们。 特蕾西大famili,有9人在她的家庭他们是她的母亲,她的父亲,她的哥哥姐姐,她的叔叔阿姨,她的爷爷奶奶,她和她的她爱她的家人。我的名字是Michelle。在我的课上,有一个女孩。她有一张圆圆的脸,两只大眼睛,小鼻子,嘴巴和两只大耳朵。她的眼睛看起来像葡萄。她的头发短,黑色的。她又高又美丽。她看起来像一所中学的学生。你知道她是谁吗?是的,她是范妮,我最好的朋友之一了。 范妮是个好女孩上学了。在课堂上,她仔细听老师的。她英语学得很好。她经常帮助我们解决问题。她非常安静,有时她很活跃。当下课了,她走出教室去玩游戏,她的同班同学。她非常友善。她是一个好女孩的家里。晚饭后,她总是帮她妈妈打扫房间。然后她看电视很短的一段时间如果母亲的许可证。 她似乎有一种特别的音乐的兴趣。任何时间,她听到了音乐,她会跳舞。尽管她跳舞时,她还失去了自己的严重的音乐。我想她会成为一名舞蹈演员。但她想当个作家。 这是我的好朋友。我们感到快乐时,我们在一起。谈谈你的好朋友吗?你能告诉我一些关于你的好朋友吗?

love me,love my dog是什么意思

u261e爱屋及乌u261cU0001f1e8U0001f1f3U0001f1e8U0001f1f3U0001f1e8U0001f1f3

“love me love my dog”这个谚语是什么意思?

“love me love my dog”这个谚语的意思是:爱屋及乌出处:这则谚语最初出现在12世纪圣伯纳德(St. Bernard)所著的书中。原文是拉丁语:Quit me amat, amat et canem meam. 译成英语就是"Love me, love my dog." 16世纪中叶,英语作家海伍德将这一条谚语收进他的《谚语集》中,意思就是,你要爱“我”就得接受“我”的一切。对西方人来说,狗是最忠诚的伴侣,最可靠的朋友。当你有机会到西方人家里余额,千万要记住,一定要对主人家的狗始终保持十二分的热情,而且越过越好,哪怕它对你咆哮,甚至还用狗眼恶狠狠地看你,你都要好好待它。那样的话,你将会收获到一桌丰盛的饭菜和最甜美的笑脸。eg.1. There is an old proverb, “Love me, love my dog.” But there is more wisdom in this: “Love me, love my book.古谚说:“爱屋及乌”.但是,“爱吾及书”这句知却有更深的哲理.2. Mary never accepted an invitation unless Anne was included in it. It was a case of love me, love my dog.如果有人邀请玛丽而不请安妮,玛丽就不会去。这真是要求人家爱屋及乌了。3. Love me, love my dog…for there are certain decencies of respect due to the servant for the master"s sake.打狗看主人面……看在主人面上,对于仆人总是要有某种照顾。

爱屋及乌翻译为“love me,love my dog"在汉英语言中的差异

爱屋及乌的意思是:因为爱一个人而连带爱他屋上的乌鸦。比喻爱一个人而连带地关心到与他有关的人或物。而在外国人眼里面,狗是家庭成员之一,所以在英文里面就翻译成“如果爱我,就连我的狗一起爱吧”。

lovemelovemydog是什么意思

爱屋及乌.-----------------------------------如有疑问欢迎追问!满意请点击右上方【选为满意回答】按钮

第七季amy想像sheldon的台词

That"s "cause you always fill up on chips.这位是来自斯德哥尔摩的冈德森博士And this is Dr. Gunderson from Stockholm.瑞典呀Ah, Sweden.是我最喜欢的木偶Yeah, home of my favorite Muppet和第二喜欢的肉丸[宜家肉丸]的家乡and, uh, second favorite meatball.好吧 果然北欧人没有幽默感的名声是真的Okay, the Nordic reputation for lack of humor is well-founded.天啊 他是叫冈德森还是干得瘆呀Boy, is his name Gunderson or No-Funderson?你到底想要说什么 库珀博士Where are we going with this, Dr. Cooper?拜托 我是你的男朋友Oh, please, I"m your boyfriend.你应该叫我谢尔顿You call me Sheldon.没错 我跟这位穿着毛衣的小可爱That"s right, I am in a boy-girl relationship是男女朋友关系with this cute little lump of wool.谢尔顿Sheldon...而且还有身体接触哦It"s a physical relationship, too.比如说 拉手 拥抱 即使在大热天也是Hand-holding, hugging... even on hot days.好吧 又多了一种Okay, here"s a new one.显然现在我们在桌子下Apparently now we kick each other互踢彼此的小腿in the shin under the table.换我踢你了 你觉得如何How do you like it when I do it to you?不是很爽 对吧

《生活大爆炸》里Sheldon对Amy说“你总令我分心”的全文

You distract me. I"ve been distracted since the moment I met you. Because all I can think about is how much I want to kiss you.你害我分心。从遇见你的那一刻起,你就让我分心。因为我的脑海里满满都是想吻你的冲动。

westlife现场版my love 中中间的那个黄头发的成员是谁啊

美人nicky

请问westlife的nothing gonna change my love for you里哪段歌词是Nicky唱的?哪段歌词是Kian唱的?

nicky:if i had to live my life without you near methe days would all be emptythe nights would seem so longwith you i see forever oh so clearlyi might have been in love beforebut it never felt this strong第一段开头是nico的kian:if the road ahead is not so easyour love will lead a way for uslike a guiding starkian:you don"t have change a thingi love you just the way you are第二段开头是ki的,中间插了一点集体的《Nothong is gonna change my love for you》是2006年的,因为这首歌是翻唱的,所以没有MV,或者在演唱会上唱过

生活大爆炸Amy收到sheldon公主头环是第几季第几集

第五季第十二集。Amy告诉sheldon一个好消息,但sheldon不以为意。惹怒了Amy,Amy不理sheldon了,结果sheldon求助penny,然后他们去逛首饰店。sheldon买了个公主皇冠给Amy.结果Amy喜出望外一把抱住sheldon,penny在一旁笑而不语。

Sting flow my tears歌词 最好有翻译

Flow, my tears, fall from your springs!Exiled for ever, let me mourn;Where night"s black bird her sad infamy sings,There let me live forlorn.Down vain lights, shine you no more!No nights are dark enough for thoseThat in despair their lost fortunes deplore.Light doth but shame disclose.Never may my woes be relieved,Since pity is fled;And tears and sighs and groans my weary daysOf all joys have deprived.From the highest spire of contentmentMy fortune is thrown;And fear and grief and pain for my desertsAre my hopes, since hope is gone.Hark! you shadows that in darkness dwell,Learn to condemn lightHappy, happy they that in hellFeel not the world"s despite.流吧,我的眼泪,从你的泉水坠落! 流亡到永远,让我悲哀; 夜里黑色鸟唱她伤心耻辱, 还有让我孤独的生活。 徒劳的灯光,照耀你了! 没有足够的夜晚是黑暗的 在绝望中,他们的损失钱财痛惜。 光披露恰好是耻辱。 我从来没有可能得到缓解困境, 可惜的是由于逃离; 和眼泪,叹息和呻吟自己疲惫的日子 在所有的欢乐都被剥夺。 从满足最高尖顶 我的财富抛出; 和恐惧,悲伤和痛苦我的沙漠 是我的希望,因为希望破灭。 听!你住在黑暗的阴影, 学会谴责光 快乐,幸福的他们,在地狱 感觉不是世界的,尽管。

有谁知道sting shape of my heart的歌词啊?

He deals the cards as a meditation 他出牌前沉思冥想And those he plays never suspect 对出的每一张牌都很有把握He doesn"t play for the money he wins 他不是为了赢钱而玩牌He don"t play for respect 也不是为了获得尊重He deals the cards to find the answer 他出牌是为了找寻答案The sacred geometry of chance 找寻幸运的神圣机率The hidden law of a probable outcome 在胜利后面隐藏着一种规则The numbers lead a dance 那些数字在领舞I know that the spades are the swords of a soldier 我知道黑桃是士兵的宝剑I know that the clubs are weapons of war 我知道草花是战争的武器I know that diamonds mean money for this art 我知道在这种游戏里方块就是钱But that"s not the shape of my heart 但那不是我心的形状He may play the jack of diamonds 他可以出方块JHe may lay the queen of spades 他可以出黑桃QHe may conceal a king in his hand 他可以使小花招藏起KWhile the memory of it fades 接着真的忘了自己有KI know that the spades are the swords of a soldier 我知道黑桃是士兵的宝剑I know that the clubs are weapons of war 我知道草花是战争的武器I know that diamonds mean money for this art 我知道在这种游戏里方块就是钱But that"s not the shape of my heart 但那不是我心的形状And if I told you that I loved you 如果我告诉你我爱你You"d maybe think there"s something wrong 你可能会觉得不妥I"m not a man of too many faces 我不是多面派The mask I wear is one 我只有一张面具Well, those who speak know nothin"好吧,那些发言的人其实什么也不知道And find out to their cost 他们最终会付出代价Like those who curse their luck in too many places 就像有些人到处说自己不幸And those who fear are lost还有那些退缩的人,他们都已迷失I know that the spades are the swords of a soldier 我知道黑桃是士兵的宝剑I know that the clubs are weapons of war 我知道草花是战争的武器I know that diamonds mean money for this art 我知道在这种游戏里方块就是钱But that"s not the shape of my heart 但那不是我心的形状That"s not the shape, the shape of my heart 那不是我心的形状。。心的形状That"s not the shape, the shape of my heart 那不是我心的形状。。心的形状

叩请音乐达人诗情画意翻译一下Sting的《If I Ever Lose My Faith In You》,拜谢了!

如果我失去了我对你的信心[00:00.50] [00:08.50][00:19.50]你可以说我失去了我的信仰,科学与进步[00:29.50]你可以说我失去了我的神圣的信仰教堂[00:39.50]你可以说我失去了我的感觉的方向[00:49.50]你可以说这更糟糕的,但[00:53.50]如果我失去我的信仰[01:03.50] [01 :13.50]有人会说我是一个失败的男人在失落的世界[01:23.50]你可以说我失去了我的信仰,在电视上的人[01:33.50]你可以说我失去了我的信念,我们的政治家[01: 43.50]他们似乎都喜欢的游戏节目主持人给我,如果我失去了我对你的信心[01:47.50] [01:57.50] [02:20.50]我可以迷失在自己的谎言无踪[02:30.50]每次我闭上我的眼睛,我看到你的脸,我从来没有看到奇迹的科学[02:39.50] [02:49.50] [02:58.50]我从来没有看到军事手段解决[03:09.50] [03:13.50]让我说这首[03:18.50]如果我失去我的信仰[03:23.50]如果我失去我的信仰[03:27.50] [03:37.50]如果我永远失去了我的信仰[03:42.50]如果我失去了我的信仰[03:47.50]如果我失去了我的信仰[03:52.50]如果我失去我的信仰[03:58.50]应该是这样的。望采纳,谢谢!

Sting《shape of my heat》的歌词

《shape of my heat》不是后街的歌吗

my favorite event英语作文50词

Write a diary, in the beginning, I don"t write too much, think photo boring every day, every time the mother call I write before I go to write.Gradually, I feel that the content of the diary book is great, I like to read, read it and then I"ll write an article on the back of the article.While, most wrote this diary, I think writing diary is a kind of enjoyment, is a kind of fun, because it can record my suantiankula.Keeping a diary bring me endless fun, also can improve the level of my writing and language skills.Dear students, you have to give it a try.I love to write diary, I hope to finish writing the diary book four full, can create his book when he grows up.

”to be the best VS to be myself"关于英文的翻译!!!

在当今社会现实生中,有些人想要成为一个毫无瑕疵的人,因此在别人看来是很好的,但有些人则有着知足常乐的性格,从来不在乎别人的目光。 In today"s society had in reality, some people want to be a flawless, therefore, seems to be very good at others, but others have the character of abundance, never don"t care the eyes of others. 这在我看来是有欠缺的,首先在现实生活中你要做最好的目标的确很远大但却很难实现,因为人外有人天外有天,即使在邻里之间学校之间你是最好的,男当你走出学校时进入社会时,外面的世界则会让你大吃一惊,其中有一些你根本料想不到的东西。 This, in my opinion, is a lack of, first in real life you want to be the best goal is great but it is difficult to achieve, because some people outside there is day, even in the neighbourhood between school you are the best, male when you walk out of school into society, the outside world will give you a surprise, some of which you never unexpected things. 其次大家所看到的最好的一面又是经历多少汗水与艰辛所换来的,但这一点又时常常被世人所遗忘的。 Secondly you can see the best side is how much experience with hard sweat for, but it often is recognized and forgotten. 所以我认为还是做我自己。 So I think or do myself. 每个人的能力和治理各有不同,所以自己应对自己做一个准确地定位,绝对要杜绝盲目从众的心理,第二就是不要超越个人所能承受的限度,这样反而事半功倍。 Each person"s ability and governance different, so you cope yourself to do a accurate positioning, absolutely to eliminate blind conformity of mental state, the second is not beyond the limits of the person can inherit and it easier. 最会我想说的就是我们每个人都要知足常乐,只有知足者常乐才能看清自己我的“标准线”没有必要强求一些不属于自己的东西。 Most will I want to say is we all want contented mind is perpetual feast, only he who is content is always happy to see what my "BiaoZhunXian" there is no need to try some do not belong to your things. 做自己吧,欣赏一个真正的自我,那么才会有更多人欣赏你。 Do yourself, enjoy a true self, then just can have more DuoRen appreciate you. 采纳吧

MySchedule怎么写啊?五年级英语第二单元

My Schedule: 我的日程安排,写你计划什么时间做什么事情就好了。例如:7:00-7:30 Have breakfast7:30-9:00 read books等等。

褐色的CMYK数值是多少?

褐色的CMYK数值是:C10,M3,Y70 ,K80。一、什么是CMKY?印刷四色模式是彩色印刷时采用的一种套色模式,利用色料的三原色混色原理,加上黑色油墨,共计四种颜色混合叠加,形成所谓"全彩印刷"。四种标准颜色是:C:Cyan = 青色,又称为“天蓝色“或是“湛蓝”。M:Magenta = 品红色,又称为“洋红色“。Y:Yellow = 黄色K:Key Plate(blacK) = 定位套版色(黑色)二、CMKY与RBG的区别CMYK也称作印刷色彩模式,顾名思义就是用来印刷的。它与RGB的区别:RGB模式是一种发光的色彩模式,你在一间黑暗的房间内仍然可以看见屏幕上的内容;CMYK是一种依靠反光的色彩模式,它需要有外界光源,在黑暗环境中无法看到。三、CMYK和专色的区别1、CMYK--即青、洋红(品红)、黄、黑四种色彩,在印刷中通常可由这四种色彩再现其它成千上万种色彩。2、专色--是指在印刷时,不通过印刷CMYK四色合成这种颜色,而是专门用一种特定的油墨来印刷该颜色。3、专色--专色油墨是指一种预先混合好的特定彩色油墨(或者叫特殊的预混油墨),用来替代或补充印刷色(CMYK)油墨,如明亮的橙色、绿色、荧光色、金属金银色油墨等,或者可以是烫金版、凹凸版等,还可以作为局部光油版等等,它不是靠CMYK四色混合出来的,每种专色在付印时要求专用的印版(可以简单理解为一付专色胶片、印刷时为专色单独晒版),专色意味着准确的颜色。

CMYK/8* 是什么意思?

8*8*8*8 8位,一般用于浏览,编辑,印刷足够16*16*16*16 16位,多用于相机,为了能保留更多的自然色 常用颜色RBG和CMYK,看到的可能有带RBG的有RBG/8* RBG/8# RBG/8,还有16位的CNYK的有CMYK/8* CMYK/8# CMYK/8也有16位的带*的表示有应用颜色配置,带#的有带预览,没带的就是常规编辑打个比方,你把CMYK/8*转 CMYK/8后,就是去掉了颜色配置方案,可能会出现一点点的色差,视觉上面能看出来,这个貌似注意的人不多哦,呵呵

我用ACDSEE将TIF(CMYK模式)图片另存为JPG时,为什么会成了(RBG模式)?

不用管它

cdr里怎么把rgb模式改成cmyk

工具--》选项--》文档--》常规--》颜色--》默认颜色模式:选择CMYK--》确定。这样就可以把整个文档从RGB转为CMYK了。注:(快捷键:Ctrl+J也可以调出选项)

在PS软件中输入字,RBG能正常调出深兰色,而CMYK调不出,只有其它浅兰色,是什么问题?

基本上可以说这两种色彩模式服务目的不同RGB 用于各类显示器,也可说是虚拟的CMYK用于印刷出版物,属于四色印刷,好比我们把虚拟的东西拉到现实生活中都会存在差异,网络美女不见的真人也那么好看一个道理现实生活中的油墨无法还原电脑屏幕的显示色才,缺少细节,两个色彩模式色显不大可能完全相同,但可以跳出相似的主要看自己作品的用途,要印刷还是在CMYK模式下尽量调出合适的颜色,避免溢出。

求:在PS或CorelDRAW里 香槟色 的色值是多少?CMYK和RBG值是多少?谢大侠了

RGB: 239 226 182 CMYK: 7 11 33 0

请教,ps中rbg还有cmyk 的详细解释还有8位16位的解释

RGB指的是光源色,是显示器显示的颜色,说白一点,就是在电脑显示器显示的颜色模式。R指的是红色,G是绿色,B是蓝色。CMYK,是指印刷色,在PS中选择CMYK颜色模式,主要是为了制作用于印刷的图片。C是青色Cyan、M是品红色Magenta、Y是黄色Yellow,K指的是黑色。综上所述,RGB是在电脑上显示的真实色彩,CMYK是用于印刷品的真实色彩。一个是在电脑上表现的,一个是在纸上表现的。所谓8位 24位,指的是颜色的数量,8位是2的八次方,也就是256色。24位是8的24次方,也就是1677万色。24位为最高,被称作真彩色,位数越高,图片的颜色越丰富,表现力越强。

在ps里将rbg转成cmyk后颜色变化很大,偏绿色,打印出来后和rbg的颜色是一样的吗

不一样的,打印都是四色。所以打印前你要调整

CMYK和RBG的区别

RGB模式是绘图软件最常用的一种颜色模式,在这种模式下,处理图像比较方便,而且,RGB存储的图像要比CMYK图像要小,可以节省内存和空间。 CMYK模式是一种颜料模式,所以它属于印刷模式,但本质上与RGB模式没有区别,只是产生颜色的方式不同。RGB为相加混色模式,CMYK为相减混色模式。

PS打印图像时,输出文件色彩模式为RBG或CMYK,对还是错

原来是打印选择CMYK模式,可是现在打印技术越来越发达,没有这么多的限制了。关键你要问打印图像那边是什么打印机,支不支持RBG格式的文件。我前段时间才做的海报,80cm*180cm的,用的72分辨率,RBG格式文件,像素3000*6000左右吧,基本没有什么问题。如果是做题的话,就选CMYK吧,绝对不会错。

CMYK和RBG的区别

RGB模式是绘图软件最常用的一种颜色模式,在这种模式下,处理图像比较方便,而且,RGB存储的图像要比CMYK图像要小,可以节省内存和空间。 CMYK模式是一种颜料模式,所以它属于印刷模式,但本质上与RGB模式没有区别,只是产生颜色的方式不同。RGB为相加混色模式,CMYK为相减混色模式。

mysql怎么修改密码

mysql 如何修改密码 ?环境1:windows ? 1、配置好环境变量,将mysqlin加入到path中。 2、接着在DOS中直接输入下面命令进行修改(假设原来密码为空) mysqladmin _uroot ?password root ? ? refurl: http://blog.sina.com.cn/s/blog_53f716d40100kmr8.htmlmysql 如何修改密码?环境1:windows?1、配置好环境变量,将mysqlin加入到path中。2、接着在DOS中直接输入下面命令进行修改(假设原来密码为空)mysqladmin _uroot ?password root??refurl:http://blog.sina.com.cn/s/blog_53f716d40100kmr8.html?http://www.2cto.com/database/201209/154363.html??http://zhidao.baidu.com/link?url=VR7e3Pj5Pfrpvr-ac3Xsl-JhYX7h6p8wFD0CLrxjpXXfIRGRJC4hZfebf11r2NLfwu709SPDsS8ZO8grZlqj5q???ps:1、密码为空的登录方法:命令中输入命令进行登录mysql,这里假设原密码是空mysql -uroot -p,然后回车,遇到输入密码界面,直接按回车即可进入系统。?2、密码不为空的登录方法(假设密码是root):命令中输入:mysql -uroot -proot回车即可登录系统,不能在最后加冒号,否则不能登录系统,因为它认为密码是root;了。???---------------------------------------------------------------------------------------------------------环境2:linux(redflag6)+phpmyadmin连接上phpmyadmin后,点击localhost->SQL,然后输入以下代码,点执行即可:update mysql.user set password=PASSWORD("新密码") where User="root";flush privileges;?refurl:http://hi.baidu.com/qidusky/item/505655de427847f793a974b7?http://www.linuxidc.com/Linux/2008-02/11137.htm??

用MY CITY安阳写一段英语作文

Anyang is a small city in Henan province, The northernmost city in Henan, Anyang borders Puyang to the east,Hebi and Xinxiang to the south, and the provinces of Shanxi and Hebei to its west and north respectively.Anyang has beautiful natural scenery—the Taihang Linlu Hill Scenic Area on the 400-kilometer Taihang Mountains and the grand 1,500-kilometer Red Flag Canal. So when you come to Anyang, you will see museums here and there. It is the hometown of Yue Fei,Yue Fei temple is located in the tangyin county ,which is a county in anyang ‘s south, Located about 2 km northwest of this city are the ruins of the Shang Dynasty capital known as Yin, In it built a museum, and includes the famous Tomb of Fu Hao. The site is inscribed on the UNESCO list of World Heritage Sites. China"s earliest Chinese prison Youli Castle and the origin of zhouyi also lacated in the south of anyang . Within the city,there china"s first words museum and so on. this is a city full of cultural atmosphere and i am sure you will like it.

Mysql开发中的外键与参照完整性

参照完整性(Referential integrity)是数据库设计中一个重要的概念。在系统不同的列表中,当数据库所有参照合法或非合法关联时都会涉及到参照完整性。当参照完整性存在时,任何与不存在记录的关联将变得无效化,由此可防止用户出现各种错误,从而提供更为准确和实用的数据库。参照完整性通常通过外键(foreign key)的使用而被广泛应用。长久以来,流行工具开源RDBMS MySQL并没有支持外键,原因是这种支持将会降低RDBMS的速度和性能。然而,由于很多用户对参照完整性的优点倍感兴趣,最近MySQL的不同版本都通过新InnoDB列表引擎支持外键。由此,在数据库组成的列表中保持参照完整性将变得非常简单。为了建立两个MySQL表之间的一个外键关系,必须满足以下三种情况:两个表必须是InnoDB表类型。使用在外键关系的域必须为索引型(Index)。使用在外键关系的域必须与数据类型相似。例子是理解以上要点的最好方法。如表A所示,建立两个表,其中一个列出动物种类及相应的代码(表名为:species),另一表列出动物园中的动物(表名为:zoo)。现在,我们想通过species关联这两个表,所以我们只需要接受和保存zoo表中包含species表中的合法动物的入口到数据库中。表Amysql CREATE TABLE species (id TINYINT NOT NULL AUTO_INCREMENT, name VARCHAR(50) NOT NULL, PRIMARY KEY(id)) ENGINE=INNODB;Query OK, 0 rows affected (0.11 sec)mysql INSERT INTO species VALUES (1, "orangutan"), (2, "elephant"), (3, "hippopotamus"), (4, "yak");Query OK, 4 rows affected (0.06 sec)Records: 4 Duplicates: 0 Warnings: 0mysql CREATE TABLE zoo (id INT(4) NOT NULL, name VARCHAR(50) NOT NULL, FK_species TINYINT(4) NOT NULL, INDEX (FK_species), FOREIGN KEY (FK_species) REFERENCES species (id), PRIMARY KEY(id)) ENGINE=INNODB;注意:对于非InnoDB表, FOREIGN KEY 语句将被忽略。现在,fieldszoo.species与species.id 之间存在一个外键关系。只有相应的zoo.specie与species.idfield的一个值相匹配,动物表中的入口才可被访问。以下的输出即演示了当你想输入一个Harry Hippopotamus记录,而使用到不合法的species代码:mysql INSERT INTO zoo VALUES (1, "Harry", 5);ERROR 1216 (23000): Cannot add or update a child row: a foreign key constraint fails这里,MySQL核查species表以查看species代码是否存在,如果发现不存在,就拒绝该记录。当你输入正确代码的,可以与以上做比较。mysql INSERT INTO zoo VALUES (1, "Harry", 3);Query OK, 1 row affected (0.06 sec)这里,MySQL核查species表以查看species代码是否存在,当发现存在,允许记录保存在zoo表中。为了删除一个外键关系,首先使用SHOW CREATE TABLE找出InnoDB的内部标签,如表B所示:表 B+-------+---------------------------------------------------+| Table | Create Table |+-------+---------------------------------------------------+| zoo | CREATE TABLE `zoo` (`id` int(4) NOT NULL default "0",`name` varchar(50) NOT NULL default "",`FK_species` tinyint(4) NOT NULL default "0",KEY `FK_species` (`FK_species`),CONSTRAINT `zoo_ibfk_1` FOREIGN KEY (`FK_species`)REFERENCES `species` (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1 |+-------+----------------------------------------------------+然后使用带有DROP FOREIGN KEY 语句的ALTER TABLE命令,如以下:mysql ALTER TABLE zoo DROP FOREIGN KEY zoo_ibfk_1;Query OK, 1 row affected (0.11 sec)Records: 1 Duplicates: 0 Warnings: 0为了将一个外键添加到一个现成的表中,使用ADD FOREIGN KEY的 ALTER TABLE语句指定合适的域作为一个外键:mysql ALTER TABLE zoo ADD FOREIGN KEY (FK_species) REFERENCES species (id);Query OK, 1 rows affected (0.11 sec)Records: 1 Duplicates: 0 Warnings: 0如以上例子解释的,外键在捉摸数据入口错误上起着重要的作用,由此可建立更为强健更加集成的数据库。另一方面值得提到的是,执行外键核实是内部资料处理的过程,且不同表之间指定复杂的内部关系可以导致数据库的性能下降。所以,在参照完整性与性能考虑之间找到平衡点相当重要,而使用外键就是能够确保性能与稳健之间的最优结合。我期望本期的有关外键的介绍对你有所好处,你将会在下回的MySQL数据库设计中感受到外键的好处。编程快乐!

jpa使用lob注解表示String字段应用于mysql数据库储存数据是会发生数据丢失以及不可插入的问题

mysql数据库中longtext,改成longblob

在ps中 怎么把CMY的值去掉 只留K 黑色?

直接弄成黑白图片不久OK了啊

The enemy who stands in my way to take English ex

The enemy who stands in my way to take English exam No.1 is so foolish that should stay in home.

为什么施主的英译是my son?

这里son的意思并不是字面上的儿子,而是指教众,或者子民在英文中,可以把比自己年轻,关系较好,你比较关心,你会去教导的人叫做son人们去教堂的时候会称呼神父father,神父可以称呼信徒son把施主翻译成my son应该是翻译的时候做了本土化处理,方便说英文的观众理解

symxmyz,xyjxjbz 这是一句话,求翻译!!!

山悦木兮木有枝,心悦君兮君不知

mybatis-plus默认值问题

mybatis-plus中设置了默认值(如statu默认值为0),但我在save时对象的statu属性有值为1,它的值是1还是0呢?(目前测了一次是0)想知道默认值设置的原理解析,请大神指教

有一首英文歌,有一句歌词是“i wonder you know baby in my heart" "i wonder you "之类的,是个女歌手唱

why would i ever . .我原来最爱听这个了

开头i need you 高潮也是i need you ...in my love..的英文歌曲男歌手 求歌曲名字

i need you

一首英文歌曲 女生唱的,里面高潮有句是oh,my baby baby for什么什么的,这首歌叫什

这首歌是《漂亮男孩》,演唱者是艾薇儿。扩展资料歌词:I lie awake at night 晚上我躺在床上没有一点睡意 See things in black and white 世界对我来说只有黑与白 I"ve only got you inside my mind 你的形象无时无刻不在我脑中闪动 You know you have made me blind 我的眼里只有你 I lie awake and pray 我清醒地躺在床上祈祷 that you will look my way 祈祷你会看见我 I have all this longing in my heart 我的心中充满渴望 I knew it right from the start 一开始我就知道 Oh my pretty pretty boy I love you 我的漂亮男孩 我爱你 Like I never ever loved no one before you 在你之前我从未这样爱过一个人 Pretty pretty boy of mine 我的漂亮男孩 Just tell me you love me too 告诉我你也爱我 Oh my pretty pretty boy I need you 我的漂亮男孩我需要你 Oh my pretty pretty boy I do 我的漂亮男孩,是真的 Let me inside make me stay right beside you 让我进来让我留在你身旁 I used to write your name 我曾写下你的名字 And put it in a frame 并把它框起来 And sometimes I think I hear you call 有时我以为我听见的呼唤 Right from my bedroom wall 有时我觉得我在我房间里听到了你的呼唤 You stay a little while 你待了一会儿 And touch me with your smile 用你的微笑打动我的心 And what can I say to make your mine 我该说什么才能赢得你的心 To reach out for you in time 才能及时掳获你 Oh my pretty pretty boy I love you 我的漂亮男孩 我爱你 Like I never ever loved no one before you 在你之前我从未这样爱过一个人 Pretty pretty boy of mine 我的漂亮男孩 Just tell me you love me too 告诉我你也爱我 Oh my pretty pretty boy I need you 我的漂亮男孩 我需要你 Oh my pretty pretty boy I do 我的漂亮男孩 是真的 Let me inside 让我进来 make me stay right beside you 让我留在你身旁 Oh pretty pretty boy 我的漂亮男孩 say you love me too 说你也爱我 Oh my pretty pretty boy I love you 我的漂亮男孩 我爱你 Like I never ever loved no one before you 在你之前我从未这样爱过一个人 Pretty pretty boy of mine 我的漂亮男孩 Just tell me you love me too 告诉我你也爱我 Oh my pretty pretty boy I need you 我的漂亮男孩 我需要你 Oh my pretty pretty boy I do 我的漂亮男孩 是真的 Let me inside 让我进来 make me stay right beside you 让我留在你身边

mybatis工作原理及为什么要用

需要,,ibatis只是写sql语句的。一般传值接收值,还是用类控制的。

java 版quartz 可以和mybatis一起用吗

1、用script标签包围,然后像xml语法一样书写@Select({"<script>", "SELECT * FROM tbl_order", "WHERE 1=1", "<when test="title!=null">", "AND mydate = #{mydate}", "</when>", "</script>"})2、用Provider去实现SQL拼接,例如:public class OrderProvider { private final String TBL_ORDER = "tbl_order"; public String queryOrderByParam(OrderPara param) { SQL sql = new SQL().SELECT("*").FROM(TBL_ORDER); String room = param.getRoom(); if (StringUtils.hasText(room)) { sql.WHERE("room LIKE #{room}"); } Date myDate = param.getMyDate(); if (myDate != null) { sql.WHERE("mydate LIKE #{mydate}"); } return sql.toString(); }}public interface OrderDAO { @SelectProvider(type = OrderProvider.class, method = "queryOrderByParam") List<Order> queryOrderByParam(OrderParam param);}注意:方式1有个隐患就是当传入参数为空的时候,可能会造成全表查询。复杂SQL用方式2会比较灵活(当然,并不建议写复杂SQL),而且可以抽象成通用的基类,使每个DAO都可以通过这个基类实现基本的通用查询,原理类似Spring JDBC Template。

mybatis自定义插件要实现什么接口

竟然Mybatis是对四大接口进行拦截的,那我们药先要知道Mybatis的四大接口对象 Executor, StatementHandler, ResultSetHandler, ParameterHandler。上图Mybatis框架的整个执行过程。Mybatis插件能够对则四大对象进行拦截,可以包含到了Mybatis一次会议的所有操作。可见Mybatis的的插件很强大。Executor是 Mybatis的内部执行器,它负责调用StatementHandler操作数据库,并把结果集通过 ResultSetHandler进行自动映射,另外,他还处理了二级缓存的操作。从这里可以看出,我们也是可以通过插件来实现自定义的二级缓存的。StatementHandler是Mybatis直接和数据库执行sql脚本的对象。另外它也实现了Mybatis的一级缓存。这里,我们可以使用插件来实现对一级缓存的操作(禁用等等)。ParameterHandler是Mybatis实现Sql入参设置的对象。插件可以改变我们Sql的参数默认设置。ResultSetHandler是Mybatis把ResultSet集合映射成POJO的接口对象。我们可以定义插件对Mybatis的结果集自动映射进行修改。插件InterceptorMybatis的插件实现要实现Interceptor接口,我们看下这个接口定义的方法。public interface Interceptor {Object intercept(Invocation invocation) throws Throwable;Object plugin(Object target);void setProperties(Properties properties);}这个接口只声明了三个方法。setProperties方法是在Mybatis进行配置插件的时候可以配置自定义相关属性,即:接口实现对象的参数配置plugin方法是插件用于封装目标对象的,通过该方法我们可以返回目标对象本身,也可以返回一个它的代理,可以决定是否要进行拦截进而决定要返回一个什么样的目标对象,官方提供了示例:return Plugin.wrap(target, this);intercept方法就是要进行拦截的时候要执行的方法理解这个接口的定义,先要知道java动态代理机制。plugin接口即返回参数target对象(Executor/ParameterHandler/ResultSetHander/StatementHandler)的代理对象。在调用对应对象的接口的时候,可以进行拦截并处理。Mybatis四大接口对象创建方法Mybatis的插件是采用对四大接口的对象生成动态代理对象的方法来实现的。那么现在我们看下Mybatis是怎么创建这四大接口对象的。public Executor newExecutor(Transaction transaction, ExecutorType executorType) {//确保ExecutorType不为空(defaultExecutorType有可能为空)executorType = executorType == null ? defaultExecutorType : executorType;executorType = executorType == null ? ExecutorType.SIMPLE : executorType;Executor executor; if (ExecutorType.BATCH == executorType) {executor = new BatchExecutor(this, transaction);} else if (ExecutorType.REUSE == executorType) {executor = new ReuseExecutor(this, transaction);} else {executor = new SimpleExecutor(this, transaction);} if (cacheEnabled) {executor = new CachingExecutor(executor);}executor = (Executor) interceptorChain.pluginAll(executor);return executor;}public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {StatementHandler statementHandler = new RoutingStatementHandler(executor, mappedStatement, parameterObject, rowBounds, resultHandler, boundSql);statementHandler = (StatementHandler) interceptorChain.pluginAll(statementHandler);return statementHandler;}public ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {ParameterHandler parameterHandler = mappedStatement.getLang().createParameterHandler(mappedStatement, parameterObject, boundSql);parameterHandler = (ParameterHandler) interceptorChain.pluginAll(parameterHandler);return parameterHandler;}public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler, ResultHandler resultHandler, BoundSql boundSql) {ResultSetHandler resultSetHandler = new DefaultResultSetHandler(executor, mappedStatement, parameterHandler, resultHandler, boundSql, rowBounds);resultSetHandler = (ResultSetHandler) interceptorChain.pluginAll(resultSetHandler);return resultSetHandler;}查看源码可以发现, Mybatis框架在创建好这四大接口对象的实例后,都会调用InterceptorChain.pluginAll()方法。InterceptorChain对象是插件执行链对象,看源码就知道里面维护了Mybatis配置的所有插件(Interceptor)对象。// target --> Executor/ParameterHandler/ResultSetHander/StatementHandlerpublic Object pluginAll(Object target) {for (Interceptor interceptor : interceptors) {target = interceptor.plugin(target);}return target;}其实就是安顺序执行我们插件的plugin方法,一层一层返回我们原对象(Executor/ParameterHandler/ResultSetHander/StatementHandler)的代理对象。当我们调用四大接口对象的方法时候,实际上是调用代理对象的响应方法,代理对象又会调用十大接口对象的实例。Plugin对象我们知道,官方推荐插件实现plugin方法为:Plugin.wrap(target, this);public static Object wrap(Object target, Interceptor interceptor) {// 获取插件的Intercepts注解Map<Class<?>, Set<Method>> signatureMap = getSignatureMap(interceptor);Class<?> type = target.getClass();Class<?>[] interfaces = getAllInterfaces(type, signatureMap);if (interfaces.length > 0) {return Proxy.newProxyInstance(type.getClassLoader(), interfaces, new Plugin(target, interceptor, signatureMap));}return target;}这个方法其实是Mybatis简化我们插件实现的工具方法。其实就是根据当前拦截的对象创建了一个动态代理对象。代理对象的InvocationHandler处理器为新建的Plugin对象。插件配置注解@InterceptsMybatis的插件都要有Intercepts注解来指定要拦截哪个对象的哪个方法。我们知道,Plugin.warp方法会返回四大接口对象的代理对象(通过new Plugin()创建的IvocationHandler处理器),会拦截所有的执行方法。在代理对象执行对应方法的时候,会调用InvocationHandler处理器的invoke方法。Mybatis中利用了注解的方式配置指定拦截哪些方法。具体如下:public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {try {Set<Method> methods = signatureMap.get(method.getDeclaringClass());if (methods != null && methods.contains(method)) {return interceptor.intercept(new Invocation(target, method, args));}return method.invoke(target, args);} catch (Exception e) {throw ExceptionUtil.unwrapThrowable(e);}}可以看到,只有通过Intercepts注解指定的方法才会执行我们自定义插件的intercept方法。未通过Intercepts注解指定的将不会执行我们的intercept方法。官方插件开发方式@Intercepts({@Signature(type = Executor.class, method = "query",args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})public class TestInterceptor implements Interceptor {public Object intercept(Invocation invocation) throws Throwable {Object target = invocation.getTarget(); //被代理对象Method method = invocation.getMethod(); //代理方法Object[] args = invocation.getArgs(); //方法参数// do something ...... 方法拦截前执行代码块Object result = invocation.proceed();// do something .......方法拦截后执行代码块return result;}public Object plugin(Object target) {return Plugin.wrap(target, this);}}以上就是Mybatis官方推荐的插件实现的方法,通过Plugin对象创建被代理对象的动态代理对象。可以发现,Mybatis的插件开发还是很简单的。自定义开发方式Mybatis的插件开发通过内部提供的Plugin对象可以很简单的开发。只有理解了插件实现原理,对应不采用Plugin对象我们一样可以自己实现插件的开发。下面是我个人理解之后的自己实现的一种方式。public class TestInterceptor implements Interceptor {public Object intercept(Invocation invocation) throws Throwable {Object target = invocation.getTarget(); //被代理对象Method method = invocation.getMethod(); //代理方法Object[] args = invocation.getArgs(); //方法参数// do something ...... 方法拦截前执行代码块Object result = invocation.proceed();// do something .......方法拦截后执行代码块return result;}public Object plugin(final Object target) {return Proxy.newProxyInstance(Interceptor.class.getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {return intercept(new Invocation(target, method, args));}});}public void setProperties(Properties properties) {}}当然,Mybatis插件的那这个时候Intercepts的注解起不到作用了。作者:曹金桂链接:http://www.jianshu.com/p/7c7b8c2c985d来源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

mybatis pagehelper 怎么求出总页数

基于楼主应该引用了jar和插件配置。java中:1、在你执行mybatis查询之前加入如下代码PageHelper.startPage(pageInt, pagesizeInt, true);2、然后执行自己代码List<SysUser> listSysUser = sysUserService.selectByExample(sysUserExample);3、包装一下:PageInfo<SysUser> pageInfo =new PageInfo<SysUser>(listSysUser);syso.("物理总页数:"pageInfo .total);pageInfo中包含了分页的所有信息,其中total就是总页数。原理:pagehelper封装了返回结果 。上面的查询列表功能只是简单的select from没有limit。但返回结果listSysUser已经分页, 实际上存储的是Page<E>(是Arraylist子类。)

mybatis java注解怎么加判断

把“,”改成“+”才可以用。

spring集成了springmvc为什么不直接用,spring+mybatis,而还要用ssm

你可以把springmvc当成struts2,大概就明白了。以下内容来自网络,请认真看一遍。Spring是一个轻型容器(light-weight container),其核心是Bean工厂(Bean Factory),用以构造我们所需要的M(Model)。在此基础之上,Spring提供了AOP(Aspect-Oriented Programming, 面向层面的编程)的实现,用它来提供非管理环境下申明方式的事务、安全等服务;对Bean工厂的扩展ApplicationContext更加方便我们实现J2EE的应用;DAO/ORM的实现方便我们进行数据库的开发;Web MVC和Spring Web提供了Java Web应用的框架或与其他流行的Web框架进行集成。1)开源框架2)IoC(控制反转),将类的创建和依赖关系写在配置文件里,由配置文件注入,实现了松耦合3)AOP 将安全,事务等于程序逻辑相对独立的功能抽取出来,利用spring的配置文件将这些功能插进去,实现了按照方面编程,提高了复用性前言最近在看Spring MVC的源码,就把自己对MVC模式和对各种框架的实现的认识写出来给大家看看,算是一个总结.所以,恳请大家用怀疑的眼光来看待这篇文章,假如有认识不对的地方,麻烦指出.MVC与WEB应用MVC是什么就不用我多说了.对于现有较成熟的Model-View-Control(MVC)框架而言,其注意的主要问题无外乎下面这些:Model:模型应该包含由视图显示的数据.在J2EE Web应用中,数据通常应该由普通的javabean组成.一旦一个控制器选择了视图,模型就要包含视图相应的数据.模型本身不应该进一步的访问数据,也不应该和业务对象相联系.模型要解决的问题包括:l 封装要显示的数据l 我不认为模型要依赖于特定的框架l 不一定非得是javabeanView:视图负责显示出模型包含的信息,视图不必了解控制器或是底层业务对象的具体实现视图要解决的问题包括:l 在显示给定数据模型的情况下显示内容l 不应该包含有业务逻辑l 可能需要执行显示逻辑,比如颜色交替的显示某个数组的各行l 视图最好不处理验证的错误,数据的验证应该在由其他组件完成l 视图不应该处理参数,参数应该交由控制器集中处理Control:控制器就好像MVC里的中枢神经,它也许会需要一些助手来帮助它比如解析视图,解析参数等.控制器可以访问到业务对象或者是它的代理是很重要的,比如Struts里的Action.控制器要解决的问题包括:l 检查和抽取请求参数l 调用业务对象,传递从请求中获取的参数l 创建模型,视图讲显示对应的模型l 选择一个合适的视图发送给客户端l 控制器有时不会只有一个现有的框架现在已经有很多的MVC的框架实现.比较流行的应该就是Struts和Webwork了Struts这是最流行的web框架,几乎成为了实际上的工业标准.除了上面讨论的MVC模式应该有的优点以外.它还有如下一些缺点:l 每个Action只生成一次,然后就被缓存起来,再次请求这个Action的时候就不会生成新的对象,而是重复使用第一次生成的对象,这就意味着每个Action必须是线程安全的l 采用ActionForm封装了表单数据,但是却只能对应String类型的数据, 虽然它可以使用工具Commons Beanutils进行类型转化,但是仅仅是提供了对象级别的支持l 严重的依赖于Servlet API, 测试比较困难(不过下一版Struts里的Action.execute的方法签名讲会换成execute(ActionContext actionContext),依赖也许不会那么严重)l 框架本身的验证规则比较简单,一般都是依赖于Commons Validation进行验证l 想在Action前后做些处理很困难.有时甚至不得不自己去写专门的控制器l 由于Struts都是具体的类继承,这样很容易打破封装?l 提供各式各样的自定义的标签,但是数据绑定太原始了,这样就使页面代码依赖于Struts这个特定的框架,而它却不是规范,我觉得这是很致命的l 它太面向JSP了,尽管使用其他视图技术是有可能的,但是使用的时候却不是很方便Webwork这个框架虽然我没使用过,但是却一直在关注它的发展 Webwork的设计思想采用了比Struts更为聪明的一种方式,就技术角度上说比Struts要高出不少.它以Command模式为基础.分为Xwork和Webwork,而且框架并不依赖于Servlet API. Xwork提供了很多核心功能:拦截器(Interceptor),运行时表单验证,类型转换,IoC容器等. WebWork建立在Xwork之上,用于处理基于HTTP的响应和请求.用Map和ActionContext封装了Session,Application等这些Servlet对象.从而解除了和Servlet API的耦合. 但是它仍然不是完美的:l 为每一个请求都创建一个Action可能有些浪费.(但是Servlet引擎也是为每个请求创建多个对象,但是也没看出来对性能有多大的影响?)l 当项目越来越大的时候,配置文件可能会很零乱.好像它不支持多个配置文件l 异常处理是Command模式里值得注意的问题:我们不知道某一特定命令可能会抛出什么特定的异常,所以execute()被迫抛出异常,而不论异常是运行时异常,还是已检查异常 Spring MVC Framework的目标上面说了一些MVC的原理,以及现在主流框架的一些问题,现在来看Spring是如何处理的. Spring MVC框架根据不同的角色定义了很多接口,但是它最大的问题也是依赖于Servlet APISpring MVC Framework有这样一些特点:l 它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是java组件.并且和Spring提供的其他基础结构紧密集成.l 不依赖于Servlet API(目标虽是如此,但是在实现的时候确实是依赖于Servlet的)l 可以任意使用各种视图技术,而不仅仅局限于JSPl 支持各种请求资源的映射策略l 它应是易于扩展的我认为评价一个框架,应该有几个原则l 它应该是易于使用的,易于测试的Spring 易于使用吗?我不这么觉得,尤其是它的配置文件.在最恐怖的情况下,各种业务逻辑,基础设施也许会拥挤在一个配置文件里.而如事务处理这些基础设施应该是由容器管理而不是开发人员,就算把这些分开到几个配置文件里,逻辑上虽然清晰了,但是基础设置却还是暴露在外边Spring易于测试吗?对Spring进行单元测试很容易,测试起来很方便l 应该在多个层次上提供接口Spring提供了很多接口,而几乎每个接口都有默认的抽象实现,每个抽象实现都有一些具体实现,所以在可扩展性这点上Spring无疑是很优秀的l 框架内部和框架外部应该被区别对待框架内部可以很复杂,但是使用起来一定要简单,Spring的内部比较麻烦,但是它很好的隐藏了这种复杂性,使用起来很舒服,比如设置一个bean的属性.仅仅是setPropertyValue(String propertyName, Object value)就完成,至于怎么去设置,Spring完全隐藏了这种复杂性l 完善的文档和测试集这个就不用说了,老外的东西,都很完善 Spring Web框架基本流程知道了Spring MVC框架,现在来看看它的流程Spring MVC Framework大至流程如下:当web程序启动的时候,ContextLoaderServlet会把对应的配置文件信息读取出来,通过注射去初始化控制器DispatchServlet. 而当接受到一个HTTP请求的时候, DispatchServlet会让HandlerMapping去处理这个请求.HandlerMapping根据请求URL(不一定非要是URL,完全可以自定义,非常灵活)来选择一个Controller. 然后DispatchServlet会在调用选定的Controller的handlerRequest方法,并且在这个方法前后调用这个Controller的interceptor(假如有配置的话),然后返回一个视图和模型的集合ModelAndView.框架通过ViewResolver来解析视图并且返回一个View对象,最后调用View的render方法返回到客户端DispatcherServlet这是框架的控制器,是一个具体类,它通过运行时的上下文对象来初始化.控制器本身并不去控制流程,而只是是Controller的”控制器”,他只是把处理请求的责任委托给了对应的Controller. 控制器继承自抽象基类FrameworkServlet,它的属性webApplicationContext就代表着这个web程序上下文,而这个上下文对象默认实现就是从一个XML文件读取配置信息(当然也可以是其他文件格式). WebApplicationContext其实是beans包的东西,这个包提供了这个Spring整个框架的基础结构,以后我会分析这个包的内容.但是现在仅仅需要知道WebApplicationContext代表一个web应用的上下文对象. 现在来看看DispatchServlet是如何工作的:DispatchServlet由于继承自抽象基类FrameworkServlet,而FrameworkServlet里的doGet(),doPost()方法里有调用serviceWrapper(),跳到serviceWrapper()里去看,结果发现它有把具体实现委托给了doService(request, response); 方法.所以现在已经很清楚了, DispatchServlet真正实现功能的是doService() 这个方法. 特别的, FrameworkServlet的initFrameworkServlet()这个方法是控制器的初始化方法,用来初始化HandlerMappings之类的对象,这也是延迟到子类实现的.其实就是一个Template模式的实现.don"t call us, we will call u.总的看来,Spring就是通过这样来实现它的控制反转的:用框架来控制流程,而不是用户 跳到doService()一看究竟,就会发现真正工作的又是另一个助手函数doDispatch(request, response),没办法,继续看下去,发现这样两行代码HandlerExecutionChain mappedHandler = null; mappedHandler = getHandler(processedRequest, false);看HandlerExecutionChain源码就发现它其实就是对Controller和它的Interceptors的进行了包装; getHandler()就是从HandlerMappings(这是一个List,存放的handlerMapping对象)中取出对应的handlerMapping对象, 每个HandlerMapping对象代表一个Controller和URL的映射(其实在运行的时候是一个HandlerExecutionChain和URL的映射,而HandlerExecutionChain对象其实就是对Controller和它interceptors的一个包装器,可以把HandlerMapping看成Controller和URL的映射).而这个HandlerMapping是通过配置文件在运行时注射进来的,一般是SimpleUrlHandlerMapping这个子类 取得了HandlerMapping对象,继续向下看,发现: if (mappedHandler.getInterceptors() != null) { for (int i = 0; i < mappedHandler.getInterceptors().length; i++) { HandlerInterceptor interceptor = mappedHandler.getInterceptors()[i]; if (!interceptor.preHandle(processedRequest, response, mappedHandler.getHandler())) { triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null); return; } interceptorIndex = i; } }这里就是在调用Controller的拦截器,原理就是这句了: interceptor.preHandle(processedRequest, response, mappedHandler.getHandler(), mv);preHandle方法传入了mappedHandler.getHandler()这个参数来实现递归调用!而interceptor.postHandle方法如此一般.只不过这个方法是在handleRequest方法后调用 继续看下去: HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); mv = ha.handle(processedRequest, response, mappedHandler.getHandler());发现Controller的handleRequest真正的操作又被代理给了HandlerAdapter的handle方法,并且返回一个ModelAndView,我想这里增加一层的意义应该是为了解除Controller和DispatchServlet的耦合吧. 接着就很简单了,调用render()方法,在这个方法里面由ViewResoler解析出视图名,再调用视图对象的render方法把合适的视图展现给用户 到此,控制器的流程就OVER了HandlerMapping通过使用HandlerMapping,控制器可以用URL和某一个Controller进行标准的映射,而实现URL映射的具体子类的UrlHandlerMapping. Spring还允许我们自定义映射,比如通过Session,cookie或者用户状态来映射.而这一切仅仅只需要实现HandlerMapping接口而已.不过URL映射已经能满足大部分的要求ControllerController 类似Structs的Action, Controller接口只有一个方法handleRequest(),放回一个ModelAndView对象,如同设计目标所说的那样,每个Controller都是一个java组件,所以它可以在上下文环境中任意配置,组件属性都会在初始化的时候被配置.Spring自己提供了几个具体的实现.方便我们使用ViewResolverController通常返回包含视图名字而不是视图对象的ModelAndView对象.从而彻底的解除了控制器和视图之间的耦合关系,并且在这里还可以提供国际化的支持.在你的配置文件中你可以:welcomeView.class = org.springframework.web.servlet.view. InternalResourceViewwelcomeView.url=/welcome.jsp也可以welcomeView.class = org.springframework.web.servlet.view.xslt. XsltViewwelcomeView.url=/xslt/default.xslt View这也是一个java组件,它不做任何请求处理或是业务逻辑,它仅仅获取模型传递的数据,并把数据显示出来.它里面的 render方法按照如下流程工作:l 设置模型的数据到request作用域l 取得视图的URLl 转发到对应的URL总结:Spring的web框架是一个很优秀的框架,在这里只是走马观花的分析了Spring的工作流程和一些关键的类,但是并没有去深入的去探讨它背后所体现的思想,还有它的优缺点等东西.这些都等下次再说吧

java 怎么使用注解操作mybatis

1、用script标签包围,然后像xml语法一样书写@Select({"<script>", "SELECT * FROM tbl_order", "WHERE 1=1", "<when test="title!=null">", "AND mydate = #{mydate}", "</when>", "</script>"})2、用Provider去实现SQL拼接,例如:public class OrderProvider { private final String TBL_ORDER = "tbl_order"; public String queryOrderByParam(OrderPara param) { SQL sql = new SQL().SELECT("*").FROM(TBL_ORDER); String room = param.getRoom(); if (StringUtils.hasText(room)) { sql.WHERE("room LIKE #{room}"); } Date myDate = param.getMyDate(); if (myDate != null) { sql.WHERE("mydate LIKE #{mydate}"); } return sql.toString(); }}public interface OrderDAO { @SelectProvider(type = OrderProvider.class, method = "queryOrderByParam") List<Order> queryOrderByParam(OrderParam param);}注意:方式1有个隐患就是当传入参数为空的时候,可能会造成全表查询。复杂SQL用方式2会比较灵活(当然,并不建议写复杂SQL),而且可以抽象成通用的基类,使每个DAO都可以通过这个基类实现基本的通用查询,原理类似Spring JDBC Template。

sqlId,Mybatis怎么确定需要执行的方法

因为他手里拿着大把的进入仓库的令牌,他给你一个你就能进去,出来后你还给他,他再接着可以给下一个人,这个时候我们仓库门是一直打开的状态,省去了大把我们开锁、开门、关门、锁门的操作,完全交由一个专业人士管理,更神奇的是他还能记录你的一系列操作。对于tomcat的崇敬之情让我决定深入其中,一探究竟。于是我找到了网上大家首推的教材——《深入剖析tomcat》,书比较老,但是很权威,不影响原理性东西的理解。目前已经看到第二章。一个算法对其每一个输入的实例,都能输出正确的结果并停止,则称它是正确的,我们说一个正确的算法解决了给定的计算问题。不正确的算法对于某些输入来说,可能根本不会停止,或者停止时给出的不是预期的结果。然而,与人们对不正确算法的看法想反,如果这些算法的错误率可以得到控制的话,它们有时候也是有用的。但是一般而言,我们还是仅关注正确的算法!这两个框架的作者是园区里面的江大渔。 首先感谢他的无私开源贡献。之所以要写这个文章是因为群里经常有人问这个客户端框架要如何使用。原因在于服务端框架的文档比较多,客户端的文档比较少,所以很多c#基础比较差的人就不懂怎么玩起来。今天就这里写一个例子希望能给部分人抛砖引玉吧。http://www.cnblogs.com/gutye/ 代理接口方式,我们姑且不管是怎么样代理的,但能够运行起来,肯定是有一段真正的可以运行的代码——实际上就是调用SqlSession接口中的方法。因此首先需要解决的就是下面三个基本问题:配置base指定模板目录可以缩短模板的路径,并且能够避免include语句越级访问任意路径引发安全隐患但是随着项目上线后,发现业务数据越来越多,查询效率越来越慢,这时就需要分析慢查询记录了。如何开启慢查询记录?就是本篇文章介绍的内容了。http://www.cnblogs.com/jrtjwe/ 从表现层来看,Spring MVC用了逻辑命名视图策略,通过引入ViewResolver和View,清晰分离了视图策略的选择和渲染与具体控制器之间的耦合,适合各种视图技术很容易集成到Spring MVC中,不管是JSP/JSTL作为视图技术,还是Velocity/FreeMarker,甚至是PDF/Excel等二进制格式视图形式,使用它们,只需要简单的配置。这个对象最早在IE中被实现,不过它最早的时候是通过ActiveXObject实现的,如果不需要管兼容的话,IE9或者其他浏览器使用 new XMLHttpRequest() 就能创建了一个 XHR (XMLHttpRequest) 对象,IE中由于存在三个版本的XHR对象,所以如果需要兼容,需要对这三个版本进行处理,从中选出IE浏览器中最新支持对象。在大部分 .Net 开发人心目中,好像并没有数据库连接池的概念,只有数据库连接,然后用完要记得close和用using,在 Java 中有太多的开源的数据库连接池,而且好像一个吹的比一个厉害。我其实告诉你,其实在 .Net 中 ADO.Net 已经帮我们实现了数据库连接池,我们并不需要什么配置,用就是了,但 Java 不一样,需要我们自己选择合适的数据库连接池。下面我说说项目中为什么选择了阿里的 Druid 数据库连接池。sqlId,Mybatis怎么确定需要执行的方法标签:

刚开始学习mybatis,有没有什么好的书推荐的?

可以看看《深入浅出MyBatis技术原理与实战》

mybatis 参数是一个基本数据类型时使用#{参数名}为什么有时会报错,而换成#{value}就好了?

举个例子来研究一下。

mybatis中的#和$的区别

mybatis预编译底层实现原理 MyBatis何做SQL预编译呢其实框架底层JDBCPreparedStatement类起作用PreparedStatement我熟悉Statement类象包含编译SQL语句种准备式仅能提高安全性且执行同SQL能够提高效率原SQL已编译再执行需再编译总结 #{}:相于JDBCPreparedStatement ${}:输变量值 简单说#{}经预编译安全;${}未经预编译仅仅取变量值非安全存SQL注入希望帮助~-

sherlock的爱称是什么?我要的是英文昵称。像jim→jimmy。john→johnny。

sherlocky - -

mybatis原理是什么?

MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。用xml文件构建SqlSessionFactory实例是非常简单的事情。mybatis的功能构架:1、API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。2、数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。

mybatis工作原理是什么?

MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。把Mybatis的功能架构分为三层:1、API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。2、数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。3、基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

mybatis注解怎么解决字段名与属性名不同的问题

查询语句是 MyBatis 中最常用的元素之一,本文涉及mybatis的单表查询操作,关联表有关的查询会后续补充。 巧妇难为无米之炊,要想从数据库中表中取出数据并转化为javaBean,所以,我们要先准备javabean以及与其对应的数据表。javaBean:public class President { private int id; private String name; @Override public String toString() { return "President [id=" + id + ", name=" + name + "]"; } //get set 方法.....}创建两个对应的数据库表,并插入两条数据:create table president1( p_id int not null auto_increment primary key, p_name varchar(50) not null);insert into president1(p_name) values("lily"),("Tom");create table president2( id int not null auto_increment primary key, name varchar(50) not null);insert into president2(name) values("lily"),("Tom");创建两个数据库是为了测试两个不同的查询状况,数据库字段名与实体类属性名相同从sql表可以看出president2的字段名与javabean:President的属性名完全相同,这种情况下mybatis的select操作非常简单:<!-- 从表 president2中查询--> <select id="getPreByIdPresident2" parameterType="int" resultType="President"> select * from president2 where id=#{id} </select>此时mybatis运用反射机制会将查询返回的结果(id,name)封装成President对象。如果从表president1中查询,同样采用上面的sql语句<!-- 从表 president1中查询--> <select id="getPreByIdPresident1" parameterType="int" resultType="President"> <span style="white-space:pre"> </span>President p1 = session.selectOne(statement+"getPreByIdPresident1", 1);<span style="white-space:pre"> </span>System.out.println("表president1中查询"+p1); </select>此时如果用getPreByIdPresident1进行查询,返回的结果会是null,我们将上面的sql语句在mysql中执行下:有结果返回,但是返回的字段名为(p_id,p_name)这种结果mybatis在解析时无法与President类对应。多数情况下实体类属性名与数据库表的字段名都会有差异,这种情况如果mybatis不能处理也就太low了。数据库字段名与实体类属性名不相同mybatis针对该种情况有两种解决方法,但是归根到底都是同一种实现。Method1:定义一个ResultMap将数据库字段名与实体类属性名做个映射我们欲从表president1中查询数据,此时的mapper配置如下:<resultMap type="President" id="getFromPresident2"> <!-- 主键必须用id标签映射,其他的用非集合用result映射 集合类用collection映射 --> <!-- column为数据库字段名,property为实体类属性名 --> <id column="p_id" property="id" /> <result column="p_name" property="name" /> </resultMap> <select id="getPreByIdPresident1Method1" resultMap="getFromPresident2"> select * from president1 where p_id=#{id} </select>首先定义了一个resultMap,将数据库表的字段名与实体类属性名做了一一对应,其中type为实体类(此处运用的类别名),id为了在select标签中引用映射结果。在select标签中并没有用resultType属性,而使用了resultMap,即为上面定义的resultMap,mybatis会根据resultMap中的映射关系去构造PresidentMethod1:直接在sql语句中使用别名 <!-- 从表 president1中查询 --> <select id="getPreByIdPresident1Method2" resultType="President"> select p_id id,p_name name from president1 where p_id=#{id} </select>这种方法会查到实际的数据,这种方法与字段名和属性名相同都是基于相同的原理:MyBatis 会在幕后自动创建一个 ResultMap,基于属性名来映射列到JavaBean 的属性上。即mybatis底层都是通过创建ResultMap来进行关系的映射,与method1原理相同。。

mybatis mapper 怎么映射到xml 原理

具体方法一般要检查配置文件命名空间,还有applicationContext.xml里的配置<bean id ="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"p:dataSource-ref="dataSource" p:configLocation="classpath:mybatis-config.xml"><property name="mapperLocations"><list><value>classpath*:com/xxx/**/*Mapper.xml</value></list></property></bean>

springboot中,mybatis的mapper接口是如何生成代理对象的?

引入了以下包 其中自动装配的包就是mybatis-spring-boot-autoconfigure。 META-INF下有一个spring.factories文件 导入了这个类MybatisAutoConfiguration 注册MapperScannerConfigurer的Bean定义到Spring容器中,并设置扫描包的路径 MapperScannerConfigurer 实现BeanDefinitionRegistryPostProcessor接口,实例化的时候会调到postProcessBeanDefinitionRegistry方法,这个方法里会创建一个ClassPathMapperScanner对象,然后去扫描 扫描到之后修改BeanDefinition @MapperScan注解,会import进来MapperScannerRegistrar这个类 MapperScannerRegistrar类实现ImportBeanDefinitionRegistrar接口,实例化的时候会调用registerBeanDefinitions方法 和@Mapper一样,同样会创建MapperScannerConfigurer的BeanDefition,用于后续实例化 只不过要扫描的包路径变了,不再是默认的,而是@MapperScan配置的包路径 后面的话则和@Mapper扫描到之后的工作原理是一样的,扫描到之后,更改BeanDefinition,一毛一样的。 ==可以看出@MapperScan最主要的工作原理除了提供BasePackage的值之外,就是用@Import注解导入MapperScannerRegistrar.所以这个注解打在任何可以被spring扫描到的类上都可以,并不一定要打在启动类上(大多数为了只是为了看起来方便,把全局性的配置注解打在启动类上而已)== 前面提到,注册扫描@Mapper接口的MapperScannerConfigurer实例的类是AutoConfiguredMapperScannerRegistrar,那么这个类是如何被导入进来的呢 MybatisAutoConfiguration还有一个静态内部类,@Import了AutoConfiguredMapperScannerRegistrar类,但是有@ConditionalOnMissingBean,即spring容器中不存在MapperFactoryBean,MapperScannerConfigurer的实例。 如果@MapperScan注解生效,并且扫描到任意一个Mapper接口(前面被改造成MapperFactoryBean类型的了),那么就不满足注册这个类MapperScannerRegistrarNotFoundConfiguration的实例的条件,继而不会导入AutoConfiguredMapperScannerRegistrar类。 前面提到,所有的Mapper接口被扫描到,封装成BeanDefinition,还经历了一次改造, 最主要的就是将mapper接口BeanDefination的beanClass改成了org.mybatis.spring.mapper.MapperFactoryBean.class 并且将mapper接口BeanDefination的名称作为构造函数的入参传入进去 并讲BeanDefinition的autowireMode属性改成 AUTOWIRE_BY_TYPE ,后面实例化该bean的时候会调用属性的描述器,用write的方式注入属性值,最重要的那个属性那就是SqlSessionTemplate. 会通过这种方式将前面MybatisAutoConfiguration中@Bean出来的SqlSessionTemplate注入到其中。 类图: 这里他实现了FactoryBean, FactoryBean有以下方法 这里是spring的一个拓展点,实现了FactoryBean接口的类,将可以实现getObject() 和getObjectType来实例化额外的一个bean并装到spring容器中 好吧,其实Mapper代理对象的创建就是在MapperFactoryBean的getObject方法中返回的 这里就是熟悉的原生Mybatis创建Mapper接口的味道了。 附上调用的类时序图,回过头来看一下调用的整体流程。

Mybatis源码解析(1) 如何获得SQL语句

笔者只能说会使用Mybtis,并没有具体研究过源码,站在一个使用者的角度记录解决的问题。 跳过大部分源码,从一个功能点开始入手。 以 Select 操作为例,研究如何获取经过 Mybatis 中 动态语句 转换后的的 SQL语句 。 我们这里不涉及复杂的过程原理(如:读取配置文件、Mapper代理等( 我也不懂 )),只说明一下具体流程。 发现studentMapper被MapperProxy实现。 好奇的同学肯定会问studentMapper是如何创建MapperProxy实例的呢? 一路跟随瞎点。会发现一个配置类,里面东西很多,目前只看和Mapper有关系。 我们继续下一步 到此关于Mapper的运行过程已经分析完了,下面继续分析SelectOne过程。 selectOne 其实只是 selectList 取第一个元素(这点是没有想到的)。 源码解析,这还是第一次写这类文章,确实这些框架的原理,并没有研究过只是知道一点概念,Mapper动态代理之类的。网上的博客从大方向出发,框架设计、设计模式之类的,对于我这种基础薄弱的人看的云里雾里。我准备从一个一个功能开始初步了解、研究此类框架原理。 参考 https://blog.csdn.net/luanlouis/article/details/40422941

Mybatis Mapper接口是如何找到实现类的-源码分析

KeyWords: Mybatis 原理,源码,Mybatis Mapper 接口实现类,代理模式,动态代理,Java动态代理,Proxy.newProxyInstance,Mapper 映射,Mapper 实现 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。我们在使用 Mybaits 进行 ,通常只需要定义几个 Mapper 接口,然后在编写一个 xml 文件,我们在配置文件中写好 sql , Mybatis 帮我们完成 Mapper 接口道具体实现的调用。以及将结果映射到 model bean 中。 我们在项目中所编写的众多的 Mapper 类只是一个接口(interface ),根据 Java 的多态性我们知道,可以使用接口接口作为形参,进而在运行时确定具体实现的对象是什么。但是,对于 Mapper 接口,我们并没有编写其实现类!Mybatis是如何找到其实现类,进而完成具体的 CRUD 方法调用的呢?原理何在? 为了弄清楚 Mapper 接口是如何找到实现类的,我们先回忆一下 Mybatis 是怎么使用的,根据实际的例子,进而一点点的去分析。这里的使用指的是Mybatis 单独使用,而不是整合 spring , 因为整合 spring 的话,还需要涉及 Mapper dao 装载到 spring 容器的问题,spring 帮忙创建数据源配置等问题。 通常我们使用 Mybatis 的主要步骤是: 从一段代码看起 上面我们概括了使用 Mybatis 的4个步骤。这4个步骤看起来很简单,但是用代码写出来就很多。我们不妨先记着这4个步骤,再去看代码,会容易点。 在这块代码中,第 1 部分我们使用了 Java 编码的形式来实现 SqlSessionFactory ,也可以使用 xml 。如果使用xml的话,上面的第一部分代码就是这样的: 我们本次的目标是弄清楚 “ Mapper 是如何找到实现类的 ”,我们注意上面代码 3 , 4 的位置: 这里 mapper 可以调用selectBlog(1) 这个方法,说明 mapper 是个对象,因为对象才具有方法行为实现啊。BlogMapper接口是不能实例化的,更没有具体方法实现。我们并没有定义一个类,让它实现BlogMapper接口,而在这里它只是通过调用session.getMapper() 所得到的。由此,我们可以推断:肯定是session.getMapper() 方法内部产生了BlogMapper的实现类。有什么技术可以根据BlogMapper 接口生成了一个实现类呢?想到这里,对于有动态代理 使用经验的程序员来说,很容易想到,这背后肯定是基于动态代理技术,具体怎么实现的呢?下面我们来根据源码一探究竟。 Mapper 接口的注册 从上面的代码中,我们知道 BlogMapper 接口的实现类是从session.getMapper中得来的,大概是基于动态代理技术实现。我们既然能够从SqlSession中得到BlogMapper接口的,那么我们肯定需要先在哪里把它放进去了,然后 SqlSession 才能生成我们想要的代理类啊。上面代码中有这么一行: 跟着这个 addMapper 方法的代码实现是这样的: 我们看到这里 mapper 实际上被添加到 mapperRegissry 中。继续跟进代码: 看到这里我们知道上面所执行的configuration.addMapper(BlogMapper.class); 其实最终被放到了HashMap中,其名为knownMappers ,knowMappers是MapperRegistry 类的一个私有属性,它是一个HashMap 。其Key 为当前Class对象,value 为一个MapperProxyFactory 实例。 这里我们总结一下: 诸如BlogMapper 之类的Mapper接口被添加到了MapperRegistry 中的一个HashMap中。并以 Mapper 接口的 Class 对象作为 Key , 以一个携带Mapper接口作为属性的MapperProxyFactory 实例作为value 。MapperProxyFacory从名字来看,好像是一个工厂,用来创建Mapper Proxy的工厂。我们继续往下看。 Mapper接口的动态代理类的生成 上面我们已经知道,Mapper 接口被到注册到了MapperRegistry中——放在其名为knowMappers 的HashMap属性中,我们在调用Mapper接口的方法的时候,是这样的: 这里,我们跟踪一下session.getMapper() 方法的代码实现,这里 SqlSession 是一个接口,他有两个实现类,一个是DefaultSqlSession,另外一个是SqlSessionManager,这里我们用的是DefaultSqlSession. 为什么是DefaultSqlSession呢?因为我们在初始化SqlSessionFactory的时候所调用的SqlSessionFactoryBuilder的build()方法里边配置的就是DefaultSqlSession, 所以,我们进入到DefaultSession类中,看看它对session.getMapper(BlogMapper.class)是怎么实现的: 如代码所示,这里的 getMapper 调用了 configuration.getMapper , 这一步操作其实最终是调用了MapperRegistry,而此前我们已经知道,MapperRegistry是存放了一个HashMap的,我们继续跟踪进去看看,那么这里的get,肯定是从这个hashMap中取数据。我们来看看代码: 我们调用的session.getMapper(BlogMapper.class);最终会到达上面这个方法,这个方法,根据BlogMapper的class对象,以它为key在knowMappers 中找到了对应的value —— MapperProxyFactory(BlogMapper) 对象,然后调用这个对象的newInstance()方法。根据这个名字,我们就能猜到这个方法是创建了一个对象,代码是这样的: 看到这里,就清楚了,最终是通过Proxy.newProxyInstance产生了一个BlogMapper的代理对象。Mybatis 为了完成 Mapper 接口的实现,运用了代理模式。具体是使用了JDK动态代理,这个Proxy.newProxyInstance方法生成代理类的三个要素是: 代理模式中,代理类(MapperProxy)中才真正的完成了方法调用的逻辑。我们贴出MapperProxy的代码,如下: 我们调用的 Blog blog = mapper.selectBlog(1); 实际上最后是会调用这个MapperProxy的invoke方法。这段代码中,if 语句先判断,我们想要调用的方法是否来自Object类,这里的意思就是,如果我们调用toString()方法,那么是不需要做代理增强的,直接还调用原来的method.invoke()就行了。只有调用selectBlog()之类的方法的时候,才执行增强的调用——即mapperMethod.execute(sqlSession, args);这一句代码逻辑。 而mapperMethod.execute(sqlSession, args);这句最终就会执行增删改查了,代码如下: 再往下一层,就是执行JDBC那一套了,获取链接,执行,得到ResultSet,解析ResultSet映射成JavaBean。 至此,我们已经摸清楚了Blog blog = mapper.selectBlog(1); 中,BlogMapper接口调用到得到数据库数据过程中,Mybaitis 是如何为接口生成实现类的,以及在哪里出发了最终的CRUD调用。实际上,如果我们在调用Blog blog = mapper.selectBlog(1);之前,把从slqSession中得到的 mapper 对象打印出来就会看到,输出大概是这样的: 动态代理没错吧,Java动态代理实在是太美妙了。 上面我们用层层深入的方式摸清楚了 Mapper接口是如何找到实现类的。我们分析了 Mapper接口是如何注册的,Mapper接口是如何产生动态代理对象的,Maper接口方法最终是如何执行的。总结起来主要就是这几个点:

Mybatis中@Mapper与@MapperScan配置及注入原理解析

问题背景: 执行流程: 1.发现Bean定义:首先根据@MapperScan中的basePackage或者@Mapper所在的package取得需要扫描的包,之后通过ClassPathMapperScaner获取包下所有Mapper接口类的BeanDefinition; 2.注册Bean:设置beanClass为MapperFactoryBean,再设置MapperFactoryBean的构造参数为实际的Mapper接口类,然后通过ClassPathBeanDefinitionScanner父类进行Bean注册 3.调用Bean:自动注入时,通过调用MapperFactoryBean的getObject获取实例 原理解析:

mybatis spring struts2原理或者ssh的工作原理

在src的根目录下建一个struts-2.0.dtd(struts包里面有)和struts.xml,struts.xml里面配置常量和自己写的action的路径,在WEB-INF(WEB-ROOT)目录下建一个applicationContext.xml,在这里面配置事务管理器、事务通知、事务切点以及数据库的关联配置和bean文件的关联,还有在web.xml里面配置struts2的filter和filter-mapping

MyBatis解析

从命名上可以看出,这个是一个 Builder 模式的,用于创建 SqlSessionFactory 的类。SqlSessionFactoryBuilder 根据配置来构造 SqlSessionFactory。其中配置方式有两种: mybatis-config.xml 就是我们的配置文件: Java Config 相比较 XML 文件的方式而言,会有一些限制。比如修改了配置文件需要重新编译,注解方式没有 XML 配置项多等。所以,业界大多数情况下是选择 XML 文件的方式。但到底选择哪种方式,这个要取决与自己团队的需要。比如,项目的 SQL 语句不复杂,也不需要一些高级的 SQL 特性,那么 Java Config 则会更加简洁一点;反之,则可以选择 XML 文件的方式。 创建配置文件解析器XMLConfigBuilder 解析mybatis-config.xml里的配置为Configuration对象,Mybatis的全局配置对象。 XMLConfigBuilder#parseConfiguration解析mapper下的xml XMLMapperBuilder#bindMapperForNamespace,根据xml里的 namespace 反射出 mapper接口 的 class,如果有mapper接口,则把该mapper接口的class添加到Configuration的mapperRegistry里。 如果该接口已经注册,则抛出已经绑定的异常。 为该接口注册MapperProxyFactory,但这里只是注册其创建MapperProxy的工厂,并不是创建MapperProxy。 如果Mapper对应的xml资源未加载,触发xml的绑定操作,将xml中的sql语句与Mapper建立关系。 addMapper方法,只是为**Mapper创建对应对应的MapperProxyFactory。 根据Mapper接口与SqlSession创建MapperProxy对象。 根据接口类获取MapperProxyFactory。 调用MapperProxyFactory的newInstance创建MapperProxy对象。 SqlSessionFactory 顾名思义,是用于生产 SqlSession 的工厂。 通过如下的方式来获取 SqlSession 实例: SqlSession 包含了执行 SQL 的所有的方法。以下是示例: 当然,下面的方式可以做到类型安全: MapperProxy是MapperProxyFactory使用SqlSession创建出来的。所以MapperProxy中包含SqlSession。 可以看到MapperProxy调用invoke方法,进而调用MapperMethod的execute(),这些MapperMethod就是和你要执行的命令相关,比如执行select语句,则会通过SqlSession的select()方法,最终调用到Executor的query方法。Executor会再协调另外三个核心组件。 MapperProxy: MapperMethod: 插件的构建: 谈原理首先要知道StatementHandler,ParameterHandler,Result Handler都是代理,他们是Configuration创建,在创建过程中会调用interceptorChain.pluginAll()方法,为四大组件组装插件(再底层是通过Plugin.wrap(target,XX, new Plugin( interceptor))来来创建的)。 插件链是何时构建的: 在执行SqlSession的query或者update方法时,SqlSession会通过Configuration创建Executor代理,在创建过程中就调用interceptor的pluginAll方法组装插件。然后executor在调用doQuery()方法的时候,也会调用Configuration的newStatementHandler方法创建StatemenHandler(和上面描述的一样,这个handler就是个代理,也是通过interceptorChain的pluginAll方法构建插件) 插件如何执行: 以statementhandler的prepare方法的插件为例,正如前面所说,statementhandler是一个proxy,执行他的prepare方法,将调用invokeHandler的invoke方法,而invokeHandler就是Plugin.wrap(target, xxx, new Plugin(interceptor))中的第三个参数,所以很自然invokeHanlder的invoke的方法最终就会调用interceptor对象的intercept方法。 Mybatis的插件配置在configuration内部,初始化时,会读取这些插件,保存于Configuration对象的InterceptorChain中。 org.apache.ibatis.plugin.InterceptorChain.java源码。 上面的for循环代表了只要是插件,都会以责任链的方式逐一执行,所谓插件,其实就类似于拦截器。 插件的编写 插件必须实现org.apache.ibatis.plugin.Interceptor接口。 -intercept()方法:执行拦截内容的地方,拦截目标对象的目标方法的执行 -plugin()方法:决定是否触发intercept()方法。 作用:包装目标对象,包装就是为目标对象创建一个代理对象 -setProperties()方法:给自定义的拦截器传递xml配置的属性参数。将插件注册时的property属性设置进来 下面自定义一个拦截器: 为什么要写Annotation注解?注解都是什么含义? Mybatis规定插件必须编写Annotation注解,是必须,而不是可选。@Intercepts注解:装载一个@Signature列表,一个@Signature其实就是一个需要拦截的方法封装。那么,一个拦截器要拦截多个方法,自然就是一个@Signature列表。 type = Executor.class, method = "query", args = { MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class } 解释:要拦截Executor接口内的query()方法,参数类型为args列表。 Plugin.wrap(target, this)是干什么的? 使用JDK的动态代理,给target对象创建一个delegate代理对象,以此来实现方法拦截和增强功能,它会回调intercept()方法。 Mybatis可以拦截哪些接口对象? Mybatis只能拦截ParameterHandler、ResultSetHandler、StatementHandler、Executor共4个接口对象内的方法。 重新审视interceptorChain.pluginAll()方法:该方法在创建上述4个接口对象时调用,其含义为给这些接口对象注册拦截器功能,注意是注册,而不是执行拦截。 拦截器执行时机:plugin()方法注册拦截器后,那么,在执行上述4个接口对象内的具体方法时,就会自动触发拦截器的执行,也就是插件的执行。 Invocation 可以通过invocation来获取拦截的目标方法,以及执行目标方法。 分页插件原理 由于Mybatis采用的是逻辑分页,而非物理分页,那么,市场上就出现了可以实现物理分页的Mybatis的分页插件。 要实现物理分页,就需要对String sql进行拦截并增强,Mybatis通过BoundSql对象存储String sql,而BoundSql则由StatementHandler对象获取。 因此,就需要编写一个针对StatementHandler的query方法拦截器,然后获取到sql,对sql进行重写增强。

MyBatis分页插件的实现原理是什么?

你好,很高兴回答你的问题。mybatis分页插件是通过在你写好的sql语句基础上,拼接生成两个sql语句实现的。第一个是以你的sql作为子查询进行count的语句,用来查询符合条件是数据总条数。另一个是在你的sql的基础上拼接了limit进行分页查询。如果有帮助到你,请点击采纳。我解答的大部分是软件开发新人遇到的问题,如果有兴趣可以关注我。

Spring整合Mybatis一文讲透,手把手带你实操

在介绍Spring整合Mybatis原理之前,我们得先来稍微介绍Mybatis的工作原理。 在Mybatis中,我们可以使用一个接口去定义要执行sql,简化代码如下: 定义一个接口,@Select表示要执行查询sql语句。 以下为执行sql代码: Mybatis的目的是:使得程序员能够以调用方法的方式执行某个指定的sql,将执行sql的底层逻辑进行了封装。 这里重点思考以下mapper这个对象,当调用SqlSession的getMapper方法时,会对传入的接口生成一个 代理对象,而程序要真正用到的就是这个代理对象,在调用代理对象的方法时,Mybatis会取出该方法所对应的sql语句,然后利用JDBC去执行sql语句,最终得到结果。 UserService中的userMapper属性就会被自动注入为Mybatis中的代理对象。如果你基于一个已经完成整合的项目去调试即可发现,userMapper的类型为: org.apache.ibatis.binding.MapperProxy@41a0aa7d。证明确实是Mybatis中的代理对象。 好,那么现在我们要解决的问题的就是:如何能够把Mybatis的代理对象作为一个bean放入Spring容器中?要解决这个,我们需要对Spring的bean生成过程有一个了解。 Spring启动过程中,大致会经过如下步骤去生成bean 假设有一个A类,假设有如下代码: 一个A类 一个B类,不存在@Component注解 执行如下代码: 输出结果为:com.luban.util.A@6acdbdf5 A类对应的bean对象类型仍然为A类。但是这个结论是不确定的,我们可以利用BeanFactory后置处理器来 修改BeanDefinition,我们添加一个BeanFactory后置处理器: 这样就会导致,原本的A类对应的BeanDefiniton被修改了,被修改成了B类,那么后续正常生成的bean对 象的类型就是B类。此时,调用如下代码会报错: 但是调用如下代码不会报错,尽管B类上没有@Component注解: 并且,下面代码返回的结果是:com.luban.util.B@4b1c1ea0 之所以讲这个问题,是想说明 个问题:在Spring中,bean对象跟class没有直接关系,跟 BeanDefinition才有直接关系。 那么回到我们要解决的问题:如何能够把Mybatis的代理对象作为一个bean放入Spring容器中? 在Spring中,如果你想生成一个bean,那么得先生成一个BeanDefinition,就像你想new一个对象实 例,得先有一个class。 继续回到我们的问题,我们现在想自己生成一个bean,那么得先生成一个BeanDefinition,只要有了 BeanDefinition,通过在BeanDefinition中设置bean对象的类型,然后把BeanDefinition添加给 Spring,Spring就会根据BeanDefinition 动帮我们 成 个类型对应的bean对象。 所以,现在我们要解决两个问题: 注意:上文中我们使用的BeanFactory后置处理器,他只能修改BeanDefinition,并不能新增一个 BeanDefinition。我们应该使用Import技术来添加一个BeanDefinition。后面再详细介绍如果使用Import 技术来添加一个BeanDefinition,可以先看一下伪代码实现思路。 假设:我们有一个UserMapper接口,他的代理对象的类型为UserMapperProxy。 那么我们的思路就是这样的,伪代码如下: 但是,这里有一个严重的问题,就是上文中的UserMapperProxy是我们假设的,他表示一个代理类的类 型,然而Mybatis中的代理对象是利用的JDK的动态代理技术实现的,也就是代理对象的代理类是动态生成的,我们根本方法确定代理对象的代理类到底是什么。 所以回到我们的问题:Mybatis的代理对象的类型是什么? 本来可以有两个答案: 1. 代理对象对应的代理类 2. 代理对象对应的接口 那么答案1就相当于没有了,因为是代理类是动态生成的,那么我们来看答案2:代理对象对应的接口如果我们采用答案2,那么我们的思路就是: 但是,实际上给BeanDefinition对应的类型设置为一个接口是行不通的,因为Spring没有办法根据这个 BeanDefinition去new出对应类型的实例,接口是没法直接new出实例的。 那么现在问题来了,我要解决的问题:Mybatis的代理对象的类型是什么? 两个答案都被我们否定了,所以这个问题是无解的,所以我们不能再沿着这个思路去思考了,只能回到最 开始的问题:如何能够把Mybatis的代理对象作为一个bean放入Spring容器中? 总结上文的推理:我们想通过设置BeanDefinition的class类型,然后由Spring自动的帮助我们去生成对应的bean,但是这条路是行不通的。 终极解决方案 那么我们还有没有其他办法,可以去生成bean呢?并且生成bean的逻辑不能由Spring来帮我们做了,得 由我们自己来做。 FactoryBean 有,那就是Spring中的FactoryBean。我们可以利用FactoryBean去自定义我们要生成的bean对象,比如 我们定义了一个LubanFactoryBean,它实现了FactoryBean,getObject方法就是用来自定义生成bean 对象逻辑的。 执行如下代码: 将打印: lubanFactoryBean: com.luban.util.LubanFactoryBean 1@4d41cee &lubanFactoryBean: com.luban.util.LubanFactoryBean@3712b94 lubanFactoryBean-class: class com.sun.proxy. Proxy20 从结果我们可以看到,从Spring容器中拿名字为"lubanFactoryBean"的bean对象,就是我们所自定义的 jdk动态代理所生成的代理对象。 所以,我们可以通过FactoryBean来向Spring容器中添加一个自定义的bean对象。上文中所定义的 LubanFactoryBean对应的就是UserMapper,表示我们定义了一个LubanFactoryBean,相当于把 UserMapper对应的代理对象作为一个bean放入到了容器中。 但是作为程序员,我们不可能每定义了一个Mapper,还得去定义一个LubanFactoryBean,这是很麻烦的 事情,我们改造一下LubanFactoryBean,让他变得更通用,比如: 改造LubanFactoryBean之后,LubanFactoryBean变得灵活了,可以在构造LubanFactoryBean时,通 过构造传入不同的Mapper接口。 实际上LubanFactoryBean也是一个Bean,我们也可以通过生成一个BeanDefinition来生成一个 LubanFactoryBean,并给构造方法的参数设置不同的值,比如伪代码如下: 特别说一下注意二,表示表示当前BeanDefinition在生成bean对象时,会通过调用LubanFactoryBean的 构造方法来生成,并传入UserMapper的Class对象。那么在生成LubanFactoryBean时就会生成一个 UserMapper接口对应的代理对象作为bean了。 到此为止,其实就完成了我们要解决的问题:把Mybatis中的代理对象作为一个bean放入Spring容器中。 只是我们这是用简单的JDK代理对象模拟的Mybatis中的代理对象,如果有时间,我们完全可以调 Mybatis中提供的方法区生成一个代理对象。这里就不花时间去介绍了。 Import 到这里,我们还有一个事情没有做,就是怎么真正的定义一个BeanDefinition,并把它添加到Spring中, 上文说到我们要利用Import技术,比如可以这么实现: 定义如下类: 并且在AppConfig上添加@Import注解: 这样在启动Spring时就会新增一个BeanDefinition,该BeanDefinition会生成一个LubanFactoryBean对 象,并且在生成LubanFactoryBean对象时会传入UserMapper.class对象,通过LubanFactoryBean内部 的逻辑,相当于会自动生产一个UserMapper接口的代理对象作为一个bean。 总结一下,通过我们的分析,我们要整合Spring和Mybatis,需要我们做的事情如下: 作者:程序员周瑜 链接:https://juejin.cn/post/7089023062800236552

mybatis二级缓存原理

mybatis篇 一级缓存的作用域是Sqlsession级别的,也就是说不同的Sqlsession是不会走一级缓存的,那么如果需要跨Sqlsession的缓存,就需要使用到二级缓存了。 二级缓存的话默认是关闭的,所以需要我们开启,开启的方式官网也有介绍,需要在mybatis-config.xml核心配置文件中开启二级缓存功能,并且我们mapper.xml中也需要加入<cache/>标签,二者缺一不可,后面我们看源码就能知道为啥这两个缺一不可。 先来看个例子 执行结果很意外,为什么二级缓存的功能都开启了,结果sql还是执行了2次,并没有走缓存,其实,二级缓存还有一个要注意的点那就是必须要提交事务二级缓存才会保存记录,因为已经是跨SqlSession共享缓存了,所以事务必须要提交,否则会读取到因混滚导致的错误数据。 有个地方需要注意,二级缓存的Sqlsession中的Executor实际上是CachingExecutor 我们知道getMapper最终的执行都会走到MapperProxy类中的invoker方法,具体就来分析这个类。 最后来到了重点的地方 CacheKey我们可以认为他就是每个方法对应的一个唯一标识符。 这里我们就可以看出为什么之前两者必须要配置,cacheEnable开启了才会用CachingExecutor包装一下BaseExecutor,而<cache/>标签只有配置了才会走缓存的逻辑 这里的tcm 到这,我们就差不多揭开了二级缓存的秘密,重要的还是<cache/>这个标签,因为它的存在就对应着每个mapper.xml中的一个具体Cache类,而这个类在每个mapper.xml中又是同一个,所以最终的值是放入了Cache类中,key为CacheKey,value就是sql执行的结果。 至于为什么需要事务提交才能命中二级缓存,我们看下put方法就知道 这里的putObject并没有真正的把值存入Cache中,而是存入了待提交的Map中,所以再来看下commit做了什么 具体看tcm.commit() 而这里可以看到此处会遍历所有的TransactionCache并执行commit方法 真相就出来了,会遍历待提交的Map然后把里面的值都存入Cache中,所以后面的查询就能直接从Cache中拿到值了。 总结 二级缓存先会把Sqlsession中的Executor包装成包装成CacheingExecutor,所有的sql都会经过这个类,而该类通过mapper.xml中配置的唯一<cache/>标签生成的Cache类存放每个方法执行的结果

mybatis原理

MyBatis 的工作原理:读取 MyBatis 配置文件、加载映射文件、构造会话工厂、创建会话对象、Executor 执行器、输入参数映射、输出结果映射。mybatis原理具体介绍如下:1、读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。2、加载映射文件:映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。3、构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。4、创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。5、Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。6、MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。7、输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。8、输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。

怎么翻译拼音首字母:KXMYRGWYYGRTNKXSYBSZJ ?

没有这个字,只有koala这个字,意思是考拉熊。树袋熊是澳大利亚的国宝,也是澳大利亚奇特的珍贵原始树栖动物。英文名koala bear来源于古代澳大利亚英语,意思是“no drink”。因为树袋熊从他们取食的桉树叶中获得所需的90%的水分,只在生病和干旱的时候喝水,当地人称它“克瓦勒”。树袋熊并不是熊科动物,而且它们相差甚远。熊科属于食肉目,而树袋熊却属于有袋目。它每天18个小时处于睡眠状态,性情温顺,体态憨厚。树袋熊体态憨厚,长相酷似小熊,有一身又厚又软的浓密灰褐色短毛,胸部、腹部、四肢内侧和内耳皮毛呈灰白色。成年雄性考拉白色胸部中央具有一块特别醒目的棕色香腺。分布在南部的考拉,因为需要适应较寒冷的气候而拥有较大的体重和较厚的皮毛。厚厚的皮毛有利保持温度的恒定,下雨时可以避免身体遭受潮气和雨水的侵扰。肌肉发达,四肢修长且强壮,适于在树枝间攀爬并支持它的体重。前肢与腿几乎等长,攀爬力量主要来自于发达的大腿肌肉。考拉的爪爪长、尖而弯曲,每只五趾分为两排,一排为二,一排为三,尤其适应于抓握物体和攀爬,粗糙的掌垫和趾垫可以帮助考拉紧抱树枝,四肢均具尖锐的长爪。前掌具5个手指,其中2个手指与其它3指相对,就象人类的拇指,因而可与其它指对握,这可以使考拉可以更安全自信地紧握物体。脚掌上,除大脚趾没有长爪外,其它趾均具尖锐长爪,且第二趾与第三趾相连。生有一对大耳朵,耳有茸毛,鼻子裸露且扁平,没有尾巴,这是因为它的尾巴经过漫长的岁月已经退化成一个“座垫”,臀部的皮毛厚而密,因而能长时间坐在树上,平衡感极强。考拉的牙齿非常适合于处理他们的特殊食物。尖利的长门齿负责从树上夹住桉树叶,而臼齿则负责剪切并磨碎。门齿与臼齿间的缝隙地带,可以让考拉的舌头高效地嘴里搅拌混和食物团。科学家发现了公无尾熊(又称考拉、树熊)可以发出超低音的秘密,他们的发音器官与众不同。树袋熊又名“考拉”,是一种树栖动物,同时也是世界上最能睡的动物。这种动物只生活在澳大利亚,主要栖息在桉树上,每天的睡眠时间达到22个小时左右。清醒的时候,它们的大部分时间也用来吃东西,可谓是一个真正意义上的大懒虫。元音字母a在单字中有时发长元音/ɑ/的音,发音时,舌端离开下齿,舌后缩,舌后部略抬高,是五个后元音中舌位最低的一个,牙床全开,是五个后元音中牙床开得最大的一个,不圆唇。这个音出现在字首或字中,有时也出现在字尾位置,如:ma 妈pa 爸mamma 妈妈pappa 爸爸father 父亲,爸爸sonata 奏鸣曲koala 考拉熊希望我能帮助你解疑释惑。

myeclipse启动weblogic报错

从开始里关掉weblogicOracle Weblogic----user projects--stop admin server等弹出的小黑窗自动关闭后再从eclipse启动试试,不行我就不知道了

Myeclipse中如何配置Weblogic

第一步:第二步:第三步:单击确定配置完成

若X等于Y,则MX等于MY,是不是正确的

当X=Y时,不论M是什么数,都相等 若当MX=MY时,X不等于Y,因为当M是0时,MX=MY就可定义为0=0,不能证明X=Y

直线有这么两种设法x=my+b或y=mx +b 请问 y=mx +b 叫做斜距式,x=my+b叫做什么?还有这两种设法怎么...

x=my+by=(x-b)/m还是斜距式,只是截距变为-b/m

虎牌保温杯MMY和MMJ有什么区别

你好虎牌儿童保温杯打开闻着有腥味,这个建议不要使用,可以采取使用热水烫一下在使用。

mysql如何做事件回滚

BEGIN//开始COMMIT//如果都成功,MYSQL没错误就执行这个ROLLBACK//事件回滚 不过要注意的是,数据库表要InnoDB这种格式。MyISAM这个格式不支持回滚的。

mysql 存储过程rollback后面的语句还会执行吗

会执行。一般回滚操作都是写在异常处理,或是sql的最后。如果你的sql中出现错误,代码会立即跳转到错误处理代码上执行,比如回滚,但紧接在错误行之后的代码不会执行的。
 首页 上一页  8 9 10 11 12 13 14 15 16 17 18  下一页  尾页