千家信息网

Mybatis怎样使用@one和@Many实现一对一及一对多关联查询

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,Mybatis怎样使用@one和@Many实现一对一及一对多关联查询,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、准
千家信息网最后更新 2026年11月04日Mybatis怎样使用@one和@Many实现一对一及一对多关联查询

Mybatis怎样使用@one和@Many实现一对一及一对多关联查询,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

    一、准备工作

    1.创建springboot项目,项目结构如下

    2.添加pom.xml配置信息

                        org.mybatis            mybatis            3.4.2                            org.mybatis.spring.boot            mybatis-spring-boot-starter            1.3.0                            mysql            mysql-connector-java            5.1.34            

    3.配置相关信息

    将默认的application.properties文件的后缀修改为".yml",即配置文件名称为:application.yml,并配置以下信息:

    spring:  #DataSource数据源  datasource:    url: jdbc:mysql://localhost:3306/mybatis_test?useSSL=false&    username: root    password: root    driver-class-name: com.mysql.jdbc.Driver#MyBatis配置mybatis:  type-aliases-package: com.mye.hl07mybatis.api.pojo #别名定义  configuration:    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #指定 MyBatis 所用日志的具体实现,未指定时将自动查找    map-underscore-to-camel-case: true #开启自动驼峰命名规则(camel case)映射    lazy-loading-enabled: true #开启延时加载开关    aggressive-lazy-loading: false #将积极加载改为消极加载(即按需加载),默认值就是false    lazy-load-trigger-methods: "" #阻挡不相干的操作触发,实现懒加载    cache-enabled: true #打开全局缓存开关(二级环境),默认值就是true

    二、使用@One注解实现一对一关联查询

    需求:获取用户信息,同时获取一对多关联的权限列表

    1.在MySQL数据库中创建用户信息表(tb_user)

    -- 判断数据表是否存在,存在则删除DROP TABLE IF EXISTS tb_user; -- 创建"用户信息"数据表CREATE TABLE IF NOT EXISTS tb_user(         user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户编号',        user_account VARCHAR(50) NOT NULL COMMENT '用户账号',        user_password VARCHAR(50) NOT NULL COMMENT '用户密码',        blog_url VARCHAR(50) NOT NULL COMMENT '博客地址',        remark VARCHAR(50) COMMENT '备注') COMMENT = '用户信息表'; -- 添加数据INSERT INTO tb_user(user_account,user_password,blog_url,remark) VALUES('拒绝熬夜啊的博客','123456','https://blog.csdn.net/weixin_43296313/','您好,欢迎访问拒绝熬夜啊的博客');

    2.在MySQL数据库中创建身份证信息表(tb_idcard)

    -- 判断数据表是否存在,存在则删除DROP TABLE IF EXISTS tb_idcard; -- 创建"身份证信息"数据表CREATE TABLE IF NOT EXISTS tb_idcard(         id INT AUTO_INCREMENT PRIMARY KEY COMMENT '身份证ID',        user_id INT NOT NULL COMMENT '用户编号',        idCard_code VARCHAR(45) COMMENT '身份证号码') COMMENT = '身份证信息表'; -- 添加数据INSERT INTO tb_idcard(user_id,idCard_code) VALUE(1,'123456789');

    3.创建用户信息持久化类(UserInfo.java)

    @Data@AllArgsConstructor@NoArgsConstructorpublic class UserInfo {    private int userId; //用户编号    private String userAccount; //用户账号    private String userPassword; //用户密码    private String blogUrl; //博客地址    private String remark; //备注    private IdcardInfo idcardInfo; //身份证信息}

    4.创建身份证信息持久化类(IdcardInfo.java)

    @Data@AllArgsConstructor@NoArgsConstructorpublic class IdcardInfo {    public int id; //身份证ID    public int userId; //用户编号    public String idCardCode; //身份证号码}

    5.创建UserMapper接口(用户信息Mapper动态代理接口)

    @Repository@Mapperpublic interface UserMapper {    /**     * 获取用户信息和身份证信息     * 一对一关联查询     */    @Select("SELECT * FROM tb_user WHERE user_id = #{userId}")    @Results(id = "userAndIdcardResultMap", value = {            @Result(property = "userId", column = "user_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER, id = true),            @Result(property = "userAccount", column = "user_account",javaType = String.class, jdbcType = JdbcType.VARCHAR),            @Result(property = "userPassword", column = "user_password",javaType = String.class, jdbcType = JdbcType.VARCHAR),            @Result(property = "blogUrl", column = "blog_url",javaType = String.class, jdbcType = JdbcType.VARCHAR),            @Result(property = "remark", column = "remark",javaType = String.class, jdbcType = JdbcType.VARCHAR),            @Result(property = "idcardInfo",column = "user_id",                    one = @One(select = "com.mye.hl07mybatis.api.mapper.UserMapper.getIdcardInfo", fetchType = FetchType.LAZY))    })    UserInfo getUserAndIdcardInfo(@Param("userId")int userId);     /**     * 根据用户ID,获取身份证信息     */    @Select("SELECT * FROM tb_idcard WHERE user_id = #{userId}")    @Results(id = "idcardInfoResultMap", value = {            @Result(property = "id", column = "id"),            @Result(property = "userId", column = "user_id"),            @Result(property = "idCardCode", column = "idCard_code")})    IdcardInfo getIdcardInfo(@Param("userId")int userId);}

    6.实现实体类和数据表的映射关系

    在SpringBoot启动类中加 @MapperScan(basePackages = "com.mye.hl07mybatis.api.mapper") 注解。

    @SpringBootApplication@MapperScan(basePackages = "com.mye.hl07mybatis.api.mapper")public class Hl07MybatisApplication {    public static void main(String[] args) {        SpringApplication.run(Hl07MybatisApplication.class, args);    }}

    7.编写执行方法,获取用户信息和身份证信息(一对一关联查询)

    @SpringBootTest(classes = Hl07MybatisApplication.class)@RunWith(SpringRunner.class)public class Hl07MybatisApplicationTests {    @Autowired    private UserMapper userMapper;    /**     * 获取用户信息和身份证信息     * 一对一关联查询     * @author pan_junbiao     */    @Test    public void getUserAndIdcardInfo() {        //执行Mapper代理对象的查询方法        UserInfo userInfo = userMapper.getUserAndIdcardInfo(1);        //打印结果        if(userInfo!=null) {            System.out.println("用户编号:" + userInfo.getUserId());            System.out.println("用户账号:" + userInfo.getUserAccount());            System.out.println("用户密码:" + userInfo.getUserPassword());            System.out.println("博客地址:" + userInfo.getBlogUrl());            System.out.println("备注信息:" + userInfo.getRemark());            System.out.println("-----------------------------------------");            //获取身份证信息            IdcardInfo idcardInfo = userInfo.getIdcardInfo();            if(idcardInfo!=null) {                System.out.println("身份证ID:" + idcardInfo.getId());                System.out.println("用户编号:" + idcardInfo.getUserId());                System.out.println("身份证号码:" + idcardInfo.getIdCardCode());            }        }    }}

    执行结果:

    三、使用@Many注解实现一对多关联查询

    需求:获取用户信息,同时获取一对多关联的权限列表

    1.在MySQL数据库创建权限信息表(tb_role)

    -- 判断数据表是否存在,存在则删除DROP TABLE IF EXISTS tb_role; -- 创建"权限信息"数据表CREATE TABLE IF NOT EXISTS tb_role(         id INT AUTO_INCREMENT PRIMARY KEY COMMENT '权限ID',        user_id INT NOT NULL COMMENT '用户编号',        role_name VARCHAR(50) NOT NULL COMMENT '权限名称') COMMENT = '权限信息表'; INSERT INTO tb_role(user_id,role_name) VALUES(1,'系统管理员'),(1,'新闻管理员'),(1,'广告管理员');

    2.创建权限信息持久化类(RoleInfo.java)

    @Data@AllArgsConstructor@NoArgsConstructorpublic class RoleInfo {    private int id; //权限ID    private int userId; //用户编号    private String roleName; //权限名称}

    3.修改用户信息持久化类(UserInfo.java),添加权限列表的属性字段

    @Data@AllArgsConstructor@NoArgsConstructorpublic class UserInfo {    private int userId; //用户编号    private String userAccount; //用户账号    private String userPassword; //用户密码    private String blogUrl; //博客地址    private String remark; //备注    private IdcardInfo idcardInfo; //身份证信息    private List roleInfoList; //权限列表}

    4.编写用户信息Mapper动态代理接口(UserMapper.java)

    /** * 获取用户信息和权限列表 * 一对多关联查询 * @author pan_junbiao */@Select("SELECT * FROM tb_user WHERE user_id = #{userId}")@Results(id = "userAndRolesResultMap", value = {        @Result(property = "userId", column = "user_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER, id = true),        @Result(property = "userAccount", column = "user_account",javaType = String.class, jdbcType = JdbcType.VARCHAR),        @Result(property = "userPassword", column = "user_password",javaType = String.class, jdbcType = JdbcType.VARCHAR),        @Result(property = "blogUrl", column = "blog_url",javaType = String.class, jdbcType = JdbcType.VARCHAR),        @Result(property = "remark", column = "remark",javaType = String.class, jdbcType = JdbcType.VARCHAR),        @Result(property = "roleInfoList",column = "user_id", many = @Many(select = "com.pjb.mapper.UserMapper.getRoleList", fetchType = FetchType.LAZY))})public UserInfo getUserAndRolesInfo(@Param("userId")int userId); /** * 根据用户ID,获取权限列表 * @author pan_junbiao */@Select("SELECT * FROM tb_role WHERE user_id = #{userId}")@Results(id = "roleInfoResultMap", value = {        @Result(property = "id", column = "id"),        @Result(property = "userId", column = "user_id"),        @Result(property = "roleName", column = "role_name")})public List getRoleList(@Param("userId")int userId);

    5.编写执行方法,获取用户信息和权限列表(一对多关联查询)

    /**     * 获取用户信息和权限列表     * 一对多关联查询     * @author pan_junbiao     */    @Test    public void getUserAndRolesInfo() {        //执行Mapper代理对象的查询方法        UserInfo userInfo = userMapper.getUserAndRolesInfo(1);        //打印结果        if(userInfo!=null) {            System.out.println("用户编号:" + userInfo.getUserId());            System.out.println("用户账号:" + userInfo.getUserAccount());            System.out.println("用户密码:" + userInfo.getUserPassword());            System.out.println("博客地址:" + userInfo.getBlogUrl());            System.out.println("备注信息:" + userInfo.getRemark());            System.out.println("-----------------------------------------");            //获取权限列表            List roleInfoList = userInfo.getRoleInfoList();            if(roleInfoList!=null && roleInfoList.size()>0) {                System.out.println("用户拥有的权限:");                for (RoleInfo roleInfo : roleInfoList) {                    System.out.println(roleInfo.getRoleName());                }            }        }    }

    执行结果:

    四、FetchType.LAZY 和 FetchType.EAGER的区别

    FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载。

    FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。

    看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

    用户 信息 权限 身份 身份证 数据 关联 查询 博客 数据表 一对一 地址 备注 密码 数据库 账号 配置 方法 结果 代理 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 博彦科技互联网金融 华服互联网科技怎么样 互联网科技公司的优势 腾讯阿里互联网科技 金融科技创新监管互联网金融 致骋互联网科技 天下捷融互联网科技 互联网科技视频素材 上海亿帐通互联网科技 老年人脱离互联网科技的作文 荆州市昕露互联网络科技有限公司 成都互联网科技公司工作好不好 速维有品互联网信息科技(苏州)有限公司 银川新华互联网科技学校联系电话 本届互联网博览会上的黑科技 萌小萌互联网科技河南有限公司 互联网科技接地气 版纳互联网科技选哪家 中国互联网公司的科技投入 互联网企业和网络科技有限公司 百单网互联网科技有限公司怎么样 互联网佳科技有限公司 互联网下的科技发展 广州凡科互联网科技 唐信互联网科技 大连 畅思互联网科技 云鲸互联网络科技有限公司 盐城市攀科互联网科技有限公司 互联网科技大佬云集 广州全民伙伴互联网科技有限公司
    0