mybatis的多表查询


一 parameterType(输入类型)

1.传递简单类型
2.传递pojo对象,Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo属性名称。
3.包装的pojo:对象里面还有对象
3.1代码实现

public class QueryVo {

	//包装user  包装的pojp
 // 对象里面还有对象
	private User user;
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
}


<!-- 传递包装类的pojo -->
	 <select id="getUserByQueryVo" parameterType="queryvo" resultType="User">
	 SELECT * FROM `user`
	WHERE username LIKE '%${user.username}%'
	 </select>



 /**
     * 传递包装的pojo
     * 返回值为User,输入的参数queryvo
     */
    List<User> getUserByQueryVo(QueryVo vo);


	@Test
	public void testGetUserByQueryVo() {
		SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(true);
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		QueryVo vo = new QueryVo();
		User user2 = new User();
		user2.setUsername("张");
		vo.setUser(user2);
		List<User> list = mapper.getUserByQueryVo(vo);
		for (User user : list) {
		}
		sqlSession.close();
	}

二、 数据库元素名称与配置文件的标签名称不一致

使用resultMap标签
下面的别名配置单表查询时只需配置别名不一样的元素即可
多表查询时需要全部配置

<!-- resultMap入门
		 type:映射成的pojo类型
		 id:resultMap唯一标识
	-->
	<resultMap type="order" id="orderMap">
		<!-- id标签用于绑定主键 -->
		<!-- <id property="id" column="id"/> -->
		
		<!-- 使用result绑定普通字段 -->
		<result property="userId" column="user_id"/>
		<result property="number" column="number"/>
		<result property="createtime" column="createtime"/>
		<result property="note" column="note"/>
	</resultMap>
	<!-- 使用resultMap -->
	<select id="getOrderListResultMap" resultMap="orderMap">
		SELECT * FROM `order`
	</select>

三、动态sql语句

1.if标签

<!-- 演示动态sql-if标签的使用情景 -->
	<select id="getUserByWhere" parameterType="user" resultType="com.mybatis.pojo.User">
		<!-- SELECT * FROM USER WHERE username LIKE '%${username}%' and id = #{id} -->
		SELECT * FROM USER where 1 = 1
		<!-- if标签的使用 -->
		<if test="id != null">
			and id = #{id}
		</if>
		<if test="username != null and username != ''">
			and username LIKE '%${username}%'
		</if>
	</select>


2.where标签

<select id="getUserByWhere2" parameterType="user"
		resultType="com.itheima.mybatis.pojo.User">
		<!-- include:引入sql片段,refid引入片段id -->
		SELECT
		*
		FROM USER
		<!-- where会自动加上where同处理多余的and -->
		<where>
			<!-- if标签的使用 -->
			<if test="id != null">
				and id = #{id}
			</if>
			<if test="username != null and username != ''">
				and username LIKE '%${username}%'
			</if>
		</where>
</select>

fore 标签

需要一个集合,在包装类中定义一个list集合 ,并且创建set,get方法

	  foreach循环标签 
	 	 	 ~~删除线格式~~ collection:要遍历的集合,来源入参 
			 open:循环开始前的sql 
			 item:设置循环变量
			 separator:分隔符 
			 close:循环结束拼接的sql
			 #{uid}:占位符的方式来输出uId
	<select id="getUserByIds" parameterType="queryvo"
		resultType="com.mybatis.pojo.User">
		
		SELECT
		*FROM USER
		<!-- where会自动加上where同处理多余的and -->
		<where>
			<!-- id IN(1,10,25,30,34) -->
			<!-- foreach循环标签 
				 collection:要遍历的集合,来源入参 
				 open:循环开始前的sql 
				 item:设置循环变量
				 separator:分隔符 
				 close:循环结束拼接的sql
				 #{uid}:占位符的方式来输出uId
			-->
			<foreach item="uid" collection="ids" open="id IN(" separator=","
				close=")">
				#{uid}
			</foreach>		
		</where>
	</select>
	public void testGetUserByIds() {
		SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		QueryVo vo = new QueryVo();
		vo.setIds(Arrays.asList(22,26,28,31));
		List<User> list = userMapper.getUserByIds(vo);
		for (User user : list) {
			System.out.println(user);
		}
		sqlSession.close();
	}

四、关联查询

1.一对一查询

1.创建查询语句映射表

类似于pojo的传参方式

2.resultmap
1.在order表中添加,目的是连表查询的时候进行输出用户表信息
	private User user;
	
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
2.配置resultmap

记住id

<!--type:映射的pojo  -->
	<resultMap type="order" id="order_user_map">
	<!-- 主键映射 -->
		<id property="id" column="id"/>
		<!--普通字段使用result进行映射 -->
		<result property="userId" column="user_id"/>
		<result property="number" column="number"/>
		<result property="createtime" column="createtime"/>
		<result property="note" column="note"/>
		<!-- 
		association用于配置一对一对应关系
		property里面的是order传入User属性
		Javatype:user的数据类型,支持别名-->
		<association property="user" javaType="pojo.User">
			<id property="id" column="user_id"/>
			<result property="username" column="username"/>
			<result property="address" column="address"/>
			<result property="birthday" column="birthday"/>
			<result property="sex" column="sex"/>
		</association>
	</resultMap>
