• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

mysql 搞代码 4年前 (2022-01-09) 21次浏览 已收录 0个评论

两个实体类分别如下: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 goodsList;	public List getGoodsList() {		return goodsList;	}	public void setGoodsList(List 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" ?>      																				<!---ecms -ecms 当表之间的关系是一对多时,用 collection-->			<!---ecms -ecms  这里的 column="u_id"是为了传参数到嵌套的查询select="....."-->							<!---ecms -ecms goodsList是User实体类中的 私有属性集合 -->																	    select 				u.id as u_id,				u.username,				u.age, 				u.address 			from				user u			 where 				u.id =${value};			 

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

<?xml version="1.0" encoding="UTF-8" ?>   	<!---ecms -ecms  这就是那个嵌套的查询映射 -->   					  SELECT id,goodsName,goodsNumber,user_id FROM Goods WHERE user_id = #{value}			  

mabatis的环境配置文件mabatis-config.xml

<?xml version="1.0" encodin<b>本文来源gao@!dai!ma.com搞$$代^@码!网</b>g="UTF-8"?>        	<!---ecms -ecms  我把数据源的内容放在db.properties文件中 -->			<!---ecms -ecms start-类型别名 :为mapper.xml中resultType取一个别名,看着不会很冗余-->		  	  		<!---ecms -ecms  end- 类型别名-->		<!---ecms -ecms  start- environments配置 -->                                                            <!---ecms -ecms  数据源配置 -->                                                                                       <!---ecms -ecms  end- environments配置 -->           <!---ecms -ecms  连接到实体类的映射文件资源-->                              

测试的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 goodsList= gd.selectGoodsForUser(1);		//		User user = ud.getUserinfoById(1);		//		System.out.println(user);//		List 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" ?>      																																								<!---ecms -ecms 两种方式的不同之处在这里,自己分析就可以知道-->						    select 				u.id as u_id,				u.username,				u.age,				u.address,				g.id as g_id,   <!---ecms -ecms 嵌套结果这种方式是使用了一次连接查询,而嵌套查询使用了两次 -->				g.goodsName,				g.goodsNumber,				g.user_id			 from				user u				inner join goods g on u.id = g.user_id			 where 				u.id =${value};				  

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


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:mybatis“集合嵌套查询”和“集合嵌套结果”两种方法实现数据库

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址