首页 数据库 mysql教程 mybatis“集合嵌套查询”和“集合嵌套结果”两种方法实现数据库

mybatis“集合嵌套查询”和“集合嵌套结果”两种方法实现数据库

Jun 07, 2016 pm 04:12 PM
mybatis 实现 嵌套 数字 方法 查询 结果 集合

两个实体类分别如下:User用户类和Goods商品类。一个用户对应多个商品(一对多) package com.leo.entity;import java.util.List;public class User {private Integer id;private String username;private Integer age;private String address;private ListG

两个实体类分别如下:User用户类和Goods商品类。一个用户对应多个商品(一对多)

package com.leo.entity;

import java.util.List;
public class User {
	private Integer id;
	private String username;
	private Integer age;
	private String address;
	private List<Goods> goodsList;

	public List<Goods> getGoodsList() {
		return goodsList;
	}
	public void setGoodsList(List<Goods> goodsList) {
		this.goodsList = goodsList;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", age=" + age
				+ ", address=" + address + ", goodsList=" + goodsList + "]";
	}
	
	
	
	
	
}

登录后复制
Goods商品类

package com.leo.entity;

public class Goods {
	private Integer id;
	private String goodsName;
	private Integer goodsNumber;
	private Integer user_id;
	
	
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getGoodsName() {
		return goodsName;
	}
	public void setGoodsName(String goodsName) {
		this.goodsName = goodsName;
	}
	public Integer getGoodsNumber() {
		return goodsNumber;
	}
	public void setGoodsNumber(Integer goodsNumber) {
		this.goodsNumber = goodsNumber;
	}
	public Integer getUser_id() {
		return user_id;
	}
	public void setUser_id(Integer user_id) {
		this.user_id = user_id;
	}
	
	
	
	
}
登录后复制

User实体类的mapper映射文件:UserDao.xml

<?xml version="1.0" encoding="UTF-8" ?>   
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">   
	<mapper namespace="com.leo.mapper.UserDao">		
		<resultMap type="User"  id="userMap">
			<id column="u_id" property="id" />
			<result column="username" property="username" />
			<result column="age" property="age" />
			<result column="address" property="address" />
			<!--当表之间的关系是一对多时,用 collection-->			<!-- 这里的 column="u_id"是为了传参数到嵌套的查询select="....."-->
			<collection property="goodsList" ofType="Goods" column="u_id" select="com.leo.mapper.GoodsDao.selectGoodsForUser" />
		</resultMap>		<!--goodsList是User实体类中的 私有属性集合 -->													
		<select id="getUserinfoById" parameterType="int"  resultMap="userMap">
		    select 
				u.id as u_id,
				u.username,
				u.age, 
				u.address 
			from
				user u
			 where 
				u.id =${value};
		</select>
	</mapper> 
登录后复制

Goods实体类的mapper映射文件:GoodsDao.xml

<?xml version="1.0" encoding="UTF-8" ?>   
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
	<!-- 这就是那个嵌套的查询映射 -->   
	<mapper namespace="com.leo.mapper.GoodsDao">
		<select id="selectGoodsForUser" parameterType="int" resultType="Goods">
		  SELECT id,goodsName,goodsNumber,user_id FROM Goods WHERE user_id = #{value}
		</select>
	</mapper>  
登录后复制


mabatis的环境配置文件mabatis-config.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>
	<!-- 我把数据源的内容放在db.properties文件中 -->
	<properties resource="com/leo/resources/db.properties" />
	
	<!--start-类型别名 :为mapper.xml中resultType取一个别名,看着不会很冗余-->
	<typeAliases>
	  <typeAlias alias="User" type="com.leo.entity.User"/>
	  <typeAlias alias="Goods" type="com.leo.entity.Goods"/>
	</typeAliases>
	<!-- end- 类型别名-->
	
	<!-- start- environments配置 -->
    <environments default="development">   
       <environment id="development">   
           <transactionManager type="JDBC"/>   
           <dataSource type="POOLED">   
               <property name="driver" value="${driverClass}"/><!-- 数据源配置 --> 
               <property name="url" value="${url}"/>   
               <property name="username" value="${username}"/>   
               <property name="password" value="${password}"/>   
           </dataSource>   
       </environment>   
    </environments>
    <!-- end- environments配置 -->   
    
    <!-- 连接到实体类的映射文件资源-->
    <mappers>   
        <mapper resource="com/leo/entity/UserDao.xml" />
        <mapper resource="com/leo/entity/GoodsDao.xml" />
    </mappers>   
</configuration>
登录后复制
测试的servlet(也可以用main函数测试)

package com.leo.servlet;

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

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.leo.entity.Goods;
import com.leo.entity.User;
import com.leo.mapper.GoodsDao;
import com.leo.mapper.UserDao;



/**
 * Servlet implementation class MybatisServlet
 */
@WebServlet("/MybatisServlet")
public class MybatisServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		InputStream is = Resources.getResourceAsStream("com/leo/resources/mybatis-config.xml");
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
		SqlSession session = factory.openSession();
		
//		UserDao ud = session.getMapper(UserDao.class);
		GoodsDao gd = session.getMapper(GoodsDao.class);

		List<Goods> goodsList= gd.selectGoodsForUser(1);
		
//		User user = ud.getUserinfoById(1);		
//		System.out.println(user);
//		List<Goods> goodsList  =  user.getGoodsList();
		for (Goods goods : goodsList) {
			System.out.println(goods.getId()+"   "+ goods.getGoodsName()+"   "+goods.getGoodsNumber()+ "  "+ goods.getUser_id());
		}
		session.commit();
		session.close();
		
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
		
	}

}
登录后复制

