MyBatis的1V1、1VN、NVN关系(单向或双向)的实现?

一、首先,介绍一下什么是MyBatis?

 MyBatis是一个ORM(对象关系映射)框架,是一个可以自定义SQL、存储过程和高级映射的持久层框架。

二、关联关系是有方向的:单向和双向。单向即只有一端入口(A有B的对象或集合,而B没有A的对象或集合);双向即有两端入口(A有B的对象或集合,B也有A的对象或集合)。

三、1V1关系的实现(单向):

1、配置xml配置文件(mybatis-Config.xml):




2、Log4J的配置文件(log4j.properties):

# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.zking.mapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

3、创建主表(person )和从表(cord)的实体:

注意点:实体类名、属性名必须和数据库定义的表名、列名一致。

/*** 1V1关系的主表*/
public class person implements Serializable {/*** 人的编号*/private String pid;/*** 姓名*/private String pname;/*** 性别*/private String psex;/*** 年龄*/private int page;/*** 卡的对象*/private cord cord;/*** 无参构造方法*/public person() {}/*** 有参构造方法** @param pid* @param pname* @param psex* @param page* @param cord*/public person(String pid, String pname, String psex, int page, com.zking.pojo.cord cord) {this.pid = pid;this.pname = pname;this.psex = psex;this.page = page;this.cord = cord;}/*** get和set方法** @return*/public String getPid() {return pid;}public void setPid(String pid) {this.pid = pid;}public String getPname() {return pname;}public void setPname(String pname) {this.pname = pname;}public String getPsex() {return psex;}public void setPsex(String psex) {this.psex = psex;}public int getPage() {return page;}public void setPage(int page) {this.page = page;}public com.zking.pojo.cord getCord() {return cord;}public void setCord(com.zking.pojo.cord cord) {this.cord = cord;}@Overridepublic String toString() {return "person{" +"pid='" + pid + '\'' +", pname='" + pname + '\'' +", psex='" + psex + '\'' +", page=" + page +", cord=" + cord +'}';}
}
/*** 1V1关系的从表*/
public class cord implements Serializable {/*** 卡的编号*/private String cid;/*** 卡号*/private int cnumber;/*** 无参构造方法*/public cord() {}/*** 有参构造方法** @param cid* @param cnumber*/public cord(String cid, int cnumber) {this.cid = cid;this.cnumber = cnumber;}/*** get和set方法** @return*/public String getCid() {return cid;}public void setCid(String cid) {this.cid = cid;}public int getCnumber() {return cnumber;}public void setCnumber(int cnumber) {this.cnumber = cnumber;}@Overridepublic String toString() {return "cord{" +"cid='" + cid + '\'' +", cnumber=" + cnumber +'}';}
}

4、创建接口类(IPersonMapper):

/*** 1V1关系的接口*/
public interface IPersonMapper {public List findPersonAndCordAll();}

5、配置映射文件(PersonMapper.xml):



6、1V1关系的测试类(PersonTest):

