博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mybatis的关联映射案例
阅读量:4878 次
发布时间:2019-06-11

本文共 8370 字,大约阅读时间需要 27 分钟。

主要是对之前学习的关联映射做一个案例,自己动手实践一下,可以理解的更好一点。

开发环境

开发工具:idea

Java环境: jdk1.8.0_121
数据库:SQLServer
项目结构,里面包含了三种关联映射的文件,会分别进行测试:
1240732-20171102153233654-1608749610.png

完整的mybatis-config.xml文件,MybatisUtils工具类和db.properties文件

public class MybatisUtils {    private static SqlSessionFactory sqlSessionFactory = null;    //初始化SqlSessionFactory对象    static {        try {            //使用M主Batis提供的Resources类加载MyBatis的配置文件            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");            //构建SqlSessionFactory工厂            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 获取SqlSession对象的静态方法     * @return     */    public static SqlSession getSession() {        return sqlSessionFactory.openSession();    }}
jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriverjdbc.url=jdbc:sqlserver://localhost:1433;DatabaseName=mybatisjdbc.username=jdbc.password=

一对一案例(模拟人和身份证的关系)

1.创建两张数据表,tb_idcard和tb_person,并插入一些测试数据。

create table tb_idcard(            id int  identity(1,1) PRIMARY key,            code varchar(18),            );insert into tb_idcard values ('321321199403012967');insert into tb_idcard values ('320321188505044526');create table tb_person(            id int  identity(1,1) PRIMARY key,            name varchar(32),        age int,        sex varchar(8),        card_id int UNIQUE,        FOREIGN KEY (card_id) REFERENCES tb_idcard(id));insert into tb_person values ('Rose',29,'女',1);insert into tb_person values ('tom',26,'男',2);

2.创建两个实体类:IdCard和Person

/** * @author mz * @version V1.0 * @Description: 证件持久化类 * @create 2017-11-02 10:12 */public class IdCard {    private Integer id;    private String code;    //省略setter和getter方法}
/** * @author mz * @version V1.0 * @Description: 个人持久化类 * @create 2017-11-02 10:13 */public class Person {    private Integer id;    private String name;    private Integer age;    private String sex;    private IdCard card;   //个人关联的证件   //省略setter和getter方法    }

3.创建IdCardMapper.xml映射文件和PersonMapper.xml映射文件。

IdCardMapper.xml映射文件

PersonMapper.xml映射文件

4.在测试类中添加测试方法

/**     * 嵌套查询     */    @Test    public void findPersonByIdTest() {        //获取SqlSession        SqlSession sqlSession = MybatisUtils.getSession();        //使用MyBatis嵌套查询的方式查询id为1的人的信息        Person person = sqlSession.selectOne("com.ma.mapper.PersonMapper.findPersonById",1);        //输出信息        System.out.println(person);        //关闭SqlSession        sqlSession.close();    }    /**     * 嵌套结果     */    @Test    public void findPersonByIdTest2() {        //获取SqlSession        SqlSession sqlSession = MybatisUtils.getSession();        //使用MyBatis嵌套查询的方式查询id为1的人的信息        Person person = sqlSession.selectOne("com.ma.mapper.PersonMapper.findPersonById2",1);        //输出信息        System.out.println(person);        //关闭SqlSession        sqlSession.close();    }

5.分别运行findPersonByIdTest()和findPersonByIdTest2()的结果如下:

1240732-20171102153928482-2001462291.png
1240732-20171102154007670-363190193.png
从结果来看,嵌套查询要比嵌套结果多执行一条语句,结果是一样的。

一对多案例(模拟用户与订单的关系)

1.新建表tb_user和tb_orders

create table tb_user(            id int  identity(1,1) PRIMARY key,            username varchar(32),        address varchar(256)            );insert into tb_user values ('詹姆斯','克利夫兰');insert into tb_user values ('科比','洛杉矶');insert into tb_user values ('保罗','洛杉矶');create table tb_orders(            id int  identity(1,1) PRIMARY key,            number varchar(32) not null,        user_id int not null,        FOREIGN KEY (user_id) REFERENCES tb_user(id));insert into tb_orders values ('1000011','1');insert into tb_orders values ('1000012','2');insert into tb_orders values ('1000013','3');

2.新建持久化类Orders和User。

public class Orders {    private Integer id;   //订单id    private String number;//订单编号    private List
products;//关联商品集合信息 //省略setter和getter方法}
public class User {    private Integer id;             //用户编号    private String username;        //用户名    private String address;         //用户地址    private List
ordersList;//用户关联的订单 //省略setter和getter方法}

3.新建User|Mapper.xml文件

4.添加测试代码:

/**     * 一对多     */    @Test    public void findUserTest() {        //获取SqlSession        SqlSession sqlSession = MybatisUtils.getSession();        //查询id为1的人的信息        User user = sqlSession.selectOne("com.ma.mapper.UserMapper.findUserWithOrders",1);        //输出信息        System.out.println(user);        //关闭SqlSession        sqlSession.close();    }

5.测试结果:

1240732-20171102154924279-284282663.png

多对多(模拟订单和商品的关系)

1.新建数据表tb_product和tb_ordersitem

create table tb_product(            id int  identity(1,1) PRIMARY key,            name varchar(32),            price float             );insert into tb_product values ('java','44.5');insert into tb_product values ('java web','38.5');insert into tb_product values ('ssm','50');create table tb_ordersitem(            id int identity(1,1) PRIMARY key,            orders_id int,        product_id int,            FOREIGN KEY (orders_id) REFERENCES tb_orders(id),            FOREIGN KEY (product_id) REFERENCES tb_product(id));insert into tb_ordersitem values ('1','1');insert into tb_ordersitem values ('1','3');insert into tb_ordersitem values ('3','3');

2.创建Product持久化类

public class Product {    private Integer id;     //商品id    private String name;    //商品名称    private double price;   //商品单价    private List
orders;//与订单的关联属性 //省略setter和getter方法}

3.创建OrdersMapper.xml和ProductMapper.xml的映射文件

OrdersMapper.xml

ProductMapper.xml

4.添加测试代码

/**     * 多对多     */    @Test    public void findOrdersTest() {        //获取SqlSession        SqlSession sqlSession = MybatisUtils.getSession();        //查询id为1的订单中的商品的信息        Orders orders = sqlSession.selectOne("com.ma.mapper.OrdersMapper.findOrdersWithProduct",1);        //输出信息        System.out.println(orders);        //关闭SqlSession        sqlSession.close();    }    /**     * 多对多     */    @Test    public void findOrdersTest2() {        //获取SqlSession        SqlSession sqlSession = MybatisUtils.getSession();        //查询id为1的订单中的商品的信息        Orders orders = sqlSession.selectOne("com.ma.mapper.OrdersMapper.findOrdersWithProduct2",1);        //输出信息        System.out.println(orders);        //关闭SqlSession        sqlSession.close();    }

5.分别运行findOrdersTest()和findOrdersTest2()的运行结果

1240732-20171102155446232-1582633922.png
1240732-20171102155513170-965371790.png

小结

以上是对Mybatis对关联关系处理的一个实践,代码测试没有问题。

转载于:https://www.cnblogs.com/black-spike/p/7772416.html

你可能感兴趣的文章
Sqoop2搭建及使用
查看>>
Git闪退问题
查看>>
Linux命令
查看>>
Android UI线程和非UI线程
查看>>
hdu 2058
查看>>
【10.26校内测试】【状压?DP】【最小生成树?搜索?】
查看>>
单例模式概念
查看>>
使用主密钥和钱包方法加密数据
查看>>
API测试利器Postman简介
查看>>
简单四则运算表达式的java实现(1)
查看>>
django
查看>>
看paper的网址
查看>>
myna代码
查看>>
条款18 让接口容易使用,不易被误用
查看>>
SpringBoot定时任务
查看>>
获取磁盘空间
查看>>
Chap1 引言[The Linux Command Line]
查看>>
NHibernate 知识点整理
查看>>
linux初级学习笔记二:linux操作系统及常用命令,文件的创建与删除和命名规则,命令行展开以及linux中部分目录的作用!(视频序号:02_3)...
查看>>
HTML5 是什么
查看>>