以上是集合嵌套查询,还有一种方式是集合嵌套结果,这种方式只需要一个实体类文件即可,它是一种级联查询,自动完成的

下面用集合嵌套结果这种方式:

只需要改动UserDao.xml,且只是用这一个映射文件就可以完成

<?xml version="1.0" encoding="UTF-8" ?>   
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">   
	<mapper namespace="com.leo.mapper.UserDao">
		
		
		<resultMap type="Goods" id="goodsMap">
			<id column="g_id" property="id"/>
			<result column="goodsName" property="goodsName"/>
			<result column="goodsNumber" property="goodsNumber"/>
			<result column="user_id" property="user_id"/>
		</resultMap>
		
		<resultMap type="User"  id="userMap">
			<id column="u_id" property="id" />
			<result column="username" property="username" />
			<result column="age" property="age" />
			<result column="address" property="address" />
			<collection property="goodsList" ofType="Goods" resultMap="goodsMap" /><!--两种方式的不同之处在这里,自己分析就可以知道-->
		</resultMap>
		<select id="getUserinfoById" parameterType="int" resultMap="userMap">
		    select 
				u.id as u_id,
				u.username,
				u.age,
				u.address,
				g.id as g_id,   <!--嵌套结果这种方式是使用了一次连接查询,而嵌套查询使用了两次 -->
				g.goodsName,
				g.goodsNumber,
				g.user_id
			 from
				user u
				inner join goods g on u.id = g.user_id
			 where 
				u.id =${value};
		</select>	
	</mapper>  
登录后复制


希望可以帮到大家,有什么措辞不正确,希望得到指正,希望进步

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章标签

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

怎么在番茄免费小说app中写小说 分享番茄小说写小说方法教程 怎么在番茄免费小说app中写小说 分享番茄小说写小说方法教程 Mar 28, 2024 pm 12:50 PM

怎么在番茄免费小说app中写小说 分享番茄小说写小说方法教程

微信删除的人如何找回(简单教程告诉你如何恢复被删除的联系人) 微信删除的人如何找回(简单教程告诉你如何恢复被删除的联系人) May 01, 2024 pm 12:01 PM

微信删除的人如何找回(简单教程告诉你如何恢复被删除的联系人)

学信网如何查询自己的学历 学信网如何查询自己的学历 Mar 28, 2024 pm 04:31 PM

学信网如何查询自己的学历

手机版龙蛋孵化方法大揭秘(一步一步教你如何成功孵化手机版龙蛋) 手机版龙蛋孵化方法大揭秘(一步一步教你如何成功孵化手机版龙蛋) May 04, 2024 pm 06:01 PM

手机版龙蛋孵化方法大揭秘(一步一步教你如何成功孵化手机版龙蛋)

12306怎么查询历史购票记录 查看历史购票记录的方法 12306怎么查询历史购票记录 查看历史购票记录的方法 Mar 28, 2024 pm 03:11 PM

12306怎么查询历史购票记录 查看历史购票记录的方法

手机字体大小设置方法(轻松调整手机字体大小) 手机字体大小设置方法(轻松调整手机字体大小) May 07, 2024 pm 03:34 PM

手机字体大小设置方法(轻松调整手机字体大小)

Go语言中的泛型函数是否可以相互嵌套? Go语言中的泛型函数是否可以相互嵌套? Apr 16, 2024 pm 12:09 PM

Go语言中的泛型函数是否可以相互嵌套?

Go语言方法与函数的区别及应用场景解析 Go语言方法与函数的区别及应用场景解析 Apr 04, 2024 am 09:24 AM

Go语言方法与函数的区别及应用场景解析

See all articles