精华内容
下载资源
问答
  • 在之前的总结mybatis多表查询(xml方式)的博客中,已经对多表查询做了一定的介绍,而且总结了基于xml的mybatis多表查询,一些通用的技术点可以翻阅上一篇博客。这次我们总结基于注解的mybatis多表查询。多对多查询...

    总结mybatis多表查询(注解方式)

    前言

    在之前的总结mybatis多表查询(xml方式)的博客中,已经对多表查询做了一定的介绍,而且总结了基于xml的mybatis多表查询,一些通用的技术点可以翻阅上一篇博客。这次我们总结基于注解的mybatis多表查询。多对多查询的xml和注解方式我会再写个博客。

    数据库表及关系

    为了方便查看,这里再次给出user和account表
    在这里插入图片描述
    在这里插入图片描述

    一对多查询

    首先和xml方式一样,我们要在User实体类中添加List accounts的集合成员变量,表示一对多映射关系,主表实体含有从表实体的集合引用。

    public class User implements Serializable {
        private Integer id;
        private String username;
        private String address;
        private String sex;
        private Date birthday;
        //一对多映射关系,主表实体含有从表实体的集合引用
        private List<Account> accounts;
    
        public List<Account> getAccounts() {
            return accounts;
        }
    
        public void setAccounts(List<Account> accounts) {
            this.accounts = accounts;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", username='" + username + '\'' +
                    ", address='" + address + '\'' +
                    ", sex='" + sex + '\'' +
                    ", birthday=" + birthday +
                    '}';
        }
    }
    

    由于采用注解方式,所以我们不需要再配置xml,直接在dao接口中进行注解。
    可以发现其实注解进行封装映射配置和xml配置非常类似,注解和xml标签可以对应上。

    public interface IUserDao {
        /**
         * 查询所有用户并携带账户信息
         *
         * @return
         */
        //select注解用于查询操作,内容为查询语句
        @Select("select * from user")
        //用于封装user
        @Results(id = "userMap",value = {
                //id表示主键
                @Result(id = true,column = "id",property = "id"),
                @Result(column = "username",property = "username"),
                @Result(column = "address",property = "address"),
                @Result(column = "sex",property = "sex"),
                @Result(column = "birthday",property = "birthday"),
                //定义一对多的关系映射,实现对account的封装
                //        @Many注解用于一对多或多对多查询使用
                //        select属性指定内容:查询用户的唯一标识
                //        column属性指定内容:用户根据id查询账户是所需要的参数
                //        fetchType属性指定内容:指定延时查询FetchType.LAZY或立即查询FetchType.EAGER
                @Result(property = "accounts",column = "id",many = @Many(select = "com.cc.dao.IAccountDao.findByUid",fetchType = FetchType.LAZY))
        })
        List<User> findAll();
          /**
         * 根据id查询
         *
         * @param id
         * @return
         */
        @Select("select * from user where id = #{id}")
        User findById(Integer id);
    }
    

    这里对注解详细说明一下
    @select注解,我们需要查询时用到的注解,里面放查询语句。我们可以点开源码看一下,它只有一个value属性,所以我们不需要写属性名。

    在这里插入图片描述
    可以发现我们注解配置查询语句相比于xml配置简单了很多,这是为什么?
    我们画张图来解释一下,见图就懂。
    在这里插入图片描述

    @Results注解,这个注解其实功能相当于xml配置中的resultMap标签,我们也可以点开源码看一下。id相当于resultMap的id标签,@result注解相当于resultMap下的result标签。

    在这里插入图片描述

    最后@result注解,属性和result标签很类似,这里说明两个属性。@one和@many,其实也就相当于association标签和collection标签,表示一对一和一对多映射。

    在这里插入图片描述
    点开@one注解和@many注解发现属性都是一样的。
    select属性指定内容:查询用户的唯一标识
    fetchType属性指定内容:指定延时查询FetchType.LAZY或立即查询FetchType.EAGER。还有一个默认FetchType.DEFAULT,默认是立即查询。
    在这里插入图片描述
    然后我们就可以测试了,测试代码和结果和总结mybatis多表查询(xml方式)博客中的一样,这里就不再给出了。

    多对一及一对一查询

    和xml配置一样,首先我们在account实体类中加入user成员变量表示一对一映射。

    public class Account implements Serializable {
        private Integer id;
        private Integer uid;
        private Double money;
        //从表实体应该包含一个主表实体的对象引用
        private User user;
    
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public Integer getUid() {
            return uid;
        }
    
        public void setUid(Integer uid) {
            this.uid = uid;
        }
    
        public Double getMoney() {
            return money;
        }
    
        public void setMoney(Double money) {
            this.money = money;
        }
    
        @Override
        public String toString() {
            return "Account{" +
                    "id=" + id +
                    ", uid=" + uid +
                    ", money=" + money +
                    '}';
        }
    }
    
    

    然后配置在accountDao接口中注解,注解解释在上面已经给出。

    public interface IAccountDao {
        /**
         * 查询所有账户,并携带用户信息
         * @return
         */
        @Select("select * from account")
        @Results(id = "accountMap",value = {
                @Result(id = true,column = "id",property = "id"),
                @Result(column = "uid",property = "uid"),
                @Result(column = "money",property = "money"),
                @Result(property = "user",column = "uid",one = @One(select = "com.cc.dao.IUserDao.findById",fetchType = FetchType.EAGER))
        })
        List<Account> findAll();
    
        /**
         * 根据用户id查询账户
         * @param uid
         * @return
         */
    
        @Select("select * from account where uid = #{uid}")
        List<Account> findByUid(Integer uid);
    }
    
    

    测试当然也是相同,这里也不再给出,大家可以点开头连接。

    展开全文
  • 基于Mapper代理配置Mybatis多表查询的一对一映射(三种方式) 一、mybatis多表联查使用内连接 1、两表联查中一对一关系对于POJO的体现(截图忽略了get,set方法)   2、编写对应的PaperMapper接口和在同目录下创建...

    基于Mapper代理配置Mybatis多表查询的一对一映射(三种方式)


    一、mybatis多表联查使用内连接


    1、两表联查中一对一关系对于POJO的体现(截图忽略了get,set方法)

       


    2、编写对应的PaperMapper接口和在同目录下创建对应sql映射文件PaperMapper.xml

    注意:

    这里我们在mybatis总配置里设置包扫描


    <mappers>
    <!-- 自动扫描指定包中的sql映射文件 -->
    <package name="com.ashes.mapper"/>
    </mappers>


    (批量加载mapper 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载 

    遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中 

    上边规范的前提是:使用的是mapper代理方法)




    (1)mapper接口类名和mapper.xml映射文件名称保持一致,且namespace的值习惯上是包名家接口名


      


    (2)Paper:方法返回值类型,对应select标签的resultMap,我们可以通过rm(自定义)找到对应id为rm的

    resultMap,它的type的类型就是我们的Paper对应的POJO,因此找到我们的返回值类型

    (3)getPaper:方法名,对应select标签的id,这里使用了代理模式,我们需要保证Mapper接口方法名和

    Mapper.xml中定义的每个statement的id相同

    (4)int pid: 参数,对应select标签中的parameterType的Integer




    3、补充:


    (1)<![CDATA[xxxxxx]]>:将标签内容当文本输出

    (2)resultMap中的type:将查询结果映射到指定的POJO中

    (3)id:指定查询列中的唯 一标识,订单信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个id

    (4)property:订单信息的唯 一标识列所映射到POJO的Paper中哪个属性

    (5)column:订单信息的唯 一标识 列(数据库)

    (6)association:用于映射关联查询单个对象的信息 property:要将关联查询的学生信息映射到Paper中哪个属性

    (7)javaType:对应学生信息的POJO


    4、测试





    二、mybatis多表联查使用嵌套查询,执行多个sql操作(涉及延迟加载知识,后续讲解)


    1、编写新的方法,规范如上



    (1)通过rm2找到id为rm2的resultMap,可以看看(4)type是我们需要的返回类型

    (2)resultMap执行到association时,通过select值getStu找到对应id为getStu的select的sql语句,我们可以看到resultType(3)是我们在association中需要的返回值类型




    2、测试




    注意:如果我们使用延迟加载(可以提高我们的效率)


    (1)使用延迟加载


     (此处只有一条sql语句执行)


    但是我们用延迟加载的时候需要做一个重要配置



    Mybatis的检索策略:


    1、立即检索:在对象的关联查询中,查询一方的数据,会立即检索关联方的数据(属于默认的检索策略)

    2、延迟检索(懒加载):在对象的关联查询,查询一方数据,不会立即检索关联方数据,只有等到访问关联方对象的属性时,才发送sql语句去查询


    (2)不使用延迟加载


     (不使用延迟加载就会一次执行两条sql)

    内连接的使用会涉及笛卡尔积,效率不够高,一般建议使用嵌套查询,使用延迟加载


    三、mybatis多表联查使用resultType


      


    使用Map存储,resultType的值为hashmap,接口的方法返回值为Map,得到的结果集存入map中,

    其中key是数据库的列名,value是数据库查询出的信息。




    展开全文
  • 题目:使用Mybatis,使用XML方式查询表中数据(一对,在原来单的基础上修改) 单表查询操作链接 一、思路: 思路(实体类+实体类映射文件+mybatis主配置文件+测试类): 我们的目标是要通过一条sql语句,把两张...

    题目:使用Mybatis,使用XML方式查询表中数据(一对多,在原来单表的基础上修改)
    单表查询操作链接

    一、思路:

    思路(实体类+实体类映射文件+mybatis主配置文件+测试类):
    我们的目标是要通过一条sql语句,把两张表里面的数据查询出来。

    第一:改造我们的实体类
    1、给Person类加个集合属性,该集合的数据类型为Food类类型
    2、实体类要实现序列化接口(Serializable)
    3、Food实体类多了一个Person类类型的属性

    第二:写person的实体类映射文件
    1、特别注意:以前我们写的select元素的返回值类型是单个实体类类型,而现在改成了自定义返回值类型,用resultMap表示。resultType改成resultMap。
    2、然后再自定义resultMap的内容。
    定义resultMap里面的内容是重点,务必掌握

    第三:主配置文件里面多了一项Food实体类的别名配置

    第四:编写测试类,把查询的结果打印输出显示

    二、实际操作

    第一步:在原来单表的基础上,再创建一张数据表,名字为food;该表具有4个字段,分别是整形的id;整形的pid;varchar类型的fname;varchar类型的taste。

    Create table food(id int,pid int,name varchar(10),taste varchar(10));

    Insert into food(id,pid,name,taste) values(1,17,‘苹果’,‘甜味’);
    //添加多个
    在这里插入图片描述

    第二步:在原来单表的基础上,在bean包下面新建一个Food类,该类的属性和创建表的字段一致。并给他们get、set方法。
    注意:1、给Person类加个集合属性,该集合的数据类型为Food类类型
    2、实体类要实现序列化接口(Serializable)
    3、Food实体类多了一个Person类类型的属性
    在这里插入图片描述
    在这里插入图片描述

    第三步:配置personMapper.xml文件。
    1、注意:以前我们写的select元素的返回值类型是单个实体类类型,而现在改成了自定义返回值类型,用resultMap表示。resultType改成resultMap。
    2、然后再自定义resultMap的内容。

    在这里插入图片描述

    第四步:配置personConfig.xml主配置文件(主配置文件里面多了一项Food实体类的别名配置)
    在这里插入图片描述

    第五步:更改测试类
    在这里插入图片描述

    结果:
    在这里插入图片描述

    总结:定义resultMap里面的内容是重点,务必掌握(有兴趣的同学可去多学习)

    展开全文
  • mybatis多表查询返回map类型

    千次阅读 2018-03-23 14:09:36
    mybatis进行多表查询时,...-- 查询多表返回类型为map --&gt; &lt;select id="list" parameterType="User" resultType="map"&gt; SELECT u.uid, u.role_id, m.mid, ...

    mybatis进行多表查询时,返回的结果为map而不是某个实体类的时候,如下:

    <!-- 查询多表返回类型为map -->
    <select id="list" parameterType="User" resultType="map">
        SELECT
            u.uid,
            u.role_id,
            m.mid,
            m.mname,
            r.role_id,
            r.mid,
            r.iden
        FROM
            user u
        LEFT JOIN role r ON u.role_id = r.role_id
        LEFT JOIN module m ON r.mid = m.mid
        WHERE
            u.uid = #{uid}
    </select>

    DAO中的成员方法:

    public List<Map<String, Object>> list(User user, "findListMap");

    对返回的List

    @Test
    public void listMap() {
        User user = new User();
        user.setUid(1);
        List<Map<String, Object>> listMap = testService.listMap(user, "findListMap");
        for (Map<String, Object> map : listMap) {
            Set<String> set = map.keySet();
            Iterator<String> it = set.iterator();
            while (it.hasNext()) {
                Object key = it.next();
                Object value = map.get(key);
                System.out.println(value);
           }
        }
    }

    参考:
    http://blog.csdn.net/cydbetter/article/details/79074064
    https://blog.csdn.net/lxxxzzl/article/details/43604481
    https://blog.csdn.net/GensingU/article/details/74856351
    https://blog.csdn.net/chenluyao_it/article/details/78747859

    展开全文
  • Mybatis多表关联查询之三表查询

    万次阅读 2018-08-01 21:09:15
    在开发中经常用到多表查询,这里演示三表查询的情况。 业务逻辑:购物车订单的逻辑 该逻辑共涉及到三张表 1. order表 就是订单表 记录 订单人的信息、订单地址、订单号、订单的总价, 一条订单记录可能会有多个...
  • mybatis或者tkmybatis里,有没有比较方便(不对xml进行修改)的连查询? 如果有?怎么操作?查询两张,或者查询多张表? 求解!!
  • Mybatis多表联合查询?

    2019-08-31 17:24:39
    这种情况用Mybatis怎么查询 ![图片说明](https://img-ask.csdn.net/upload/201908/31/1567243452_884066.png) ![图片说明](https://img-ask.csdn.net/upload/201908/31/1567243435_812218.png)
  • MyBatis Plus 实现多表分页查询

    万次阅读 多人点赞 2019-07-08 17:25:52
    接口帮我们定义了很多常用的方法,但这些都是 T 对象有用,如果涉及到 多表查询,还是需要自定义Vo 对象和自己编写sql 语句,Mybatis Plus提供了一个Page 对象,查询是需要设置其中的 size 字段 和 current 字段的...
  • MyBatis 多表连接查询

    万次阅读 2018-06-03 16:56:23
    多表连接的两种方式(数据库逻辑模型): 1.一对一关系 2.一对多关系 一、通过 resultMap 和 association 实现一对一关系 在 mapper.xml 文件里面的代码: &lt;resultMap type="...
  • 第一张表 app id app_type 5 2 ...输入参数为5,查询到app_type, 然后在第二张表中根据app_type 2查询他的app_name, ...同时也要加上app_type为0的app_name,...怎样根据参数联表查询然后还要加上app_type为0的内容?
  • mybatis多表关联查询 返回类型map

    千次阅读 2019-01-14 10:35:01
    &lt;!-- 根据异型产品id和制单人筛选出制单人下过的异型产品订单号和库存数量 --&gt; &lt;select id="selectOrderNoByPIdAndSP" resultType="java.util.Map"... SELECT o.order_no ...
  • MyBatis表查询操作——XML

    千次阅读 2018-11-20 20:40:25
    题目:使用Mybatis,使用XML方式查询表中数据 一、思路: 实体类+实体映射文件+mybatis主配置文件+测试类 提示1:实体类的名字和表名保持一致(首字母大写);实体类里面定义的属性和的字段保持一致;给实体类里面...
  • MyBatis 多表联合查询及优化

    千次阅读 2016-07-08 18:03:05
    下面就来说一下 mybatis 是通过什么来实现多表联合查询的。首先看一下表关系,如图: 这里,我已经搭好了开发的环境,用到的是 SpringMVC + Spring + MyBatis,当然,为了简单期间,你可以不用搭前端的框架,只...
  • Mybatis多表查询

    千次阅读 多人点赞 2017-11-21 21:58:45
    多表查询一直是数据库的关键部分。网上关于Mybatis的例子天华龙凤,又要自己新建实体类,又在一个实体类中将另一个实体类联系起来,在我看来大可不必,只要将sql查询结果的视图映射到Java里面即可。下面举一个例子来...
  • Mybatis表查询并且分页

    千次阅读 2021-03-23 20:26:48
    一个person有个cat 实体类就这么写 1. 实体类 Person实体类 @Data public class Person implements Serializable { private static final long serialVersionUID = -70682701290685641L; private Integer ...
  • mybatis分页多表查询

    千次阅读 2017-12-08 14:36:01
    mybatis分页多表查询 我们常遇到一种情况,数据量比较大,如果使用前台分页,在前台如果有权限,有逻辑判断,都会大大降低页面加载的速度,我们需要分页,单表查询的网上方法很多,这里就不赘余了,多表关联查询的...
  • MyBatis多表联合查询resultType的返回值

    千次阅读 2020-05-22 16:33:03
    from t_car_car </select> 多表联合查询:t_car_car 、t_car_driver、 t_car_cardriver t_car_cardriver存放的两个字段分别是t_car_car和t_car_driver的主键id 解决方案: 1.resultType的返回类型是java.util.Map,...
  • mybatis plus 多表查询

    千次阅读 2019-01-27 12:12:45
    mybatis plus的mapper.xml貌似是和mybatis一模一样的,可以使用mybatis plus自动生成的mapper.xml和mapper接口 本demo是springboot结合mybatis plus,IDE是idea。 本文的前提是你已经可以生成代码,并且测试生成...
  • 就一张,INDUS对应个THEME,每个THEME对应个LABEL,每个Label对应个KPI,求帮忙了,谢谢,我只要大概的思路 项目的框架用的Springmvc +myBatis java的Service层怎么给集合排序,MyBatis的xml怎么写sql呢,...
  • 实现的是角色、权限、以及角色权限关联的三连接查询 三张表如下 角色: 权限: 角色权限关联: 实体类如下 此处省略掉其他字段 角色实体类: /** * <p>角色ID 主键自增</p> */ ...
  • Mybatis 条件查询(模糊查询 使用in查询
  • MybatisMyBatis 实现多表查询

    万次阅读 2019-09-04 08:47:07
    一、MyBatis 实现多表查询 Mybatis 实现多表查询方式 1.1 业务装配.对两个表编写单表查询语句,在业务(Service)把查询的两个结果进行关联. 1.2 使用Auto Mapping 特性,在实现两表联合查询时通过别名完成映射. ...
  • 主要介绍了Mybatis基于注解实现多表查询功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
  • Mybatis表查询,返回结果封装为Map

    万次阅读 2017-06-15 15:26:58
    在SSM的项目中,数据的持久化操作都...在我们需要进行连表查询时,需要传入的参数可能不止一个,这个时候我们将参数封装至一个自定义的对象,或者存储到一个Map之中,查询结果同样可以封装至一个自定义的对象或者Map。
  • 使用MyBatis写的一对关联映射查询的web,在eclipse上写的,使用的Mysql进行数据连接,内含数据库脚本,直接导入数据库即可建数据库和建表,不用再编写,非常方便
  • MyBatis多条件查询

    千次阅读 2017-12-30 00:00:00
    1.MyBatis多条件查询1.1:使用实体类 将参数封装成对象接口:public List getUserListByUser(User user);Mapper映射文件:select * from smbms_user where username like CONCAT('%',#{userName},'%') and userRole=...
  • mybatis多表进行连接查询(left join)

    万次阅读 2016-07-25 16:26:53
    由于需求,遇到一个问题,商品在查询的时候不仅仅能按照自己的商品名字去查询,还要能够根据所属的商店进行条件的查询 。 1.数据库中有两张,shop 和product,shop的主键作为product的外键, 2.在mybatis中链接...
  • mybatis的配置文件中加上这句代码后,post的id和name,被正常的赋予了null值,而不是错误的employee的值了。 然而还是不对啊,这里employee为空,查询返回的post应该是null才对,而不是返回一个属性都是空的...
  • mybatis多表联合查询

    万次阅读 2018-12-05 19:23:05
    mybatis多表联合查询 假如我们有一个员工表和员工所在部门表,那么员工表的部门ID外键部门表的部门ID,那么在mybatis这样的持久层框架中,它是在底层自动的对数据库数据进行封装成对应的实体类对象,那如何在展示...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 235,819
精华内容 94,327
关键字:

mybatis多表查询