一对一的映射:一个订单对应一个用户
一对多的映射:一个订单对应多类商品
一对一与一对多的实例:
(没写的与前面的章节的相同)
实体类: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);
}