概述
两个实体类分别如下: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>
希望可以帮到大家,有什么措辞不正确,希望得到指正,希望进步
最后
以上就是轻松铅笔为你收集整理的mybatis“集合嵌套查询”和“集合嵌套结果”两种方法实现数据库一对多关系的全部内容,希望文章能够帮你解决mybatis“集合嵌套查询”和“集合嵌套结果”两种方法实现数据库一对多关系所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复