mybatis注解实现一对一,一对多

项目目录

在这里插入图片描述

导入maven坐标

<!--        mybatis框架-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</version>
        </dependency>

<!--        连接数据库-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.48</version>
        </dependency>

<!--        测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>

创建account表

DROP TABLE IF EXISTS `account`;
CREATE TABLE `account`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(11) NOT NULL,
  `date` datetime NULL DEFAULT NULL,
  `money` float(255, 0) NULL DEFAULT NULL,
  PRIMARY KEY (`id`, `uid`) USING BTREE,
  INDEX `a_uid`(`uid`) USING BTREE,
  CONSTRAINT `a_uid` FOREIGN KEY (`uid`) REFERENCES `user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

INSERT INTO `account` VALUES (1, 1, '2020-04-27 16:25:57', 100);
INSERT INTO `account` VALUES (2, 1, '2020-04-27 16:26:02', 1000);
INSERT INTO `account` VALUES (3, 2, '2020-04-27 16:26:05', 200);
INSERT INTO `account` VALUES (4, 2, '2020-04-27 16:26:08', 2000);

创建user表

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

INSERT INTO `user` VALUES (1, 'aaa');
INSERT INTO `user` VALUES (2, 'bbb');
INSERT INTO `user` VALUES (3, 'ccc');
INSERT INTO `user` VALUES (4, 'ddd');
INSERT INTO `user` VALUES (5, 'eee');

实体类

账户类Acount.java

public class Account {

    private Integer id;
    private Integer uid;
    private Date date;
    private Float money;

    //从表实体应该包含一个主表实体的对象引用
    private User user;

	//Setter
	//Getter
	//toString
}

用户类User.java

public class User {

    private Integer id;
    private String username;
    
    //一对多关系映射:主表方法应该包含一个从表方的集合引用
    private List<Account> accounts;
	
	//Setter
	//Getter
	//toString
}

mybatis配置文件SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

<!--    配置映射信息-->
    <mappers>
        <mapper class="com.cenzn.dao.IUserDao"/>
        <mapper class="com.cenzn.dao.IAccountDao"/>
    </mappers>
</configuration>

常用的注解

@Results相当于mybatis中xml配置中的resultMap(封装一些对象)
  @Many: 用于一对多或多对多查询使用
  @selec:查询用户的唯一标识
  @column:用户根据id查询账户是所需要的参数
  @fetchType:指定延时查询FetchType.LAZY或立即查询FetchType.EAGER

一对一(每个账户只有一个用户)

IAccount.java

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 = "date",property = "date"),
                    @Result(column = "uid",property = "user",
                            one = @One(select = "com.cenzn.dao.IUserDao.findUserById",
                            fetchType = FetchType.LAZY
                           )
                    )
            })
    public List<Account> findAccountAll();
}

IUser.java

public interface IUserDao {

	//根据Id查询用户
    @Select("select * from user  where id =#{uid}")
    @Results(id = "userMap",
            value = {
                    @Result(id = true ,column = "id",property = "id"),
                    @Result(column = "username",property = "name")
            })
    User findUserById(Integer id);
}

测试

    @Test
    public void findAccountTest() throws IOException {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建 SqlSessionFactory 的构建者对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.使用构建者创建工厂对象 SqlSessionFactory
        SqlSessionFactory factory = builder.build(in);
        //4.使用 SqlSessionFactory 生产 SqlSession 对象
        SqlSession session = factory.openSession();
        //5.使用 SqlSession 创建 dao 接口的代理对象
        IAccountDao accountDao = session.getMapper(IAccountDao.class);
        //6.使用代理对象执行查询所有方法
        List<Account> accounts =accountDao.findAccountAll();
        for (Account account : accounts){
            System.out.println("==========每个account的信息=============");
            System.out.println(account);
            System.out.println(account.getUser());
        }
        //7.释放资源
        session.close();
        in.close();
    }

运行结果

在这里插入图片描述

一对多(一个用户可以有多个账户)

IUserDao.java

public interface IUserDao {

    @Select("select * from user")
    @Results(id = "userMap",
            value = {
                    @Result(id = true,column = "id",property = "id"),
                    @Result(column = "username" ,property = "name"),
                    @Result(column = "id",property = "accounts",
                            many = @Many(select = "com.cenzn.dao.IAccountDao.findAccountById",
                                    fetchType = FetchType.LAZY
                            )
                    )
            })
    List<User> findUserAll();
    

IAccountDao.java

public interface IAccountDao {
	
    @Select("select * from account where uid = #{id}")
    public List<Account> findAccountById(Integer id);

测试

    @Test
    public void findUserTest() throws IOException {

        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");

        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

        SqlSessionFactory factory = builder.build(in);

        SqlSession session = factory.openSession(true);

        IUserDao UserDao = session.getMapper(IUserDao.class);

        List<User> users = UserDao.findUserAll();

        for (User user : users){
            System.out.println("---------------------每个用户拥有的账户---------------------");
            System.out.println(user);
            System.out.println(user.getAccounts());
        }
    }

运行结果

在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值