MyBatis详解(⼀对⼀,⼀对多,多对多)
1、什么是MyBatis?
MyBatis本是apache的⼀个开源项⽬iBatis,2010年这个项⽬由apachesoftwarefoundation迁移到了googlecode,并且改名为
MyBatis。2013年11⽉迁移到Github。
iBATIS⼀词来源于“internet”和“abatis”的组合,是⼀个基于Java的持久层框架。iBATIS提供的持久层框架包括SQLMaps和
DataAccessObjects(DAO)。
MyBatis是⽀持普通SQL查询,存储过程和⾼级映射的优秀持久层框架。MyBatis消除了⼏乎所有的JDBC代码和参数的⼿⼯设置以
及结果集的检索。MyBatis使⽤简单的XML或注解⽤于配置和原始映射,将接⼝和Java的POJOs(PlainOrdinaryJavaObjects,普
通的Java对象)映射成数据库中的记录。
2、MyBatis⼊门实例基于xml配置
①、创建MySQL数据库:mybatisDemo和表:person
createdatabamybatisDemo;
umybatisDemo;
createtableperson(pidintprimarykeyAUTO_INCREMENT,pnamevarchar(50),pageint);
②、建⽴⼀个Java⼯程,并导⼊相应的jar包
③、在MyBatisDemo⼯程中添加数据库配置⽂件
<?xmlversion="1.0"encoding="UTF-8"?>
④、定义表所对应的实体类
;
publicclassPerson{
privateintpid;
privateStringpname;
privateintpage;
publicintgetPid(){
returnpid;
}
publicvoidtPid(intpid){
=pid;
}
publicStringgetPname(){
returnpname;
}
publicvoidtPname(Stringpname){
=pname;
}
publicintgetPage(){
returnpage;
}
publicvoidtPage(intpage){
=page;
}
@Override
publicStringtoString(){
return"Person[p,pname="+pname+",page="+page
+"]";
}
}
⑤、定义操作person表的sql映射⽂件
<?xmlversion="1.0"encoding="UTF-8"?>
PUBLIC"-////DTDMapper3.0//EN"
"/dtd/">
resultType=""parameterType="int">
lect*frompersonwherepid=#{pid}
lect*fromperson
updatepersontpname=#{pname},page=#{page}wherepid=#{pid}
inrtintoperson(pid,pname,page)values(#{pid},#{pname},#{page})
deletefrompersonwherepid=#{pid}
⑥、向配置⽂件中注册⽂件
如下图所⽰:
⑦、创建测试类
;
tream;
;
sion;
sionFactory;
sionFactoryBuilder;
;
;
;
publicclassMyBatisTest{
SqlSessionssion;
@Before
publicvoidbeforeLoadXML(){
//加载mybatis配置⽂件
InputStreaminputStream=.
getClassLoader().getResourceAsStream("");
//构建sqlSession的⼯⼚
SqlSessionFactorysqlSessionFactory=
newSqlSessionFactoryBuilder().build(inputStream);
//根据sqlSessionFactory产⽣ssion
ssion=ssion();
}
//根据pid查询person表中的数据
@Test
publicvoidtestSelectById(){
//这个字符串有⽂件中两个部分构成
//
//
Stringstatement="Mapper"+".lectPersonById";
Personp=One(statement,1);
n(p);
();
}
//查询person表所有数据
@Test
publicvoidtestGetAllPerson(){
Stringstatement="Person";
List
List
n(listPerson);
();
}
//根据id更新数据
@Test
publicvoidupdateById(){
Stringstatement="PersonById";
Personp=newPerson();
(1);
me("aaa");
e(11);
(statement,p);
();
();
}
//向person表插⼊⼀条数据
@Test
publicvoidaddPerson(){
Stringstatement="son";
Personp=newPerson();
//由于我们设置了主键的⾃增长机制,故这⾥不需要⼿动设置pid的值
//(1);
me("add");
e(11);
(statement,p);
();
();
}
//根据pid删除person表中的数据
@Test
publicvoiddeletePersonById(){
Stringstatement="PersonById";
(statement,1);
();
();
}
}
3、MyBatis⼊门实例注解配置
①、上⾯的前⾯四步都是⼀样的,但是第五步不⼀样,我们不需要创建⽂件,⾸先在src⽬录下创建
⽂件
内容如下:
tion;
;
;
;
;
;
publicinterfacePersonMapper{
@Inrt("inrtintoperson(pid,pname,page)values(#{pid},#{pname},#{page})")
publicintadd(Personperson);
@Select("lect*frompersonwherepid=#{pid}")
publicPersongetPerson(intpid);
@Update("updatepersontpname=#{pname},page=#{page}wherepid=#{pid}")
publicintupdatePerson(Personpreson);
@Delete("deletefrompersonwherepid=#{pid}")
publicintdeletePerson(intpid);
}
②、向配置⽂件中注册⽂件
③、编写测试类
@Test
publicvoidtestAnnocation(){
PersonMappermapper=per();
Personp=newPerson();
(7);
me("abc");
e(11);
//调⽤增加⽅法
(p);
//调⽤查询⽅法
Personp1=son(3);
n(p1);
//调⽤更新⽅法
e(100);
Person(p);
//调⽤删除⽅法
Person(7);
();
();
}
4、MyBatis⼊门实例⼀对⼀基于xml配置
这⾥我们以⽼师和班级为例,假设⼀般班级只能拥有有⼀个⽼师,⼀个⽼师只能带⼀个班级。
①、创建实体类
;
publicclassTeacher{
privateinttid;
privateStringtname;
privateClassclass;
publicintgetTid(){
returntid;
}
publicvoidtTid(inttid){
=tid;
}
publicStringgetTname(){
returntname;
}
publicvoidtTname(Stringtname){
=tname;
}
publicClassgetClass(){
returnclass;
}
publicvoidtClass(Classclass){
s=class;
}
@Override
publicStringtoString(){
return"Teacher[t,tname="+tname+",class="+class+"]";
}
}
;
publicclassClass{
privateintcid;
privateStringcname;
privateTeacherteacher;
publicintgetCid(){
returncid;
}
publicvoidtCid(intcid){
=cid;
}
publicStringgetCname(){
returncname;
}
publicvoidtCname(Stringcname){
=cname;
}
publicTeachergetTeacher(){
returnteacher;
}
publicvoidtTeacher(Teacherteacher){
r=teacher;
}
@Override
publicStringtoString(){
return"Class[c,cname="+cname+",teacher="+teacher+"]";
}
}
②、在数据库中根据实体类创建相应的数据表
③、定义操作Class表的sql映射⽂件
<?xmlversion="1.0"encoding="UTF-8"?>
PUBLIC"-////DTDMapper3.0//EN"
"/dtd/">
lect*fromclassc,teachert
==#{tid}
lect*fromteachert,classc
==#{cid}
lect*=#{cid}
lecttidtid,tnametnamefromteacherwheretid=#{tid}
说明:我们这⾥⼀对⼀的关联操作,有两种⽅式:
1、使⽤嵌套结果映射来处理重复的联合结果的⼦集
2、通过执⾏另外⼀个SQL映射语句来返回预期的复杂类型
相关属性解释:
④、向配置⽂件中注册⽂件
⑤、编写测试类
;
tream;
sion;
sionFactory;
sionFactoryBuilder;
;
;
sTest;
publicclassOneToOneTest{
SqlSessionssion;
@Before
publicvoidbeforeLoadXML(){
//加载mybatis配置⽂件
InputStreaminputStream=.
getClassLoader().getResourceAsStream("");
//构建sqlSession的⼯⼚
SqlSessionFactorysqlSessionFactory=
newSqlSessionFactoryBuilder().build(inputStream);
//根据sqlSessionFactory产⽣ssion
ssion=ssion();
}
//⼀对⼀嵌套结果⽅式:根据教师id查询班级信息
@Test
publicvoidtestGetClass(){
Stringstatement="ss";
Classc=One(statement,1);
n(c);
}
//⼀对⼀嵌套结果⽅式:根据班级id查询教师信息
@Test
publicvoidtestGetTeacher(){
Stringstatement="cher";
Teachert=One(statement,1);
n(t);
}
//⼀对⼀嵌套查询⽅式:根据教师id查询班级信息
@Test
publicvoidtestGetClass2(){
Stringstatement="ss2";
Classc=One(statement,1);
n(c);
}
}
4、MyBatis⼊门实例⼀对多,多对⼀基于xml配置
这⾥我们以班级和学⽣为例,⼀个班级⾥⾯对应多个学⽣,这是⼀对多;反过来,多个学⽣对应⼀个班级,这是多对⼀
①、建⽴学⽣和班级的实体类
;
publicclassStudent{
privateintsid;
privateStringsname;
privateClassclass;
publicintgetSid(){
returnsid;
}
publicvoidtSid(intsid){
=sid;
}
publicStringgetSname(){
returnsname;
}
publicvoidtSname(Stringsname){
=sname;
}
publicClassgetClass(){
returnclass;
}
publicvoidtClass(Classclass){
s=class;
}
@Override
publicStringtoString(){
return"Student[s,sname="+sname+",class="+class+"]";
}
}
;
;
publicclassClass{
privateintcid;
privateStringcname;
privateSet
publicintgetCid(){
returncid;
}
publicvoidtCid(intcid){
=cid;
}
publicStringgetCname(){
returncname;
}
publicvoidtCname(Stringcname){
=cname;
}
publicSet
returnstudents;
}
publicvoidtStudents(Set
ts=students;
}
@Override
publicStringtoString(){
return"Class[c,cname="+cname+",students="+students+"]";
}
}
②、在数据库中根据实体类创建相应的数据表
③、多对⼀:定义操作Class表的sql映射⽂件
<?xmlversion="1.0"encoding="UTF-8"?>
PUBLIC"-////DTDMapper3.0//EN"
"/dtd/">
lect*fromclassc,==#{cid}
④、⼀对多:定义操作Student表的sql映射⽂件
<?xmlversion="1.0"encoding="UTF-8"?>
PUBLIC"-////DTDMapper3.0//EN"
"/dtd/">
lect*fromclassc,==#{sid}
⑤、向配置⽂件中注册、⽂件
⑥、编写测试类
;
tream;
sion;
sionFactory;
sionFactoryBuilder;
;
;
sTest;
publicclassOneToManyTest{
SqlSessionssion;
@Before
publicvoidbeforeLoadXML(){
//加载mybatis配置⽂件
InputStreaminputStream=.
getClassLoader().getResourceAsStream("");
//构建sqlSession的⼯⼚
SqlSessionFactorysqlSessionFactory=
newSqlSessionFactoryBuilder().build(inputStream);
//根据sqlSessionFactory产⽣ssion
ssion=ssion();
}
//⼀对多嵌套结果⽅式:根据班级id查询班级所有的学⽣信息
@Test
publicvoidtestGetClass(){
Stringstatement="ss";
Classc=One(statement,1);
n(c);
n(dents().size());
}
//多对⼀嵌套结果⽅式:根据学⽣id查询班级信息
@Test
publicvoidtestGetStudents(){
Stringstatement="dents";
Students=One(statement,1);
n(s);
n(ss());
}
}
5、MyBatis⼊门实例多对多基于xml配置
这⾥我们以urs表和groups表为例,⼀个urs可能加⼊多个groups,⽽⼀个groups可能包含多个urs,故构成多对多
的关联
①、在数据库中建⽴相应的表
urs表
groups表
两者之间的关联表urs_groups表
②、建⽴对应的实体类
;
;
publicclassUrs{
privateintuid;
privateStringuname;
privateSet
publicintgetUid(){
returnuid;
}
publicvoidtUid(intuid){
=uid;
}
publicStringgetUname(){
returnuname;
}
publicvoidtUname(Stringuname){
=uname;
}
publicSet
returngroups;
}
publicvoidtGroups(Set
=groups;
}
@Override
publicStringtoString(){
return"Ur[u,uname="+uname+",groups="+groups+"]";
}
}
;
;
publicclassGroups{
privateintgid;
privateStringgname;
privateSet
publicintgetGid(){
returngid;
}
publicvoidtGid(intgid){
=gid;
}
publicStringgetGname(){
returngname;
}
publicvoidtGname(Stringgname){
=gname;
}
publicSet
returnurs;
}
publicvoidtUrs(Set
=urs;
}
@Override
publicStringtoString(){
return"Group[g,gname="+gname+",urs="+urs+"]";
}
}
Urs_
;
publicclassUrs_Groups{
privateUrsur;
privateGroupsgroup;
publicUrsgetUr(){
returnur;
}
publicvoidtUr(Ursur){
=ur;
}
publicGroupsgetGroup(){
returngroup;
}
publicvoidtGroup(Groupsgroup){
=group;
}
}
③、多对多:定义操作sql映射⽂件
<?xmlversion="1.0"encoding="UTF-8"?>
PUBLIC"-////DTDMapper3.0//EN"
"/dtd/">
,romurs_groupsug,groupsg
_id=_id=#{uid}
⑤、向配置⽂件中注册⽂件
⑥、编写测试类
//多对多:根据根据⽤户id查询所有的⽤户组信息
@Test
publicvoidtestGetGroups(){
Stringstatement="rs";
List
for(Groupsg:listGroup){
n(ng());
}
}
本文发布于:2022-12-30 08:04:30,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/58445.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
| 留言与评论(共有 0 条评论) |