mybatis“集合嵌套查询”和“集合嵌套结果”两种方法实现数据库一对多关系
来源:互联网 发布:c语言中根号怎么表示 编辑:程序博客网 时间:2024/04/30 00:03
两个实体类分别如下: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}@Overridepublic 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 fromuser 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 fromuser uinner join goods g on u.id = g.user_id where u.id =${value};</select></mapper>
希望可以帮到大家,有什么措辞不正确,希望得到指正,希望进步
0 0
- mybatis“集合嵌套查询”和“集合嵌套结果”两种方法实现数据库一对多关系
- mybatis“集合嵌套查询”和“集合嵌套结果”两种方法实现数据库一对多关系
- mybatis“集合嵌套查询”和“集合嵌套结果”两种方法实现数据库一对多关系
- 使用MyBatis(十)一对多集合的嵌套结果
- 使用MyBatis(九)一对多的集合的嵌套查询
- MyBatis之高级关联和集合映射(二、嵌套查询和嵌套结果小案例)
- mybatis 嵌套查询,一对多
- mybatis 一对多,嵌套查询
- 数据库 - 连接查询、嵌套查询、集合查询
- mybatis一对一、一对多关联使用及结果嵌套和条件嵌套理解
- Mybatis各种查询,一对一,一对多,嵌套
- MyBaits学习——集合的嵌套查询和嵌套结果
- MyBatis实现关联表查询(一对一,一对多,联合查询,嵌套查询)
- MyBatis之高级关联和集合映射(二、嵌套结果综合案例)
- mybatis 映射一对多查询返回集合
- 嵌套集合
- 集合嵌套
- MyBatis用嵌套ResultMap实现一对多映射
- jaxp的sax方式解析xml
- ActivityManager: Exception thrown launching activities in ProcessRecord
- IOS 之 通过 storyboard 自定义控制器以及 loadView 方法简述
- java变量
- Mysql的数据控制语言DCL
- mybatis“集合嵌套查询”和“集合嵌套结果”两种方法实现数据库一对多关系
- 完整的一个表单例子
- shell遍历文件性能
- 环境安装相关
- OpenCV学习笔记八——常用数据结构和函数
- Mysql三范式
- 表单集合
- Spring配置文件中配置数据库连接(mysql,sqlserver,oracle)
- linux下php7修改端口号