MyBatis入门(三)

一对一的映射:一个订单对应一个用户
一对多的映射:一个订单对应多类商品
一对一与一对多的实例:
这里写图片描述
(没写的与前面的章节的相同)
实体类:User.java

public class User implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private int uId;
    private String uName;
    private String uPassword;
    public int getuId() {
        return uId;
    }
    public void setuId(int uId) {
        this.uId = uId;
    }
    public String getuName() {
        return uName;
    }
    public void setuName(String uName) {
        this.uName = uName;
    }
    public String getuPassword() {
        return uPassword;
    }
    public void setuPassword(String uPassword) {
        this.uPassword = uPassword;
    }
    @Override
    public String toString() {
        return "User [uId=" + uId + ", uName=" + uName + ", uPassword=" + uPassword + "]";
    }
    public User(int uId, String uName, String uPassword) {
        super();
        this.uId = uId;
        this.uName = uName;
        this.uPassword = uPassword;
    }
    public User() {
        super();
    }
}

实体类:Order.java

public class Order implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private int oId;
    private Date oTime;
    private int uId;      //用户id  外键
    //因为一个订单对应了一个用户  所以在这里要维护用户对象
    private User user;
    private List<OrderDetail> details=new ArrayList<OrderDetail>();
    public Order() {
    }
    public Order(int oId, Date oTime, int uId, User user,
            List<OrderDetail> details) {
        this.oId = oId;
        this.oTime = oTime;
        this.uId = uId;
        this.user = user;
        this.details = details;
    }
    public int getoId() {
        return oId;
    }
    public void setoId(int oId) {
        this.oId = oId;
    }
    public Date getoTime() {
        return oTime;
    }
    public void setoTime(Date oTime) {
        this.oTime = oTime;
    }
    public int getuId() {
        return uId;
    }
    public void setuId(int uId) {
        this.uId = uId;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public List<OrderDetail> getDetails() {
        return details;
    }
    public void setDetails(List<OrderDetail> details) {
        this.details = details;
    }
    @Override
    public String toString() {
        return "Order [oId=" + oId + ", oTime=" + oTime + ", uId=" + uId
                + ", user=" + user + ", details=" + details + "]";
    }
}

实体类:

public class OrderDetail implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private int odId;
    private float subTotal;
    private int count;
    private int o_id;    //订单的id
    private int g_id;    //商品的id
    public OrderDetail() {
    }
    public OrderDetail(int odId, float subTotal, int count, int o_id, int g_id) {
        this.odId = odId;
        this.subTotal = subTotal;
        this.count = count;
        this.o_id = o_id;
        this.g_id = g_id;
    }
    public int getOdId() {
        return odId;
    }
    public void setOdId(int odId) {
        this.odId = odId;
    }
    public float getSubTotal() {
        return subTotal;
    }
    public void setSubTotal(float subTotal) {
        this.subTotal = subTotal;
    }
    public int getCount() {
        return count;
    }
    public void setCount(int count) {
        this.count = count;
    }
    public int getO_id() {
        return o_id;
    }
    public void setO_id(int o_id) {
        this.o_id = o_id;
    }
    public int getG_id() {
        return g_id;
    }
    public void setG_id(int g_id) {
        this.g_id = g_id;
    }
    @Override
    public String toString() {
        return "OrderDetail [odId=" + odId + ", subTotal=" + subTotal
                + ", count=" + count + ", o_id=" + o_id + ", g_id=" + g_id
                + "]";
    }
}

OrderMapper.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.wc.test03.OrderMapper">
 <!--返回的结果集的映射-->
 <resultMap type="com.wc.test03.Order" id="findUserByOrderResultMap">
   <!--配置主键映射-->
   <id property="oId" column="oId"/>
   <!--配置普通的字段映射-->
   <result property="oTime" column="oTime"/>
   <result property="uId" column="uId"/>
   <!--配置我们的一对一映射   association
        property:这个就是一对一类的对象名字
        javaType:给定一对一中对象的类型
   -->
   <association property="user" javaType="com.wc.test03.User">
      <!--配置主键-->
      <id property="uId" column="id"/>
      <!--配置普通的字段-->
      <result property="uName" column="uName"/>
   </association>
   <!--配置一对多的玩法  一对多使用collection   ofType是用在一对多中表明类型的-->
   <collection property="details" ofType="com.wc.test03.OrderDetail">
      <!--配置主键-->
      <id property="odId" column="odId"/>
      <!--配置外键-->
      <result property="subTotal" column="subTotal"/>
      <result property="count" column="count"/>
      <result property="o_id" column="o_id"/>
      <result property="g_id" column="g_id"/>
   </collection>
 </resultMap>

 <!--通过订单来找用户-->
 <select id="findUserByOrder" resultMap="findUserByOrderResultMap">
   select 
     * 
   from 
   t_order o,t_user u,detail od 
   where o.uId=u.id and o.oId=od.o_id
 </select>
</mapper> 

