MyBatis学习(三)
一对一查询
1、一个角色只能属于一部动漫,下面是通过查询角色信息,关联查询所属动漫信息的案例来学习mybaits中的一对一关系映射。
2、通过resultType实现查询角色信息,关联查询所属动漫信息,使用resultType测试案例
- 建表sql
--自增长生成主键 DROP TABLE IF EXISTS t_role;CREATE TABLE t_role(id INT(5) NOT NULL AUTO_INCREMENT COMMENT '角色id',role_name VARCHAR(150) COMMENT '角色姓名',note VARCHAR(150) COMMENT '角色备注',comic_id INT(5) NOT NULL COMMENT'动漫id',PRIMARY KEY (id),FOREIGN KEY(comic_id) REFERENCES t_comic(id) );INSERT INTO t_role( role_name, note, comic_id) VALUES ("Saber","fate stay night",1); INSERT INTO t_role( role_name, note, comic_id) VALUES ("鸣人","火影忍者",2); INSERT INTO t_role( role_name, note, comic_id) VALUES ("佐助","火影忍者",2); INSERT INTO t_role( role_name, note, comic_id) VALUES ("赤丸","火影忍者",2); INSERT INTO t_role( role_name, note, comic_id) VALUES ("兜","火影忍者",2); INSERT INTO t_role( role_name, note, comic_id) VALUES ("鹿丸","火影忍者",2); INSERT INTO t_role( role_name, note, comic_id) VALUES ("萨博","海贼王",3);--uuid生成主键 DROP TABLE IF EXISTS t_role;CREATE TABLE t_role(id VARCHAR(36) NOT NULL COMMENT '角色id' ,role_name VARCHAR(150) COMMENT '角色姓名',note VARCHAR(150) COMMENT '角色备注',comic_id INT(5) NOT NULL COMMENT'动漫id',PRIMARY KEY (id),FOREIGN KEY(comic_id) REFERENCES t_comic(id) );INSERT INTO t_role( role_name, note, comic_id) VALUES ("Saber","fate stay night",1); INSERT INTO t_role( role_name, note, comic_id) VALUES ("鸣人","火影忍者",2); INSERT INTO t_role( role_name, note, comic_id) VALUES ("佐助","火影忍者",2); INSERT INTO t_role( role_name, note, comic_id) VALUES ("赤丸","火影忍者",2); INSERT INTO t_role( role_name, note, comic_id) VALUES ("兜","火影忍者",2); INSERT INTO t_role( role_name, note, comic_id) VALUES ("鹿丸","火影忍者",2); INSERT INTO t_role( role_name, note, comic_id) VALUES ("萨博","海贼王",3);--comic表DROP TABLE IF EXISTS t_comic;CREATE TABLE t_comic(id INT(5) NOT NULL AUTO_INCREMENT COMMENT '动漫id',comic_name VARCHAR(150) COMMENT '动漫名称' ,remark VARCHAR(150) COMMENT '动漫备注',PRIMARY KEY (id) );INSERT INTO t_comic(comic_name) VALUES ( 'fate stay night'); INSERT INTO t_comic(comic_name) VALUES ( '火影忍者'); INSERT INTO t_comic(comic_name) VALUES ( '海贼王');
角色表中comic_id 外键对应的是动漫表中的主键,一个角色只能属于一部动漫,角色到动漫是一对一的关系。
- 查询sql
SELECT t_role.id , t_role.role_name AS roleName, t_role.comic_id AS comicId, t_role.note, t_comic.comic_name AS comicName, t_comic.remark FROM t_role , t_comic WHERE t_role.comic_id = t_comic.id
使用resultType得保证字段名和列名保持一致,如果不一致需要使用别名的方式来完成映射
- POJO类
角色类:
package ecut.association.po;import java.io.Serializable;public class Role implements Serializable {private static final long serialVersionUID = -4663460700843152533L;private Integer id;private String roleName;private String note;private Integer comicId;private Comic comic;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getRoleName() {return roleName;}public void setRoleName(String roleName) {this.roleName = roleName;}public String getNote() {return note;}public void setNote(String note) {this.note = note;}public Integer getComicId() {return comicId;}public void setComicId(Integer comicId) {this.comicId = comicId;}public Comic getComic() {return comic;}public void setComic(Comic comic) {this.comic = comic;}@Overridepublic String toString() {String s = "\n"+"角色信息:id =" + id + ",roleName =" + roleName + ", note = " + note+", comicId = " + comicId;s=s+";"+"动漫信息:"+"id="+comic.getId()+",comicName="+comic.getComicName()+",remark="+comic.getRemark();return s;}}
RoleComic类:
package ecut.association.po;public class RoleComic extends Role {private static final long serialVersionUID = -6089413956387774208L;private String comicName;private String remark;public String getComicName() {return comicName;}public void setComicName(String comicName) {this.comicName = comicName;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}@Overridepublic String toString() {String s = "\n"+"角色信息:id =" + getId() + ",roleName =" + getRoleName() + ", note = " + getNote()+", comicId = " + getComicId();s=s+";"+"动漫信息:"+"comicName="+comicName+",remark="+remark;return s;} }
将上边sql查询的结果映射到pojo中,pojo中必须包括所有查询列名。原始的Role.java不能映射全部字段,需要新创建的pojo。创建 一个pojo继承包括查询字段较多的po类。
- 映射文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 注意:使用mapper代理方法开发,namespace有特殊重要的作用--><mapper namespace="ecut.association.mapper.RoleMapperComic"><sql id="base">t_role.id , t_role.role_name AS roleName, t_role.comic_id AS comicId, t_role.note, t_comic.comic_name AS comicName, t_comic.remark </sql><!-- 查询角色关联查询动漫信息,使用resultType --><select id="findRoleComicsByResultType" resultType="RoleComic">SELECT <include refid="base"/>FROM t_role , t_comic <where>t_role.comic_id = t_comic.id</where></select></mapper>
通过取别名的方式使其字段名和属性名保持一致
- 接口
package ecut.association.mapper;import java.util.List;import ecut.association.po.Role; import ecut.association.po.RoleComic;public interface RoleMapperComic {//查询角色信息,关联查询所属动漫信息,使用resultTypepublic List<RoleComic> findRoleComicsByResultType() throws Exception ;}
mapper.java接口中的方法名和mapper.xml中statement的id一致
mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致
mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致
- 测试类
package ecut.association.test;import java.io.IOException; import java.io.InputStream; import java.util.List;import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test;import ecut.association.mapper.RoleMapperComic; import ecut.association.po.Role; import ecut.association.po.RoleComic;public class ComicMapperTest {private SqlSessionFactory factory;@Beforepublic void init() throws IOException {String resource = "ecut/association/mybaits-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactoryBuilder builer =new SqlSessionFactoryBuilder();factory = builer.build(inputStream);}@Testpublic void testFindRoleComicsByResultType() throws Exception {SqlSession session = factory.openSession();RoleMapperComic mapper = session.getMapper(RoleMapperComic.class);List<RoleComic> roleComics = mapper.findRoleComicsByResultType();System.out.println(roleComics);}}
3、通过resultMap实现查询角色信息,关联查询所属动漫信息,使用resultType测试案例
- 在Role中添加Comic属性
动漫类:
package ecut.association.po;import java.io.Serializable;public class Comic implements Serializable {private static final long serialVersionUID = -3674954993814032572L;private Integer id;private String comicName;private String remark;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getComicName() {return comicName;}public void setComicName(String comicName) {this.comicName = comicName;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}}
角色类:
package ecut.association.po;import java.io.Serializable;public class Role implements Serializable {private static final long serialVersionUID = -4663460700843152533L;private Integer id;private String roleName;private String note;private Integer comicId;private Comic comic;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getRoleName() {return roleName;}public void setRoleName(String roleName) {this.roleName = roleName;}public String getNote() {return note;}public void setNote(String note) {this.note = note;}public Integer getComicId() {return comicId;}public void setComicId(Integer comicId) {this.comicId = comicId;}public Comic getComic() {return comic;}public void setComic(Comic comic) {this.comic = comic;}@Overridepublic String toString() {String s = "\n"+"角色信息:id =" + id + ",roleName =" + roleName + ", note = " + note+", comicId = " + comicId;s=s+";"+"动漫信息:"+"id="+comic.getId()+",comicName="+comic.getComicName()+",remark="+comic.getRemark();return s;}}
使用resultMap将查询结果中的角色信息映射到Role对象中,在Role类中添加Comic属性,将关联查询出来的动漫信息映射到角色对象中的comic属性中。
- 映射文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 注意:使用mapper代理方法开发,namespace有特殊重要的作用--><mapper namespace="ecut.association.mapper.RoleMapperComic"><!-- 用户查询关联动漫的resultMap将整个查询的结果映射到中ecut.association.po.Role--><resultMap type="Role" id="RoleComicResultMap"><!-- 配置映射的角色信息 --><!-- id:指定查询列中的唯 一标识,角色信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个idcolumn:角色信息的唯 一标识 列property:角色信息的唯 一标识 列所映射到Role中哪个属性--><id column="id" property="id"/><result column="role_name" property="roleName"/><result column="comic_id" property="comicId"/><result column="note" property="note"/><!-- 配置映射的关联的动漫信息 --><!-- association:用于映射关联查询单个对象的信息property:要将关联查询的动漫信息映射到Role中哪个属性--><association property="comic" javaType="Comic"><!-- id:关联查询动漫的唯 一标识column:指定唯 一标识动漫信息的列javaType:映射到Comic的哪个属性--><id column="comic_id" property="id"/><result column="comic_name" property="comicName"/><result column="remark" property="remark"/> </association></resultMap><!-- 查询角色关联查询动漫信息 ,使用resultMap--><select id="findRoleComicsByResultMap" resultMap="RoleComicResultMap">SELECT t_role.*,t_comic.id AS comic_id , t_comic.comic_name , t_comic.remarkFROM t_role , t_comic <where>t_role.comic_id = t_comic.id</where></select></mapper>
使用association标签映射关联查询单个对象的信息,其中property是要将关联查询的动漫信息映射到Role中哪个属性,javaType是属性对应的POJO类
- 接口类
package ecut.association.mapper;import java.util.List;import ecut.association.po.Role; import ecut.association.po.RoleComic;public interface RoleMapperComic {//查询角色信息,关联查询所属动漫信息,使用resultMappublic List<Role> findRoleComicsByResultMap() throws Exception ;}
- 测试类
package ecut.association.test;import java.io.IOException; import java.io.InputStream; import java.util.List;import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test;import ecut.association.mapper.RoleMapperComic; import ecut.association.po.Role; import ecut.association.po.RoleComic;public class ComicMapperTest {private SqlSessionFactory factory;@Beforepublic void init() throws IOException {String resource = "ecut/association/mybaits-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactoryBuilder builer =new SqlSessionFactoryBuilder();factory = builer.build(inputStream);}@Testpublic void testFindRoleComicsByResultMap() throws Exception {SqlSession session = factory.openSession();RoleMapperComic mapper = session.getMapper(RoleMapperComic.class);List<Role> roleComics = mapper.findRoleComicsByResultMap();System.out.println(roleComics);}}
4、两种方式实现一对一总结
- resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。如果没有查询结果的特殊要求建议使用resultType。
- resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。
- resultMap可以实现延迟加载,resultType无法实现延迟加载。
一对多查询
1、一个动漫有多个角色,下面是通过查询动漫信息,关联查询角色信息的案例来学习mybaits中的一对多关系映射。
2、使用resultMap测试案例
- sql语句
SELECT * from t_comic ,t_role WHERE t_role.comic_id = t_comic.id
- POJO类
package ecut.association.po;import java.io.Serializable; import java.util.List;public class Comic implements Serializable {private static final long serialVersionUID = -3674954993814032572L;private Integer id;private String comicName;private String remark;private List<Role> roles;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getComicName() {return comicName;}public void setComicName(String comicName) {this.comicName = comicName;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}public List<Role> getRoles() {return roles;}public void setRoles(List<Role> roles) {this.roles = roles;}}
在Comic类中添加List角色属性
- 映射文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 注意:使用mapper代理方法开发,namespace有特殊重要的作用--><mapper namespace="ecut.association.mapper.RoleMapperComic"><resultMap type="Comic" id="ComicResultMap"><id column="id" property="id"/><result column="comic_name" property="comicName"/><result column="remark" property="remark"/></resultMap><!-- 动漫明细信息一个动漫关联查询出了多歌角色,要使用collection进行映射collection:对关联查询到多条记录映射到集合对象中property:将关联查询到多条记录映射到ecut.association.po.Comic哪个属性ofType:指定映射到list集合属性中pojo的类型--><resultMap type="Comic" extends="ComicResultMap" id="ComicsResultMap"><!-- 使用extends继承,不用在中配置动漫信息的映射 --><collection property="roles" ofType="Role"><!-- id:角色唯 一标识property:要将角色的唯 一标识 映射到Role类的哪个属性--><id column="role_id" property="id"/><result column="role_name" property="roleName"/><result column="comic_id" property="comicId"/><result column="note" property="note"/></collection></resultMap><!--查询动漫信息。关联查询动漫中的角色,使用resultMap--><select id="findComics" resultMap="ComicsResultMap">SELECT t_comic.*,t_role.id AS role_id, t_role.role_name, t_role.note ,t_role.comic_id FROM t_comic, t_role<where>t_role.comic_id = t_comic.id</where></select></mapper>
collection:对关联查询到多条记录映射到集合对象中,可以在resultMap中使用extends继承可以减少配置
接口类
package ecut.association.mapper;import java.util.List;import ecut.association.po.Comic; import ecut.association.po.Role; import ecut.association.po.RoleComic;public interface RoleMapperComic {//查询动漫信息。关联查询动漫中的角色public List<Comic> findComics() throws Exception ;}
- 测试类
package ecut.association.test;import java.io.IOException; import java.io.InputStream; import java.util.List;import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test;import ecut.association.mapper.RoleMapperComic; import ecut.association.po.Comic; import ecut.association.po.Role; import ecut.association.po.RoleComic;public class ComicMapperTest {private SqlSessionFactory factory;@Beforepublic void init() throws IOException {String resource = "ecut/association/mybaits-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactoryBuilder builer =new SqlSessionFactoryBuilder();factory = builer.build(inputStream);}@Testpublic void testFindComics() throws Exception {SqlSession session = factory.openSession();RoleMapperComic mapper = session.getMapper(RoleMapperComic.class);List<Comic> comics = mapper.findComics();for(Comic c : comics){String s = "动漫信息:id="+c.getId()+",comicName="+c.getComicName()+",remark="+c.getRemark();System.out.println(s);for(Role r:c.getRoles()){System.out.println("角色信息:id =" + r.getId() + ",roleName =" + r.getRoleName() + ", note = " + r.getNote()+", comicId = " + r.getComicId());} System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~");}}}
3、小结
- mybatis使用resultMap的collection对关联查询的多条记录映射到一个list集合属性中。
- 使用resultType实现:将角色映射到动漫中的roles中,需要自己处理,使用双重循环遍历,去掉重复记录,将角色信息放在roles中。
多对多查询
1、一个动漫有多个角色,一个角色只有一个配音演员,因此动漫到配音演员是一对多
一个配音演员可以配多个角色,一个角色只能属于一部动漫,因此配音演员到动漫是一对多
综上所述动漫和配音演员是多对多的关系,下面是通过查询动漫信息,关联查询动漫中的角色及配音演员信息的案例来学习mybaits的多对多查询
2、多对多测试案例
- 建表sql语句
--dubber表 DROP TABLE IF EXISTS t_dubber;CREATE TABLE t_dubber(id INT(5) NOT NULL AUTO_INCREMENT COMMENT '配音演员id',dubber_name VARCHAR(150) COMMENT '配音演员姓名',role_id INT(5) NOT NULL COMMENT'角色id',PRIMARY KEY (id),FOREIGN KEY(role_id) REFERENCES t_role(id) );INSERT INTO t_dubber( dubber_name, role_id) VALUES ("川澄绫子",1); INSERT INTO t_dubber( dubber_name, role_id) VALUES ("竹内顺子",2); INSERT INTO t_dubber( dubber_name, role_id) VALUES ("杉山纪彰",3); INSERT INTO t_dubber( dubber_name, role_id) VALUES ("竹内顺子",4); INSERT INTO t_dubber( dubber_name, role_id) VALUES ("神奈延年",5); INSERT INTO t_dubber( dubber_name, role_id) VALUES ("神奈延年",6); INSERT INTO t_dubber( dubber_name, role_id) VALUES ("竹内顺子",7);
配音演员中有角色id是外键对应角色表中的id,一个配音演员可以配多个角色,比如竹内顺子,一个动漫可以有多个配音演员比如火影忍者
- 查询sql
SELECT t_comic.*,t_role.id AS role_id, t_role.role_name, t_role.note ,t_role.comic_id ,t_dubber.id AS dubber_id , t_dubber.dubber_name ,t_dubber.role_id AS dubber_role_id FROM t_comic, t_role,t_dubber WHERE t_role.id = t_dubber.role_id AND t_role.comic_id = t_comic.id
- POJO类
角色类
package ecut.association.po;import java.io.Serializable;public class Role implements Serializable {private static final long serialVersionUID = -4663460700843152533L;private Integer id;private String roleName;private String note;private Integer comicId;private Comic comic;private Dubber dubber;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getRoleName() {return roleName;}public void setRoleName(String roleName) {this.roleName = roleName;}public String getNote() {return note;}public void setNote(String note) {this.note = note;}public Integer getComicId() {return comicId;}public void setComicId(Integer comicId) {this.comicId = comicId;}public Comic getComic() {return comic;}public void setComic(Comic comic) {this.comic = comic;}public Dubber getDubber() {return dubber;}public void setDubber(Dubber dubber) {this.dubber = dubber;}@Overridepublic String toString() {String s = "\n"+"角色信息:id =" + id + ",roleName =" + roleName + ", note = " + note+", comicId = " + comicId;s=s+";"+"动漫信息:"+"id="+comic.getId()+",comicName="+comic.getComicName()+",remark="+comic.getRemark();return s;}}
配音演员类:
package ecut.association.po;import java.io.Serializable;public class Dubber implements Serializable{private static final long serialVersionUID = -7436845097720592214L;private Integer id;private String dubberName;private Integer roleId;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getDubberName() {return dubberName;}public void setDubberName(String dubberName) {this.dubberName = dubberName;}public Integer getRoleId() {return roleId;}public void setRoleId(Integer roleId) {this.roleId = roleId;}}
- 映射文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 注意:使用mapper代理方法开发,namespace有特殊重要的作用--><mapper namespace="ecut.association.mapper.RoleMapperComic"><resultMap type="Comic" id="ComicDubberResultMap"><id column="id" property="id"/><result column="comic_name" property="comicName"/><result column="remark" property="remark"/><collection property="roles" ofType="Role"><!-- id:角色唯 一标识property:要将角色的唯 一标识 映射到Role类的哪个属性--><id column="role_id" property="id"/><result column="role_name" property="roleName"/><result column="comic_id" property="comicId"/><result column="note" property="note"/><association property="dubber" javaType="Dubber"><id column="dubber_id" property="id"/><result column="dubber_name" property="dubberName"/><result column="dubber_role_id" property="roleId"/> </association></collection></resultMap><!--查询动漫信息。关联查询动漫中的角色的配音演员信息,使用resultMap--><select id="findComicsAndDubber" resultMap="ComicDubberResultMap">SELECT t_comic.*,t_role.id AS role_id, t_role.role_name, t_role.note ,t_role.comic_id ,t_dubber.id AS dubber_id , t_dubber.dubber_name ,t_dubber.role_id AS dubber_role_id FROM t_comic, t_role,t_dubber<where>t_role.id = t_dubber.role_id AND t_role.comic_id = t_comic.id</where></select></mapper>
将动漫信息映射到Comic中。
在Comic类中添加角色列表属性List<Role> roles,将动漫角色映射到roles中
在Role中添加Dubber属性,将角色所对应的配音演员映射到dubber中
- 接口类
package ecut.association.mapper;import java.util.List;import ecut.association.po.Comic; import ecut.association.po.Role; import ecut.association.po.RoleComic;public interface RoleMapperComic {//查询动漫信息。关联查询动漫中的角色及配音演员信息public List<Comic> findComicsAndDubber() throws Exception ;}
- 测试类
package ecut.association.test;import java.io.IOException; import java.io.InputStream; import java.util.List;import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test;import ecut.association.mapper.RoleMapperComic; import ecut.association.po.Comic; import ecut.association.po.Role; import ecut.association.po.RoleComic;public class ComicMapperTest {private SqlSessionFactory factory;@Beforepublic void init() throws IOException {String resource = "ecut/association/mybaits-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactoryBuilder builer =new SqlSessionFactoryBuilder();factory = builer.build(inputStream);}@Testpublic void testFindComicsAndDubber() throws Exception {SqlSession session = factory.openSession();RoleMapperComic mapper = session.getMapper(RoleMapperComic.class);List<Comic> comics = mapper.findComicsAndDubber();for(Comic c : comics){String s = "动漫信息:id="+c.getId()+",comicName="+c.getComicName()+",remark="+c.getRemark();System.out.println(s);for(Role r:c.getRoles()){System.out.println("角色信息:id =" + r.getId() + ",roleName =" + r.getRoleName() + ", note = " + r.getNote()+", comicId = " + r.getComicId());System.out.println("配音演员信息:id =" + r.getDubber().getId()+ ",dubberName =" + r.getDubber().getDubberName() + ", roleId = " + r.getDubber().getRoleId());}System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~");}}}
3、总结
- 一对多是多对多的特例
- 使用resultMap是针对那些对查询结果映射有特殊要求的功能,,比如特殊要求映射成list中包括 多个list。
resultType 和 resultMap总结
1、resultType
- 作用:将查询结果按照sql列名pojo属性名一致性映射到pojo中。
- 场合:常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。
2、resultMap:
- 使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求)。
- association:
作用: 将关联查询信息映射到一个pojo对象中。
场合:为了方便查询关联信息可以使用association将关联订单信息映射为用户对象的pojo属性中,比如:查询角色及关联动漫信息。
使用resultType无法将查询结果映射到pojo对象的pojo属性中,根据对结果集查询遍历的需要选择使用resultType还是resultMap。
- collection:
作用:将关联查询信息映射到一个list集合中。
场合:为了方便查询遍历关联信息可以使用collection将关联信息映射到list集合中,如果使用resultType无法将查询结果映射到list集合中。
转载请于明显处标明出处
https://www.cnblogs.com/AmyZheng/p/9374126.html
转载于:https://www.cnblogs.com/AmyZheng/p/9374126.html
MyBatis学习(三)相关推荐
- MyBatis学习总结(三)
MyBatis学习总结(三) 之前对数据库的增删改查是基于XML实现的,现在要基于注解实现. 1 .定义SQL映射接口 这个是我的项目目录 创建一个接口UserMapperI接口 package co ...
- 学习Mybatis第三天
学习Mybatis第三天 1. 日志 1.1 日志工厂 如果一个数据库操作出现了异常,我们需要排错,日志就是最好的助手了! 曾今:sout,debug 现在:日志工厂 SLF4J LOG4J [掌握] ...
- 【转】MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
[转]MyBatis学习总结(四)--解决字段名与实体类属性名不相同的冲突 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体 ...
- 事务中mybatis通过id查不到但是通过其他条件可以查到_40打卡 MyBatis 学习
第57次(mybatis) 学习主题:mybatis 学习目标: 1 掌握框架的概念 2 掌握mybatis环境搭建 对应视频: http://www.itbaizhan.cn/course/id/8 ...
- MyBatis学习随记
1 Mybatis入门 1.1 单独使用jdbc编程问题总结 1.1.1 jdbc程序 Public static void main(String[] args) { Conn ...
- Mybatis学习笔记(一) —— mybatis介绍
一.Mybatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名 ...
- MyBatis多参数传递之混合方式——MyBatis学习笔记之十五
在本系列文章的<MyBatis多参数传递之Map方式示例>一文中,网友mashiguang提问如下的方法如何传递参数:public List findStudents(Map condit ...
- Java框架学习笔记--Mybatis学习
一.Mybatis学习 1.Mybatis简介 简介:Mybatis开源免费框架.原名叫iBatis,2010在googlecode,2013年迁移到github2 作用:数据访问层框架.底层是对JD ...
- MyBatis学习笔记2 ——第一个MyBatis程序
MyBatis学习笔记2 --第一个MyBatis程序 参考教程B站狂神https://www.bilibili.com/video/BV1NE411Q7Nx 环境搭建 建立一个mybatis数据库用 ...
- 【应用篇】MyBatis学习笔记
MyBatis学习笔记 一 环境配置 1 什么是MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的 JDBC 代码和参 ...
最新文章
- 空气球+操作系统,海尔智能家居雄心何在?
- Genome Biology:人体各部位微生物组时间序列分析
- 与粉丝们互动,街头霸王乐队带来AR应用《Gorillaz》
- 大家在寻找的高级程序员到底是什么样子的?
- 第一个JDK 10(18.3)候选版本(内部版本43)展示了新的版本控制方案
- mysql grant usage on_grant 权限 on 数据库对象 to 用户
- php create()方法,ThinkPHP中create()方法自动验证实例
- 清华大学镜像_国内开源镜像站信息盘点
- 【漫画】AI小猪的一生
- Java任务调度之Quartz快速入门
- 从零开始学前端:函数 --- 今天你学习了吗?(JS:Day8)
- 最近wampserver总是开不开,一直离线,重启就好,各位有何看法?
- python post json参数,Python requests.post方法中data与json参数区别详解
- access统计行数 vb_VB代码行数统计工具
- win10 删除右键显卡菜单项
- 【转】一个女孩的上海5年
- python多线程模块threading学习笔记(5)之锁Lock
- 科研论文配色参考【不断更新】
- python爬虫使用session保持登录状态
- uniapp微信小程序更新提醒