Mybatis注解方式实现一对一,一对多的关联查询

Step1 创建数据库表

使用Mysql WorkBench创建数据库表ssm20191229test,并创建table:user,book,addrss,如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Step2 创建maven工程

创建maven工程:mybatis20190103oneToOne,完整的结构目录如下:
在这里插入图片描述

Step3 配置pom.xml和mybatis.xml

pom.xml代码如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mybatis</groupId>
  <artifactId>mybatis20190102oneToOne</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <build>
    <plugins>
         <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-compiler-plugin</artifactId> 
               <version>3.8.0</version>             
         	   
         	   <configuration>                
                 <source>10</source>     
                 <target>10</target>   
    		   </configuration>      
         </plugin> 
      </plugins>
  </build>
  
  <dependencies>
  <!-- com.mybatis.pomModule是作者之前创建的一个模板jar,其集成了SSM框架的全部jar包 ,详情参考
  项目[解决maven项目中pom.xml添加依赖文件的繁琐操作的办法](https://mp.csdn.net/mdeditor/85336803#)-->
  	<dependency>
  		<groupId>com.mybatis</groupId>
 		<artifactId>pomModule</artifactId>
 		<version>0.0.1-SNAPSHOT</version>
  	</dependency>
  </dependencies>
</project>

mybatis.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="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.cj.jdbc.Driver" />
				<property name="url" 
				value="jdbc:mysql://localhost/ssm20181229test?useSSL=false&amp;serverTimezone=UTC&amp;allowPublicKeyRetrieval=true" />
				<property name="username" value="root" />
				<property name="password" value="123456" />
			</dataSource>
		</environment>
	</environments>

	<mappers>
		<!-- 在xml配置下使用resource来指定xml文件 -->
		<!-- <mapper resource="UserMapper.xml" /> -->
		
		<!-- 注解配置下,使用class来指定Mapper类 -->
		<mapper class="com.cr.mapper.UserMapper"/>
		<mapper class="com.cr.mapper.AddressMapper"/>
		<mapper class="com.cr.mapper.BookMapper"/>
	</mappers>

</configuration>

Step4 创建pojo类

User.java

package com.cr.pojo;

import java.util.List;

public class User {
	private int userId;
	private String userName;
	private String userPassword;
	private int userAge;
	private String userEmail;
	private Address userAddress;
	private List<Book> books;
	
	public List<Book> getBooks() {
		return books;
	}

	public void setBooks(List<Book> books) {
		this.books = books;
	}

	public Address getAddress() {
		return userAddress;
	}

	public void setAddress(Address address) {
		this.userAddress = address;
	}

	public int getUserAge() {
		return userAge;
	}

	public void setUserAge(int userAge) {
		this.userAge = userAge;
	}

	public String getUserEmail() {
		return userEmail;
	}

	public void setUserEmail(String userEmail) {
		this.userEmail = userEmail;
	}

	public int getUserId() {
		return userId;
	}

	public void setUserId(int userId) {
		this.userId = userId;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getUserPassword() {
		return userPassword;
	}

	public void setUserPassword(String userPassword) {
		this.userPassword = userPassword;
	}
}

Address.java

package com.cr.pojo;

/**  
* <p>Title: Address.java</p>  
* <p>Description: </p>  
* <p>Copyright: Copyright (c) 2019</p>  
* <p>Company:uestc</p>  
* @author ChenRan  
* @date 2019年1月2日  
* @version 1.0  
*/
public class Address 
{
	private int addressId;
	private String province;
	private String city;

	public int getAddressId() {
		return addressId;
	}

	public void setAddressId(int addressId) {
		this.addressId = addressId;
	}

	public String getProvince() {
		return province;
	}

	public void setProvince(String province) {
		this.province = province;
	}

	public String getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}
	
	public String toString()
	{
		return this.province+this.city;
	}
}

Book.java

package com.cr.pojo;

public class Book 
{
	private int bookId;
	private String bookName;
	private int totalPage;
	private int price;

	public int getBookId() {
		return bookId;
	}

	public void setBookId(int bookId) {
		this.bookId = bookId;
	}

	public String getBookName() {
		return bookName;
	}

	public void setBookName(String bookName) {
		this.bookName = bookName;
	}

	public int getTotalPage() {
		return totalPage;
	}

	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}

	public int getPrice() {
		return price;
	}
	
	public void setPrice(int price) {
		this.price = price;
	}
}

Step5 创建mapper类

UserMapper.java

package com.cr.mapper;

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.cr.pojo.User;

public interface UserMapper
{
	
	//one to one 
	@Select("select * from user where userId = #{userId}")
	@Results({
		@Result(id=true,column="userId",property="userId"),
		@Result(column="userName",property="userName"),
		@Result(column="userPassword",property="userPassword"),
		@Result(column="userAge",property="userAge"),
		@Result(column="userEmail",property="userEmail"),
		@Result(column="userId",property="userAddress",one=@One(select="com.cr.mapper.AddressMapper.getAddressByUserId",fetchType= FetchType.EAGER))
})
	public User getUserById(int userId);
	
