主要是对之前学习的关联映射做一个案例,自己动手实践一下,可以理解的更好一点。
开发环境
开发工具:idea
Java环境: jdk1.8.0_121 数据库:SQLServer 项目结构,里面包含了三种关联映射的文件,会分别进行测试:完整的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()的结果如下:
从结果来看,嵌套查询要比嵌套结果多执行一条语句,结果是一样的。一对多案例(模拟用户与订单的关系)
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 Listproducts;//关联商品集合信息 //省略setter和getter方法}
public class User { private Integer id; //用户编号 private String username; //用户名 private String address; //用户地址 private ListordersList;//用户关联的订单 //省略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.测试结果:
多对多(模拟订单和商品的关系)
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 Listorders;//与订单的关联属性 //省略setter和getter方法}
3.创建OrdersMapper.xml和ProductMapper.xml的映射文件
OrdersMapper.xmlProductMapper.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()的运行结果
小结
以上是对Mybatis对关联关系处理的一个实践,代码测试没有问题。