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

来源:互联网 发布:js遍历对象数组并替换 编辑:程序博客网 时间:2024/05/17 04:08

两个实体类分别如下: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>    

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




0 0
原创粉丝点击