一对一一对多

更新时间:2022-12-30 08:04:30 阅读: 评论:0


2022年12月30日发(作者:中国土豪)

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(){

//这个字符串有⽂件中两个部分构成

//的namespace的值

//id值

Stringstatement="Mapper"+".lectPersonById";

Personp=One(statement,1);

n(p);

();

}

//查询person表所有数据

@Test

publicvoidtestGetAllPerson(){

Stringstatement="Person";

ListlistPerson=List(statement);

ListlistPerson=List(statement);

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;

privateSetstudents;

publicintgetCid(){

returncid;

}

publicvoidtCid(intcid){

=cid;

}

publicStringgetCname(){

returncname;

}

publicvoidtCname(Stringcname){

=cname;

}

publicSetgetStudents(){

returnstudents;

}

publicvoidtStudents(Setstudents){

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;

privateSetgroups;

publicintgetUid(){

returnuid;

}

publicvoidtUid(intuid){

=uid;

}

publicStringgetUname(){

returnuname;

}

publicvoidtUname(Stringuname){

=uname;

}

publicSetgetGroups(){

returngroups;

}

publicvoidtGroups(Setgroups){

=groups;

}

@Override

publicStringtoString(){

return"Ur[u,uname="+uname+",groups="+groups+"]";

}

}

;

;

publicclassGroups{

privateintgid;

privateStringgname;

privateSeturs;

publicintgetGid(){

returngid;

}

publicvoidtGid(intgid){

=gid;

}

publicStringgetGname(){

returngname;

}

publicvoidtGname(Stringgname){

=gname;

}

publicSetgetUrs(){

returnurs;

}

publicvoidtUrs(Seturs){

=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";

ListlistGroup=List(statement,1);

for(Groupsg:listGroup){

n(ng());

}

}

本文发布于:2022-12-30 08:04:30,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/90/58445.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

下一篇:理科状元
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图