介绍内容:主要介绍resultMap使用,动态sql,缓存,高级查询一对一,一对多,多对多。
第一步:复制前面的初级工程。
第二步:定义目前的数据接口:
package com.mobile263.yingbatis2.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.mobile263.yingbatis2.pojo.Order;
import com.mobile263.yingbatis2.pojo.User;
public interface UserMapper {
//测试入参非对象
public User queryByNameAndAge(@Param("name") String name,@Param("age") int age) throws Exception;
//测试返回全部列表数据
public List<User> queryByUser(User user) throws Exception;
//通过订单查询订单和用户数据
public Order oneToOne(int orderNum) throws Exception;
//通过订单查询用和订单详情
public Order oneToMany(int orderNum) throws Exception;
//查询订单,查出订单详情和商品信息以及用户信息
public Order manyToMany(int orderNum) throws Exception;
}
第三步:配置mapper.xml
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mobile263.yingbatis2.mapper.UserMapper">
<cache></cache>
<!-- restMap 映射非驼峰命名 -->
<resultMap type="User" id="userMap" autoMapping="true">
<id column="user_id" property="userId"/>
<result column="user_name" property="userName"/>
</resultMap>
<!-- 入参非 常规对象 -->
<select id="queryByNameAndAge" resultMap="userMap">
select * from tb_user where user_name like #{name} and age=#{age}
</select>
<!--动态sql语句 -->
<select id="queryByUser" resultType="User">
select * from tb_user
<where>
<if test="userName != null and userName != ''"> and user_name like #{userName}</if>
<if test="age != null"> and age=#{age}</if>
</where>
</select>
<resultMap type="Order" id="OrderResultMap" autoMapping="true">
<id column="oid" property="oid"/>
<association property="user" javaType="User" autoMapping="true">
<id column="user_id" property="userId"/>
</association>
</resultMap>
<!--一对一查询 -->
<select id="oneToOne" resultMap="OrderResultMap">
select tb_user.*,tb_order.* from tb_user,tb_order
where tb_user.user_id=tb_order.user_id order_number=#{orderNum}
</select>
<resultMap type="Order" id="OrderResultMap2" autoMapping="true" extends="OrderResultMap">
<!-- 注释表示resultMap使用继承,减少冗余 -->
<!-- <id column="oid" property="oid"/>
<association property="user" javaType="User" autoMapping="true">
<id column="user_id" property="userId"/>
</association> -->
<collection property="details" javaType="list" ofType="OrderDetail" autoMapping="true">
<id column="detail_id" property="detailId"/>
</collection>
</resultMap>
<select id="oneToMany" resultMap="OrderResultMap2">
select tb_user.*,tb_order.*,tb_orderdetail.* from tb_user,tb_order,tb_orderdetail
where tb_user.user_id=tb_order.user_id and tb_order.oid=tb_orderdetail.order_id and order_number=#{orderNum}
</select>
<resultMap type="Order" id="OrderResultMap3" autoMapping="true" extends="OrderResultMap">
<!-- 注释表示resultMap使用继承,减少冗余 -->
<!-- <id column="oid" property="oid"/>
<association property="user" javaType="User" autoMapping="true">
<id column="user_id" property="userId"/>
</association> -->
<collection property="details" javaType="list" ofType="OrderDetail" autoMapping="true">
<id column="detail_id" property="detailId"/>
<association property="product" javaType="Product" autoMapping="true">
<id column="pid" property="pid"/>
</association>
</collection>
</resultMap>
<select id="manyToMany" resultMap="OrderResultMap3">
select tb_user.*,tb_order.*,tb_orderdetail.*,tb_product.* from tb_user,tb_order,tb_orderdetail,tb_product
where tb_user.user_id=tb_order.user_id
and tb_order.oid=tb_orderdetail.order_id
and tb_orderdetail.product_id=tb_product.pid
and order_number=#{orderNum}
</select>
</mapper>
第四步:配置mybatis-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>
<properties resource="db.properties"></properties>
<settings>
<!-- 开启驼峰命名和数据库映射 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="cacheEnabled" value="true"/>
</settings>
<!-- 配置别名,方便子mapper简化书写 -->
<typeAliases>
<typeAlias alias="User" type="com.mobile263.yingbatis2.pojo.User"/>
<typeAlias alias="Order" type="com.mobile263.yingbatis2.pojo.Order"/>
<typeAlias alias="OrderDetail" type="com.mobile263.yingbatis2.pojo.OrderDetail"/>
<typeAlias alias="Product" type="com.mobile263.yingbatis2.pojo.Product"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${db.driverClass}"/>
<property name="url" value="${db.jdbcUrl}"/>
<property name="username" value="${db.user}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 开启包名扫描mapper.xml, -->
<!-- <mapper resource="com/mobile263/yingbatis01/mapper/UserMapper.xml"/> -->
<package name="com.mobile263.yingbatis2.mapper"/>
</mappers>
</configuration>
第五步:测试用列:
package com.mobile263.yingbatis2.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
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.After;
import org.junit.Before;
import org.junit.Test;
import com.mobile263.yingbatis2.mapper.UserMapper;
import com.mobile263.yingbatis2.pojo.Order;
import com.mobile263.yingbatis2.pojo.User;
public class CrudTest {
private UserMapper userMapper;
private SqlSession sqlSession;
private SqlSessionFactory sqlSessionFactory;
@Before
public void setup() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
userMapper = sqlSession.getMapper(UserMapper.class);
}
@After
public void tearDown() {
sqlSession.commit();
sqlSession.close();
}
@Test
public void testQueryByNameAndAge() throws Exception {
User user = userMapper.queryByNameAndAge("%周%",23);
System.out.println(user.toString());
}
@Test
public void testQueryByUser() throws Exception {
User user = new User();
user.setUserName("%小%");
user.setAge(12);
List<User> users= userMapper.queryByUser(user);
for (User user2 : users) {
System.out.println(user2.toString());
}
}
@Test
public void testSessionCache() throws Exception {
User user = userMapper.queryByNameAndAge("%周%",23);
System.out.println(user.toString());
User user2 = userMapper.queryByNameAndAge("%周%",23);
System.out.println(user2.toString());
}
@Test
public void testSessionCache2() throws Exception {
User user = userMapper.queryByNameAndAge("%周%",23);
System.out.println(user.toString());
sqlSession.clearCache();
User user2 = userMapper.queryByNameAndAge("%周%",23);
System.out.println(user2.toString());
}
@Test
public void testMapperCache() throws Exception {
User user = userMapper.queryByNameAndAge("%周%",23);
System.out.println(user.toString());
sqlSession.close();
sqlSession = sqlSessionFactory.openSession();
userMapper = sqlSession.getMapper(UserMapper.class);
User user2 = userMapper.queryByNameAndAge("%周%",23);
System.out.println(user2.toString());
}
@Test
public void testOneToOne() throws Exception {
Order order = userMapper.oneToOne(1);
System.out.println(order.toString());
}
@Test
public void testOneToMany() throws Exception {
Order order = userMapper.oneToMany(1);
System.out.println(order.toString());
}
@Test
public void testmanyToMany() throws Exception {
Order order = userMapper.manyToMany(2);
System.out.println(order.toString());
}
}
工程代码可浏览:https://github.com/chen-liang-ying/mybatis2.git
The end~~