多对一添加操作
场景:现在想要添加一个新客户对应一个新订单,那么要怎么来添加呢?
分析:由于添加订单时,客户对订单是一对多的关系,所以添加订单的时候必须要指明一位客户。
要同时添加新客户以及一个新订单,并且两者是对应关系,那么应当先将客户添加进来,再添加订单,同时这个订单的外键(cust_id)指向了刚刚添加的客户的主键(cust_id)。
CustomerMapper 接口中添加一个方法:
/*保存客户*/
public void insertCustomer(Customer customer);
CustomerMapper 映射文件中,写SQL:
关键点在于将 useGeneratedKeys 设置为 true,然后将 cust_id 赋给添加的对象。
<!--保存客户-->
<insert id="insertCustomer" parameterType="customer"useGeneratedKeys="true"keyColumn="cust_id"keyProperty="cust_id">INSERT INTO `customer` (cust_name,cust_profession,cust_phone,email)VALUES (#{cust_name},#{cust_profession},#{cust_phone},#{email})</insert>
此时可以添加一位新客户,并且我们可以获取它的 id。
public void test3(){SqlSession sqlSession = MybatisUtils.openSession();CustomerMapper customerMapper = sqlSession.getMapper(CustomerMapper.class);OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);Customer customer = new Customer();customer.setCust_name("新客户6666");customer.setCust_phone("666666");customer.setEmail("666@666.com");customer.setCust_profession("新职业666");/*先添加客户 获取客户生成的id 再去添加订单*/customerMapper.insertCustomer(customer);System.out.println(customer);sqlSession.commit();sqlSession.close();}
添加了客户后,我们便可以获取客户生成的 id,然后就可以添加订单。
OrderMapper.java 接口中添加一个新方法:
/*保存订单*/
public void insertOrder(Order order);
OrderMapper.xml 映射文件中添加写 SQL:
<!--保存订单-->
<insert id="insertOrder" parameterType="order">insert into `order` (order_name,order_num,cust_id)values (#{order_name},#{order_num},#{customer.cust_id})
</insert>
测试代码:
public void test3(){SqlSession sqlSession = MybatisUtils.openSession();CustomerMapper customerMapper = sqlSession.getMapper(CustomerMapper.class);OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);Order order = new Order();order.setOrder_name("新订单666");order.setOrder_num("666666666");Customer customer = new Customer();customer.setCust_name("新客户6666");customer.setCust_phone("666666");customer.setEmail("666@666.com");customer.setCust_profession("新职业666");order.setCustomer(customer);/*先添加客户 获取客户生成的id 再去添加订单*/customerMapper.insertCustomer(customer);System.out.println(customer);/*保存订单*/orderMapper.insertOrder(order);sqlSession.commit();sqlSession.close();}
运行效果:先添加了一名新客户,然后添加了一个新订单,并且这个订单指向了新客户。