接口:OrderMapper.java

public interface OrderMapper {
    /**
     * 通过订单来找用户
     * @return
     */
    List<Order> findUserByOrder();
}

Test03.java

public static void main(String[] args) {
        SqlSession sqlSession=MyBatisUtils.getSqlSession();
        OrderMapper orderMapper=sqlSession.getMapper(OrderMapper.class);
        List<Order> orders=orderMapper.findUserByOrder();
        System.out.println("查询回来的数据是:"+orders);
    }

懒加载:当数据没被使用时,不加载数据(不执行SQL的操作)
在mybatis.xml中要配置懒加载
mybatis.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!--这个配置文件是不用记住的 只是需要 知道去哪里找就OK了 -->
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- configuration:这个表示的是整个的配置信息 -->
<configuration>
    <!-- 资源导入 -->
    <properties resource="db.properties"></properties>
<!--配置我们的设置   懒惰性加载的第一步:打开懒惰性加载   关闭那个积极的 加载-->
  <settings>
       <!--是否使能延迟的加载-->
     <setting name="lazyLoadingEnabled" value="true"/>
     <!--关闭那个积极的加载-->
     <setting name="aggressiveLazyLoading" value="false"/>
  </settings>
    <!-- 取别名 -->
    <typeAliases>
        <package name="com.wc.test01"/>
    </typeAliases>
    <!-- environments环境可以配置多个 比如 mySql orale? ... default:默认使用那个环境 后面的值 必须是后面的id 
        mysql / oracle -->
    <environments default="mysql">

        <!-- environment:这个表示的是配置的是单个的环境 id:给环境添加唯一的标识符 id可以随便取名 但是一般也要见名之意 -->
        <environment id="mysql">

            <!--mybatis的事物只能交给JDBC去进行处理 -->
            <transactionManager type="JDBC" />
            <!--这个表示的是数据库的连接池 type也只能写 pooled -->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}" />
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
        <environment id="oracle">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql:///iBatis001" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>

    <!--配置的是映射的文件 -->
    <mappers>
        <package name="com.wc.test02"/>
    </mappers>
</configuration>

User.java 与上面一样
UserMapper.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.wc.test02.UserMapper">
 <!--通过id来找用户-->
 <select id="findUserById" parameterType="int" resultType="com.wc.test02.User"> 
   select * from t_user  where id=#{id}
 </select>
</mapper> 

UserMapper.java

public interface UserMapper {
    User findUserById(int id);
}

Order.java

public class Order {
    private int oId;
    private Date oTime;
    private int uId;
    private User user;
    public Order() {
    }
    public Order(int oId, Date oTime, int uId, User user) {
        this.oId = oId;
        this.oTime = oTime;
        this.uId = uId;
        this.user = user;
    }
    public int getoId() {
        return oId;
    }
    public void setoId(int oId) {
        this.oId = oId;
    }
    public Date getoTime() {
        return oTime;
    }
    public void setoTime(Date oTime) {
        this.oTime = oTime;
    }
    public int getuId() {
        return uId;
    }
    public void setuId(int uId) {
        this.uId = uId;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    @Override
    public String toString() {
        return "Order [oId=" + oId + ", oTime=" + oTime + ", uId=" + uId
                + ", user=" + user + "]";
    }
}

OrderMapper.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.wc.test02.OrderMapper">
 <!--返回的结果集的映射-->
 <resultMap type="com.wc.test02.Order" id="OrderResultMap">
   <!--配置主键映射-->
   <id property="oId" column="oId"/>
   <!--配置普通的字段映射-->
   <result property="oTime" column="oTime"/>
   <result property="uId" column="uId"/>
   <!--配置我们的一对一映射   association
        property:这个就是一对一类的对象名字
        javaType:给定一对一中对象的类型
        column:这个表示的是要映射到上面的字段中的值  uId:这里表示要传递过去的值 是上面的uId字段
        select:表示的是要调用mapper.xml中的某一个方法
   -->
   <association property="user" javaType="com.wc.test02.User"  select="com.wc.test02.UserMapper.findUserById" column="uId"> 
      <!--配置主键-->
      <id property="uId" column="id"/>
      <!--配置普通的字段-->
      <result property="uName" column="uName"/>
   </association>
 </resultMap>
 <!--通过订单来找用户-->
 <select id="findUserByOrder" resultMap="OrderResultMap">
   select * from t_order o
 </select>
</mapper> 

OrderMapper.java

public interface OrderMapper {
     /**
     * 通过订单来找用户
     * @return
     */
    List<Order> findUserByOrder();
}

Test02.java

    public static void main(String[] args) {
        SqlSession sqlSession=MyBatisUtils.getSqlSession();
        OrderMapper orderMapper=sqlSession.getMapper(OrderMapper.class);
        List<Order> order=orderMapper.findUserByOrder();
        //如果不调用,则不执行UserMapper的sql语句
        System.out.println("查询回来的数据是:"+order);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值