mybatis 高级查询 进阶

介绍内容:主要介绍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~~

猜你喜欢

转载自blog.csdn.net/yingcly003/article/details/84776779