	//one to many
	@Select("select * from user where userId=#{userId}")
	@Results({
		@Result(id=true,column="userId",property="userId"),
		@Result(column="userName",property="userName"),
		@Result(column="userPassword",property="userPassword"),
		@Result(column="userAge",property="userAge"),
		@Result(column="userEmail",property="userEmail"),
		@Result(column="userId",property="books",many=@Many(select="com.cr.mapper.BookMapper.getBooksByUserId",fetchType= FetchType.EAGER))
	})
	public User getUserAndBooksById(int userId);
}

AddressMapper.java

package com.cr.mapper;

import org.apache.ibatis.annotations.Select;

import com.cr.pojo.Address;
public interface AddressMapper 
{
	@Select("select * from address where userId=#{userId}")
	public Address getAddressByUserId(int userId);
}

BookMapper.java

package com.cr.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Select;

import com.cr.pojo.Book;
public interface BookMapper 
{	
	@Select("select * from book where userId = #{userId}")
	public List<Book> getBooksByUserId(int userId);
}

Step6 创建测试类

oneToOne.java

package com.cr.test;

import java.io.Reader;

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 com.cr.mapper.UserMapper;
import com.cr.pojo.User;

public class OneToOne 
{
	 private static SqlSessionFactory sqlSessionFactory;
	    private static Reader reader;
	    

	    static {
	        try {
	            reader = Resources.getResourceAsReader("mybatis.xml");
	            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	    }

	    public static SqlSessionFactory getSession() {
	        return sqlSessionFactory;
	    }

	    public static void main(String[] args) 
	    {
	    	test(4);
	    }
	    
	    //测试模块
	    private static void test(int userId) 
	    {	
	    	 SqlSession session = sqlSessionFactory.openSession();
		        try 
		        {
		        	UserMapper userMapper = session.getMapper(UserMapper.class);
		        	User user = userMapper.getUserById(userId);
		        	if(user != null)
		        	{
		        		printUser(user);
		        	}
		        	else
		        	{
		        		System.out.println("userId为"+userId+"的用户不存在!可能未创建或者已经被删除。");
		        	}

		        } 
		        finally 
		        {
		            session.close();
		        }
	    }
	    //输出用户信息
	    private static void printUser(User user)
	    {
	    	System.out.println("用户id:"+user.getUserId()+"\n姓名:"
		        	+user.getUserName()+"\n年龄:"+user.getUserAge()
		        	+"\n邮箱:"+user.getUserEmail()+"\n地址:"+user.getAddress().toString());
	    }
	    
}

oneToMany.java

package com.cr.test;

import java.io.Reader;
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 com.cr.mapper.UserMapper;
import com.cr.pojo.Book;
import com.cr.pojo.User;

/**  
* <p>Title: oneToMany.java</p>  
* <p>Description: </p>  
* <p>Copyright: Copyright (c) 2019</p>  
* <p>Company:uestc</p>  
* @author ChenRan  
* @date 2019年1月2日  
* @version 1.0  
*/
public class oneToMany 
{
	 private static SqlSessionFactory sqlSessionFactory;
	    private static Reader reader;
	    

	    static {
	        try {
	            reader = Resources.getResourceAsReader("mybatis.xml");
	            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	    }

	    public static SqlSessionFactory getSession() {
	        return sqlSessionFactory;
	    }

	    /**
	     * @param args
	     */
	    public static void main(String[] args) 
	    {
	    	test(5);
	    }
	    
	    private static void test(int userId) 
	    {
	    	SqlSession session = sqlSessionFactory.openSession();
	        try 
	        {
	        	UserMapper userMapper = session.getMapper(UserMapper.class);
	        	User user = userMapper.getUserAndBooksById(userId);
	        	if(user != null)
	        	{
	        		
	        		printUserAndBooks(user);
	        	}
	        	else
	        	{
	        		System.out.println("userId为"+userId+"的用户不存在!可能未创建或者已经被删除。");
	        	}

	        } 
	        finally 
	        {
	            session.close();
	        }
	    }
	    
	    private static void printUserAndBooks(User user)
	    {	
	    	System.out.println("用户id:"+user.getUserId()+"\n姓名:"
		        	+user.getUserName()+"\n年龄:"+user.getUserAge()
		        	+"\n邮箱:"+user.getUserEmail());
	    	List<Book> books = user.getBooks();
	    	String messsage = "喜欢的书籍:";
	    	for(Book book:books)
	    	{
	    		messsage = messsage+book.getBookName()+" ";
	    	}
	    	System.out.println(messsage);
	    }
}

结语

测试结果如下:
运行oneToOne.java:
在这里插入图片描述
运行oneToMany.java:
在这里插入图片描述
时间关系,写的比较简略。(2019.01.03)

  • 15
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
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对象列表。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值