/*** 1V1关系的测试类*/
public class PersonTest {SqlSession session = null;@Beforepublic void before() {//加载 mybatis 配置文件InputStream inputStream = PersonTest.class.getClassLoader().getResourceAsStream("mybatis-Config.xml");//构建sqlSession的工厂SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);//根据 sqlSessionFactory 产生 sessionsession = sqlSessionFactory.openSession();}@Testpublic void findPersonAndCordAll() {IPersonMapper ipm = session.getMapper(IPersonMapper.class);System.out.println(ipm.findPersonAndCordAll());}@Afterpublic void after() {//关闭sessionsession.close();}}

7、1V1关系的测试输出结果:

DEBUG [main] - ==>  Preparing: SELECT p.`pid`,p.`pname`,p.`psex`,p.`page`,c.`cnumber`,c.`cid` FROM person p,cord c WHERE p.pid=c.cid 
DEBUG [main] - ==> Parameters: 
TRACE [main] - <==    Columns: pid, pname, psex, page, cnumber, cid
TRACE [main] - <==        Row: 15b62d15-b8c5-11e8-a42a-80fa5b5015f0, 陈超, 男, 17, 111, 15b62d15-b8c5-11e8-a42a-80fa5b5015f0
TRACE [main] - <==        Row: b0450efa-de57-11e8-aba8-80fa5b5015f0, 成成, 男, 19, 222, b0450efa-de57-11e8-aba8-80fa5b5015f0
DEBUG [main] - <==      Total: 2
[person{pid='15b62d15-b8c5-11e8-a42a-80fa5b5015f0', pname='陈超', psex='男', page=17, cord=cord{cid='15b62d15-b8c5-11e8-a42a-80fa5b5015f0', cnumber=111}}, person{pid='b0450efa-de57-11e8-aba8-80fa5b5015f0', pname='成成', psex='男', page=19, cord=cord{cid='b0450efa-de57-11e8-aba8-80fa5b5015f0', cnumber=222}}]

三、1VN关系的实现(单向):

1、2步跟1V1关系一致。

3、创建主表(nation)和从表(province)的实体:

注意点:实体类名、属性名必须和数据库定义的表名、列名一致。

/*** 1VN关系的主表*/
public class nation implements Serializable {/*** 国家编号*/private String nid;/*** 国家名称*/private String nname;/*** 省份集合*/private List provinceList;public nation() {}public nation(String nid, String nname, List provinceList) {this.nid = nid;this.nname = nname;this.provinceList = provinceList;}public String getNid() {return nid;}public void setNid(String nid) {this.nid = nid;}public String getNname() {return nname;}public void setNname(String nname) {this.nname = nname;}public List getProvinceList() {return provinceList;}public void setProvinceList(List provinceList) {this.provinceList = provinceList;}@Overridepublic String toString() {return "nation{" +"nid='" + nid + '\'' +", nname='" + nname + '\'' +", provinceList=" + provinceList +'}';}
}
/*** 1VN关系的从表*/
public class province implements Serializable {/*** 省份编号*/private String pid;/*** 省份名称*/private String pname;/*** 国家编号*/private String nid;/*** 国家对象*/private nation nation;public province() {}public province(String pid, String pname, String nid, com.zking.pojo.nation nation) {this.pid = pid;this.pname = pname;this.nid = nid;this.nation = nation;}public String getPid() {return pid;}public void setPid(String pid) {this.pid = pid;}public String getPname() {return pname;}public void setPname(String pname) {this.pname = pname;}public String getNid() {return nid;}public void setNid(String nid) {this.nid = nid;}public com.zking.pojo.nation getNation() {return nation;}@Overridepublic String toString() {return "province{" +"pid='" + pid + '\'' +", pname='" + pname + '\'' +", nid='" + nid + '\'' +", nation=" + nation +'}';}public void setNation(com.zking.pojo.nation nation) {this.nation = nation;}
}

4、创建接口类(INationMapper):

/*** 1VN关系的接口*/
public interface INationMapper {public List findNationAndProvince();}

5、配置映射文件(NationMapper.xml):



6、1VN关系的测试类(NationTest):

/*** 1VN关系的测试类*/
public class NationTest {SqlSession session = null;@Beforepublic void before() {//加载 mybatis 配置文件InputStream inputStream = PersonTest.class.getClassLoader().getResourceAsStream("mybatis-Config.xml");//构建sqlSession的工厂SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);//根据 sqlSessionFactory 产生 sessionsession = sqlSessionFactory.openSession();}@Testpublic void findNationAndProvince() {INationMapper inm = session.getMapper(INationMapper.class);System.out.println(inm.findNationAndProvince());}@Afterpublic void after() {//关闭sessionsession.close();}}

7、1VN关系的测试输出结果:

TRACE [main] - <==        Row: befa7666-b8c2-11e8-a42a-80fa5b5015f0, China, befe676c-b8c2-11e8-a42a-80fa5b5015f0, 湖北, befa7666-b8c2-11e8-a42a-80fa5b5015f0
TRACE [main] - <==        Row: befa7666-b8c2-11e8-a42a-80fa5b5015f0, China, befea6fd-b8c2-11e8-a42a-80fa5b5015f0, 湖南, befa7666-b8c2-11e8-a42a-80fa5b5015f0
TRACE [main] - <==        Row: d45a4506-de61-11e8-aba8-80fa5b5015f0, America, f256472a-de61-11e8-aba8-80fa5b5015f0, 洛杉矶, d45a4506-de61-11e8-aba8-80fa5b5015f0
DEBUG [main] - <==      Total: 4
[nation{nid='d45a4506-de61-11e8-aba8-80fa5b5015f0', nname='America', provinceList=[province{pid='0ac574fa-de62-11e8-aba8-80fa5b5015f0', pname='哥伦布', nid='d45a4506-de61-11e8-aba8-80fa5b5015f0', nation=null}, province{pid='f256472a-de61-11e8-aba8-80fa5b5015f0', pname='洛杉矶', nid='d45a4506-de61-11e8-aba8-80fa5b5015f0', nation=null}]}, nation{nid='befa7666-b8c2-11e8-a42a-80fa5b5015f0', nname='China', provinceList=[province{pid='befe676c-b8c2-11e8-a42a-80fa5b5015f0', pname='湖北', nid='befa7666-b8c2-11e8-a42a-80fa5b5015f0', nation=null}, province{pid='befea6fd-b8c2-11e8-a42a-80fa5b5015f0', pname='湖南', nid='befa7666-b8c2-11e8-a42a-80fa5b5015f0', nation=null}]}]

四、NVN关系的实现(双向):

1、2步跟1V1关系一致。

3、创建主表(t_user)、中间表(t_userrole)、从表(t_role)的实体:

注意点:实体类名、属性名必须和数据库定义的表名、列名一致。

/*** NVN关系的主表*/
public class t_user implements Serializable {/*** 用户编号*/private String user_id;/*** 用户名称*/private String user_name;/*** 用户密码*/private String user_pwd;/*** 用户类型*/private int user_type;/*** 角色集合z*/private List roleList;public t_user() {}public t_user(String user_id, String user_name, String user_pwd, int user_type, List roleList) {this.user_id = user_id;this.user_name = user_name;this.user_pwd = user_pwd;this.user_type = user_type;this.roleList = roleList;}public String getUser_id() {return user_id;}public void setUser_id(String user_id) {this.user_id = user_id;}public String getUser_name() {return user_name;}public void setUser_name(String user_name) {this.user_name = user_name;}public String getUser_pwd() {return user_pwd;}public void setUser_pwd(String user_pwd) {this.user_pwd = user_pwd;}public int getUser_type() {return user_type;}public void setUser_type(int user_type) {this.user_type = user_type;}public List getRoleList() {return roleList;}public void setRoleList(List roleList) {this.roleList = roleList;}@Overridepublic String toString() {return "t_user{" +"user_id='" + user_id + '\'' +", user_name='" + user_name + '\'' +", user_pwd='" + user_pwd + '\'' +", user_type=" + user_type +", roleList=" + roleList +'}';}
}
/*** NVN关系的中间表*/
public class t_userrole implements Serializable {/*** 中间表编号*/private String urid;/*** 用户对象*/private t_user t_user;/*** 角色对象*/private t_role t_role;public t_userrole() {}public t_userrole(String urid, com.zking.pojo.t_user t_user, com.zking.pojo.t_role t_role) {this.urid = urid;this.t_user = t_user;this.t_role = t_role;}public String getUrid() {return urid;}public void setUrid(String urid) {this.urid = urid;}public com.zking.pojo.t_user getT_user() {return t_user;}public void setT_user(com.zking.pojo.t_user t_user) {this.t_user = t_user;}public com.zking.pojo.t_role getT_role() {return t_role;}public void setT_role(com.zking.pojo.t_role t_role) {this.t_role = t_role;}@Overridepublic String toString() {return "t_userrole{" +"urid='" + urid + '\'' +", t_user=" + t_user +", t_role=" + t_role +'}';}
}
/*** NVN关系的从表*/
public class t_role implements Serializable {/*** 角色编号*/private String rid;/*** 角色名称*/private String rname;/*** 角色等级*/private String rclass;/*** 用户集合*/private List userList;public t_role() {}public t_role(String rid, String rname, String rclass, List userList) {this.rid = rid;this.rname = rname;this.rclass = rclass;this.userList = userList;}public String getRid() {return rid;}public void setRid(String rid) {this.rid = rid;}public String getRname() {return rname;}public void setRname(String rname) {this.rname = rname;}public String getRclass() {return rclass;}public void setRclass(String rclass) {this.rclass = rclass;}public List getUserList() {return userList;}public void setUserList(List userList) {this.userList = userList;}@Overridepublic String toString() {return "t_role{" +"rid='" + rid + '\'' +", rname='" + rname + '\'' +", rclass='" + rclass + '\'' +", userList=" + userList +'}';}
}

4、创建用用户表接口类(IUserMapper):

/*** NVN关系的用户表接口*/
public interface IUserMapper {public List findUserAndRoleAllList();}

创建用角色表接口类(IRoleMapper):

/*** NVN关系的角色表接口*/
public interface IRoleMapper {public List findRoleAndUserAllList();}

5、配置用户表的映射文件(UserMapper.xml):



配置角色表的映射文件(RoleMapper.xml):



6、NVN关系用户表的测试类(UserTest):

/*** NVN关系的用户表的测试类*/
public class UserTest {SqlSession sqlSession = null;@Beforepublic void before() {//加载 mybatis 配置文件InputStream inputStream = UserTest.class.getClassLoader().getResourceAsStream("mybatis-Config.xml");//构建sqlSession的工厂SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);//根据 sqlSessionFactory 产生 sessionsqlSession = sqlSessionFactory.openSession();}@Testpublic void getUserAndRoleAllList(){IUserMapper ium = sqlSession.getMapper(IUserMapper.class);System.out.println(ium.findUserAndRoleAllList());}@Afterpublic  void after(){sqlSession.close();}}

NVN关系角色表的测试类(RoleTest):

/*** NVN关系的角色表的测试类*/
public class RoleTest {SqlSession sqlSession = null;@Beforepublic void before() {//加载 mybatis 配置文件InputStream inputStream = RoleTest.class.getClassLoader().getResourceAsStream("mybatis-Config.xml");//构建sqlSession的工厂SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);//根据 sqlSessionFactory 产生 sessionsqlSession = sqlSessionFactory.openSession();}@Testpublic void getUserAndRoleAllList() {IRoleMapper irm = sqlSession.getMapper(IRoleMapper.class);System.out.println(irm.findRoleAndUserAllList());}@Afterpublic void after() {sqlSession.close();}}

7、NVN关系用户表(角色表)的测试输出结果(因为查询的列都一样,所以结果都一样,只是为了体现双向关系):

DEBUG [main] - ==>  Preparing: SELECT u.`user_id`,u.`user_name`,u.`user_pwd` ,r.`rid`,r.`rname`,r.`rclass` FROM t_user u INNER JOIN t_userrole ur ON u.`user_id`=ur.`user_id` INNER JOIN t_role r ON ur.`rid`=r.`rid` 
DEBUG [main] - ==> Parameters: 
TRACE [main] - <==    Columns: user_id, user_name, user_pwd, rid, rname, rclass
TRACE [main] - <==        Row: b65b57f7-7528-11e8-af2e-80fa5b5015f0, admin, admin, 6f945d11-7e71-11e8-b4a1-80fa5b5015f0, 系统管理员, 第二等级
TRACE [main] - <==        Row: 126af322-752a-11e8-af2e-80fa5b5015f0, CCCCCC, CCCCCC, cc107538-8002-11e8-8235-80fa5b5015f0, 用户, 第三等级
TRACE [main] - <==        Row: 59c73a0e-8000-11e8-8235-80fa5b5015f0, super, super, 27e504e1-8000-11e8-8235-80fa5b5015f0, 超级管理员, 等一等级
DEBUG [main] - <==      Total: 3
[t_user{user_id='b65b57f7-7528-11e8-af2e-80fa5b5015f0', user_name='admin', user_pwd='admin', user_type=0, roleList=[t_role{rid='6f945d11-7e71-11e8-b4a1-80fa5b5015f0', rname='系统管理员', rclass='第二等级', userList=null}]}, t_user{user_id='126af322-752a-11e8-af2e-80fa5b5015f0', user_name='CCCCCC', user_pwd='CCCCCC', user_type=0, roleList=[t_role{rid='cc107538-8002-11e8-8235-80fa5b5015f0', rname='用户', rclass='第三等级', userList=null}]}, t_user{user_id='59c73a0e-8000-11e8-8235-80fa5b5015f0', user_name='super', user_pwd='super', user_type=0, roleList=[t_role{rid='27e504e1-8000-11e8-8235-80fa5b5015f0', rname='超级管理员', rclass='等一等级', userList=null}]}]

 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部