Mybatis的Jar包下载:https://pan.baidu.com/s/16P-MGgn53e1EtCL6wQ9VWA 密码:1azq
OrderMapper.xml(实体类的Sql配置文件,resultMap配置一对一、一对多关联属性的映射):
<?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">
<!-- 配置原生Sql语句 -->
<mapper namespace="com.xxx.mybatis.mapper.OrderMapper">
<!-- 一对一关联查询 (一个订单关联一个用户) -->
<!-- 手动配置数据库表的列名与返回对象属性的映射关系 (有关联属性) -->
<resultMap type="Order" id="order">
<result column="id" property="id"/> <!-- order对象的属性 -->
<result column="user_id" property="userId"/>
<result column="number" property="number"/> <!-- 关联查询时(多表查询),列名和属性名相同时,不可以省略不写。 单表查询时(没有关联属性)列名和属性名相同时,可以省略 -->
<!-- 关联属性的映射(一对一) -->
<association property="user" javaType="User" > <!-- user是Order类中的关联属性。 javaType:必须指定user属性的类型 -->
<id column="user_id" property="id"/> <!-- User对象的属性 -->
<result column="username" property="username"/>
</association>
</resultMap>
<select id="selectOrders" resultMap="order"> <!-- 返回对象有关联属性时,必须用resultMap手动配置映射关系 -->
SELECT
o.id,
o.user_id,
o.number,
o.createtime,
u.username
FROM orders o
left join user u
on o.user_id = u.id
</select>
<!-- 一对多关联查询 (一个用户关联多个订单)-->
<resultMap type="User" id="user">
<id column="user_id" property="id"/> <!-- User对象的属性 -->
<result column="username" property="username"/> <!-- id标签表示主键属性;result表示非主键属性 -->
<!-- 关联属性的映射(一对多) -->
<collection property="orderList" ofType="Order" > <!-- orderList是User类中的关联属性。 ofType:必须指定orderList属性是什么类型的集合 -->
<id column="id" property="id"/> <!-- order对象的属性 -->
<result column="number" property="number"/>
</collection>
</resultMap>
<select id="selectUserList" resultMap="user">
SELECT
o.id,
o.user_id,
o.number,
o.createtime,
u.username
FROM user u
left join orders o
on o.user_id = u.id
</select>
</mapper>
OrderMapper.java(遵循四个原则的Dao层接口):
package com.xxx.mybatis.mapper;
import java.util.List;
import com.xxx.mybatis.pojo.Order;
import com.xxx.mybatis.pojo.User;
public interface OrderMapper {
//遵循四个原则:
//OrderMapper.xml中配置的命名空间要与该接口的全类名保持一致(com.xxx.mybatis.mapper.OrderMapper)
//接口中的方法名 == OrderMapper.xml中配置的sql语句的id名
//返回值类型 与 OrderMapper.xml文件中配置的返回值类型(resultType)要一致
//方法的输入参数类型 与OrderMapper.xml中配置的输入参数的类型(parameterType)要一致
//一对一关联 查询 以订单为中心 关联用户
public List<Order> selectOrders();
//一对多关联
public List<User> selectUserList();
}
Test.java(测试类):
package com.xxx.mybatis.junit;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.xxx.mybatis.mapper.OrderMapper;
import com.xxx.mybatis.pojo.Order;
import com.xxx.mybatis.pojo.User;
public class Test {
@Test
//一对一
public void testOrderList() throws Exception {
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = sqlSessionFactory.openSession();
//---------------------------------------------------------------------
//SqlSession会根据接口自动生成这个接口的实现类 (动态代理)。
OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
List<Order> selectOrdersList = orderMapper.selectOrders();
for (Order order : selectOrdersList) {
System.out.println(order);
}
}
@Test
//一对多
public void testUserList() throws Exception {
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = sqlSessionFactory.openSession();
//---------------------------------------------------------------------
//SqlSession会根据接口自动生成这个接口的实现类 (动态代理)。
OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
List<User> users = orderMapper.selectUserList();
for (User user : users) {
System.out.println(user);
}
}
}
Order.java(实体类):
package com.xxx.mybatis.pojo;
import java.io.Serializable;
import java.util.Date;
public class Order implements Serializable{
private static final long serialVersionUID = 1L;
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
//关联用户对象User
private User user;
//.....getter和setter方法..........
}
User.java(实体类):
package com.xxx.mybatis.pojo;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String username; //用户姓名
private String sex; //性别
private Date birthday; //生日
private String address; //地址
//关联订单 (List)
private List<Order> orderList;
//.....getter和setter方法..........
}
src/sqlMapConfig.xml(Mybatis的核心配置文件):
<?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>
<properties resource="jdbc.properties"/>
<!-- 为类型配置别名 -->
<typeAliases>
<!-- 该包及其子包下的所有类都会自动取简单类名为别名,且别名首字母大小写都可以 -->
<package name="com.xxx.mybatis.pojo"/>
</typeAliases>
<!-- 连接数据库的参数配置。和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="123" />
</dataSource>
</environment>
</environments>
<!-- 加载外部实体类的Sql映射文件 -->
<mappers>
<package name="com.xxx.mybatis.mapper" /> <!-- 该包下的所有类对应的xml映射文件都会包含进来(推荐)。必须满足该包下的xml文件的名字和位置与对应类相同 -->
</mappers>
</configuration>