3.配置数据库查询语句

	<!-- 一对一关联查询,resultMap -->
	<select id="getOrderUserMap" resultMap="order_user_map">
			SELECT 
				o.id,
				o.user_id,
				o.number,
				o.note,
				o.createtime,
				u.username,
				u.address,
				u.birthday,
				u.sex
			from 
				`order` o
			LEFT JOIN `user` u
				On u.id = o.user_id
	</select>

4.进行Junit测试

2.一对多查询

collection用于配置一对多关联查询
property:User里面的order属性
ofType:Order的数据类型,即使order.java文件 ,支持别名

1.因为是一对多的原因,所以在user表中返回的是order集合
 */
	private List<Order> orders;
	
	public List<Order> getOrder() {
		return orders;
	}

	public void setOrder(List<Order> order) {
		this.orders = order;
	}
2.配置resultmap
<resultMap type="user" id="user_order_map">
		<!-- 配置主键映射 -->
		<id property="id" column="id"/>
		<result property="username" column="username"/>
		<result property="birthday" column="birthday"/>
		<result property="sex" column="sex"/>
		<result property="address" column="address"/>
		
		<!-- 设置User里面的order属性 :order 为集合属性 -->
		<collection property="orders" ofType="pojo.Order">
			<id property="id" column="oid"/>
			<result property="userId" column="id"/>
			<result property="number" column="number" />
			<result property="createtime" column="createtime"/>
			<result property="note" column="note"/>
		</collection>
	</resultMap>
3.配置数据库查询语句
<select id="getUserOrderMap" resultMap="user_order_map">
			SELECT
				u.id,
				u.username,
				u.birthday,
				u.sex,
				u.address,
				o.id oid,
				o.number,
				o.createtime,
				o.note
			FROM `user` u
			LEFT JOIN `order` o ON o.user_id = u.id 
	
	</select>

4.测试
在进行遍历时要进行双重遍历
首先遍历user表
再在user表中进行fore循环
for(Order order : user.getOrder){
·· 此时还需判断 order.id是否为空值
}

五、mybatis整合spring

1.整合步骤

  1. 创建一个java工程。
  2. 导入jar包。(课前资料中mybatis与spring整合所有包)
  3. mybatis的配置文件sqlmapConfig.xml
  4. 编写Spring的配置文件
    (1)数据库连接及连接池
    (2)sqlsessionFactory对象,配置到spring容器中
    (3) 编写Spring的配置文件
  5. 复制jdbc.properties配置文件到新工程
  6. 复制log4j.properties配置文件到新工程

1.

<!-- 数据库连接及连接池 -->
	<!-- 数据库连接池 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="${jdbc.driver}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<!-- 连接池的最大数据库连接数 -->
		<property name="maxActive" value="10" />
		<!-- 最大空闲数 -->
		<property name="maxIdle" value="5" />
	</bean>
	
<!-- sqlsessionFactory对象,配置到spring容器中 -->
	<bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean.class">
		<!-- 加载mybatis核心配置文件 -->
		<property name="configLocation" value="classpath:SqlMapConfig.xml"/>
		<!-- 指向上面的数据连接 -->
		<property name="dataSource" ref="dataSource"/>
		<!-- 配置比名包扫描 -->
		<property name=""></property>
	</bean>

2.传统dao

1. 	复制user.xml到新工程,并修改,只留下要测试的三个方法
2. 	在SqlMapConfig.xml加载user.xml
3. 	复制UserDao接口到新工程,并修改,只留下要测试的三个方法
4. 	编写UserDaoImpl实现类,关键是继承SqlSessionDaoSupport
5. 

3.mapper代理模式开发dao

  1. 复制UserMapper.xml到新工程,并修改,只留下要测试的三个方法
  2. 复制UserMapper接口到新工程,并修改,只留下要测试的三个方法
  3. 配置Mapper
  1. 单个接口配置MapperFactoryBean
<!-- 动态代理Dao开发,第一种方式 -MapperFactoryBean -->
	<bean id="baseMapper" class="org.mybatis.spring.mapper.MapperFactoryBean" abstract="true" lazy-init="true">
     	<property name="sqlSessionFactory" ref="sqlSessionFactory" />
    </bean>
    <!-- 用户动态代理扫描 -->
    <bean parent="baseMapper">
      <property name="mapperInterface" value="com.itheima.mybatis.mapper.UserMapper" />
   	</bean>
  1. 配置包扫描器
<!-- 动态代理Dao开发,第一种方式,包扫描器(推荐使用) -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
   		<!-- basePackage:配置映射包装扫描,多个包时用","或";"分隔 -->
<property name="basePackage" value="com.itheima.mybatis.mapper" />
   </bean>
  1. 测试
public class UserMapperTest {
	
	private ApplicationContext applicationContext;
	
	@Before
	public void init(){
		applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
	}

	@Test
	public void testGetUserById() {
		UserMapper userMapper = applicationContext.getBean(UserMapper.class);
		User user = userMapper.getUserById(10);
		System.out.println(user);
	}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值