mybatis11(注解实现多对多的查询)

注:不再写多对多的动态sql,可参考之前的动态sql文章

 

1.User的javabean

package com.bean;

import java.util.List;

public class User {
 private int id;
 private String username;
 private String loginname;
 private String password;
 private String phone;
 private String address;
 private List<Order> orders;
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
 public String getLoginname() {
  return loginname;
 }
 public void setLoginname(String loginname) {
  this.loginname = loginname;
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
 public String getPhone() {
  return phone;
 }
 public void setPhone(String phone) {
  this.phone = phone;
 }
 public String getAddress() {
  return address;
 }
 public void setAddress(String address) {
  this.address = address;
 }
 public List<Order> getOrders() {
  return orders;
 }
 public void setOrders(List<Order> orders) {
  this.orders = orders;
 }
 @Override
 public String toString() {
  return "User [id=" + id + ", username=" + username + ", loginname=" + loginname + ", password=" + password
    + ", phone=" + phone + ", address=" + address + "]";
 }
}

2.Order的javabean

 

package com.bean;

import java.util.List;

public class Order {



 private int id;
 private String code;
 private double total;
 private User user;
 private List<Article> articles;
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getCode() {
  return code;
 }
 public void setCode(String code) {
  this.code = code;
 }
 public double getTotal() {
  return total;
 }
 public void setTotal(double total) {
  this.total = total;
 }
 public User getUser() {
  return user;
 }
 public void setUser(User user) {
  this.user = user;
 }
 public List<Article> getArticles() {
  return articles;
 }
 public void setArticles(List<Article> articles) {
  this.articles = articles;
 }
 @Override
 public String toString() {
  return "Order [id=" + id + ", code=" + code + ", total=" + total + "]";
 }
}

 

 

 

 

3.Article的javabean

package com.bean;

public class Article {

 private int id;
 private String name;
 private double price;
 private String remark;
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public double getPrice() {
  return price;
 }
 public void setPrice(double price) {
  this.price = price;
 }
 public String getRemark() {
  return remark;
 }
 public void setRemark(String remark) {
  this.remark = remark;
 }
 @Override
 public String toString() {
  return "Article [id=" + id + ", name=" + name + ", price=" + price + ", remark=" + remark + "]";
 }
}

 

4.log4j.properties

# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.mapper=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

 

 

5.jdbc.properties(对一些变量的设置)

 

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mybatis
username=root
password=123456

 

 

 

 

6.mybatis配置文件

 

 


 

<?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">
   
    <!--1.配置环境 ,默认的环境id为mysql-->
 <configuration>
 
  <!-- 导入 jdbc.properties 引用里面的值-->
  <properties resource="jdbc.properties"/>
  <!-- 1.指定mybatis所用日志的具体实现 -->
  <settings>
   <setting name="logImpl" value="LOG4j"/>
  </settings>
  <!--2.配置环境 ,默认的环境id为mysql-->
  <environments default="mysql">
   <!--2.2.配置id为mysql的数据库环境 -->
   <environment id="mysql">
    <!-- 2.2.1使用JDBC的事务管理   使用了JDBC的提交和回滚设置-->
    <transactionManager type="JDBC"></transactionManager>
    <!--2.2.2数据库连接池   POOLED是JDBC连接对象的数据源连接池的实现 -->
    <dataSource type="POOLED">
     <property name="driver" value="${driver}"/>
     <property name="url" value="${url}"/>
     <property name="username" value="${username}"/>
     <property name="password" value="${password}"/>
    </dataSource>
   </environment>
  </environments>
  
  <!--3.配置Mapper的位置 -->
  <mappers>
   <mapper class="com.mapper.userMapper"/>
   <mapper class="com.mapper.orderMapper"/>
   <mapper class="com.mapper.articleMapper"/>
  </mappers>
 </configuration>

 

 

7.数据库操作的类(userMapper)

package com.mapper;

import org.apache.ibatis.annotations.Select;

import com.bean.User;

public interface userMapper {

 @Select("select * from tb_user where id=#{id}")
 User selectUser(int id);
}

8.数据库操作的类(orderMapper

package com.mapper;

import static org.junit.Assert.assertTrue;

import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;

import com.bean.Order;

public interface orderMapper {

 @Select("select * from tb_order where id=#{id}")
 @Results({
  @Result(id=true,property="id",column="id"),
  @Result(property="code",column="code"),
  @Result(property="total",column="total"),
  @Result(column="user_id",property="user",
  one=@One(select="com.mapper.userMapper.selectUser",fetchType=FetchType.EAGER)),
  @Result(column="id",property="articles",
  many=@Many(select="com.mapper.articleMapper.seleceArticle",fetchType=FetchType.LAZY))
 })
 Order selectByUserId(int i);
}

 

 

 

9.数据库操作的类(articleMapper

package com.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Select;

import com.bean.Article;

public interface articleMapper {

 @Select("select * from tb_article where id in(select article_id from tb_item where order_id=#{id})")
 List<Article> seleceArticle(int order_id);
}

 

 

 

 

10.查询

package com.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.tools.ant.types.CommandlineJava.SysProperties;
import org.junit.Test;

import com.bean.Article;
import com.bean.Order;
import com.bean.User;
import com.mapper.orderMapper;

public class test {

 @Test
 public void selectByUserId() throws IOException
 {
  InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
  SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  SqlSession session = sessionFactory.openSession();
  orderMapper ordermapper=session.getMapper(orderMapper.class);
  Order order=ordermapper.selectByUserId(2);
  System.out.println(order);
  User user=order.getUser();
  System.out.println(user);
  List<Article> articles=order.getArticles();
  articles.forEach(article->System.out.println(article));
 }
}

 

mybatis中,一对多查询可以使用注解实现。具体步骤如下: 1. 定义实体类 定义一个实体类,该实体类包含一个一对多的关联关系,如下所示: ```java public class Order { private Long id; private Date createTime; private List<OrderItem> orderItems; // 一对多关联关系 // getter和setter方法省略 } public class OrderItem { private Long id; private Long orderId; private String productName; private Integer quantity; // getter和setter方法省略 } ``` 2. 创建Mapper接口 创建一个Mapper接口,并使用注解定义一对多查询语句,如下所示: ```java public interface OrderMapper { @Select("select * from order where id = #{id}") @Results({ @Result(property = "id", column = "id"), @Result(property = "createTime", column = "create_time"), @Result(property = "orderItems", column = "id", many = @Many(select = "com.example.OrderItemMapper.findByOrderId")) }) Order findById(Long id); } public interface OrderItemMapper { @Select("select * from order_item where order_id = #{orderId}") List<OrderItem> findByOrderId(Long orderId); } ``` 在上面的注解中,@Results定义了查询结果的映射关系,@Result用于映射查询结果中的字段到实体类中的属性。@Many注解用于定义一对多关联关系,指定了查询OrderItem的方法,以及通过哪个字段进行关联。 3. 调用Mapper接口 在业务逻辑中调用Mapper接口,并传入查询参数,如下所示: ```java Order order = orderMapper.findById(1L); System.out.println(order.getId() + " " + order.getCreateTime()); for (OrderItem item : order.getOrderItems()) { System.out.println(item.getId() + " " + item.getProductName() + " " + item.getQuantity()); } ``` 通过调用OrderMapper的findById方法,可以查询到指定id的Order对象及其关联的OrderItem对象列表。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值