mybatis_day04_输入输出映射&动态SQL

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35537301/article/details/82228108

输入映射

输入参数类型是简单类型

parameterType="数据类型"

#{}:括号中的值可以是任意值,但不能为空

${}:括号中的值必须是value

输入参数类型是pojo对象

parameterType="POJO对象的全向定名"

#{}:括号中的值为pojo属性名称

${}:括号中的值为pojo属性名称

输入参数类型是pojo包装对象

包装对象:pojo类中的一个属性是另外一个pojo

使用场景:不同维度上的查询

package com.itheima.pojo;

public class QueryVo {

	private User user;

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

}
package com.itheima.mapper;

import java.util.List;

import com.itheima.pojo.QueryVo;
import com.itheima.pojo.User;

public interface UserMapper {

	public List<User> selectUserByUsername(QueryVo queryVo);
	
}
<?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">
<!-- namespace:命名空间,作用:1.用于隔离sql 2.使用动态代理开发DAO,namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.itheima.mapper.UserMapper">
	
	<!-- 根据用户名称模糊查询用户信息 -->
	<select id="selectUserByUsername" parameterType="com.itheima.pojo.QueryVo" resultType="com.itheima.pojo.User">
		select * from user where username like "%"#{user.username}"%"
	</select>
	
	
</mapper>
package com.itheima.test;

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.Before;
import org.junit.Test;

import com.itheima.mapper.UserMapper;
import com.itheima.pojo.QueryVo;
import com.itheima.pojo.User;

public class UserMapperTest {

	private SqlSessionFactory sqlSessionFactory;

	@Before
	public void init() throws Exception {
		String resource = "SqlMapConfig.xml";
		// 读取配置文件
		InputStream inputStream = Resources.getResourceAsStream(resource);
		// 创建工厂
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}

	@Test
	public void selectUserByUsername() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		
		QueryVo queryVo = new QueryVo();
		User u = new User();
		u.setUsername("小");
		queryVo.setUser(u);

		List<User> list = mapper.selectUserByUsername(queryVo);
		
		for (User user : list) {
			System.err.println(user);
		}
	}
}

输出映射

输出简单类型

需求:查询用户表数据条数

Mapper.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">
<!-- namespace:命名空间,作用:1.用于隔离sql 2.使用动态代理开发DAO,namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.itheima.mapper.UserMapper">
	
	<select id="selectCount" resultType="Integer">
		select count(*) from user
	</select>
	
</mapper>

Mapper接口

package com.itheima.mapper;

import java.util.List;

import com.itheima.pojo.QueryVo;
import com.itheima.pojo.User;

public interface UserMapper {
	
	/**
	 * @MethodName:selectCount
	 * @Description:
	 * @return
	 */
	public int selectCount();
	
}

测试方法

package com.itheima.test;

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.Before;
import org.junit.Test;

import com.itheima.mapper.UserMapper;
import com.itheima.pojo.QueryVo;
import com.itheima.pojo.User;

public class UserMapperTest {

	private SqlSessionFactory sqlSessionFactory;

	@Before
	public void init() throws Exception {
		String resource = "SqlMapConfig.xml";
		// 读取配置文件
		InputStream inputStream = Resources.getResourceAsStream(resource);
		// 创建工厂
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}

	@Test
	public void selectCount() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		
		int count = mapper.selectCount();
		System.out.println(count);
	}
}

输出pojo对象

resultType="POJO属性名"

输出pojo列表

resultType="集合中每个对象,也是POJO属性名"

resultMap

当表中字段和POJO属性不一致的时候,需要使用resultMap来映射

CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单id',
  `user_id` int(11) NOT NULL COMMENT '下单用户id',
  `number` varchar(32) NOT NULL COMMENT '订单号',
  `createtime` datetime NOT NULL COMMENT '创建订单时间',
  `note` varchar(100) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `FK_orders_1` (`user_id`),
  CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

 Order.java

package com.itheima.pojo;

import java.io.Serializable;
import java.util.Date;

public class Order implements Serializable {

	private static final long serialVersionUID = 1L;
	// 订单id
	private Integer id;
	// 用户id
	private Integer userId;
	// 订单号
	private String number;
	// 订单创建时间
	private Date createtime;
	// 备注
	private String note;
}

  OrderMapper.java

package com.itheima.mapper;

import java.util.List;

import com.itheima.pojo.Order;

public interface OrderMapper {

	/**
	 * @MethodName:selectAll
	 * @Description:查询所有的订单信息
	 * @return
	 */
	public List<Order> selectAll();
}

 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.itheima.mapper.OrderMapper">


	<!-- resultMap: 手动映射 -->
	<!-- 当单表查询的时候,可以只映射不一致的属性就可以了! -->
	<resultMap type="com.itheima.pojo.Order" id="orderMap">
		<!-- id: 主键映射:必须的(单表查询可以不写) -->
		<!-- column : 表中的字段名 -->
		<!-- property:对应着返回值类型的属性名 -->

		<id column="id" property="id" />

		<!-- 映射普通的属性 -->
		<result column="user_id" property="userId" />
	</resultMap>

	<select id="selectAll" resultMap="orderMap">
		select * from orders
	</select>

</mapper>

测试类

package com.itheima.test;

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.Before;
import org.junit.Test;

import com.itheima.mapper.OrderMapper;
import com.itheima.pojo.Order;

public class OrderMapperTest {

	private SqlSessionFactory sqlSessionFactory;

	@Before
	public void init() throws Exception {
		InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
		this.sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}

	@Test
	public void testQueryAll() {
		// 获取sqlSession
		SqlSession sqlSession = this.sqlSessionFactory.openSession();
		// 获取OrderMapper
		OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);

		List<Order> list = mapper.selectAll();
		
		for (Order order : list) {
			System.err.println(order);
		}
	}


}

动态SQL

if标签

作用

判断输入参数是否有效

<?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">
<!-- namespace:命名空间,作用:1.用于隔离sql 2.使用动态代理开发DAO,namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.itheima.mapper.UserMapper">

	<!-- 根据用户名称模糊查询用户信息 -->
	<select id="selectUserByUsername" parameterType="com.itheima.pojo.QueryVo" resultType="com.itheima.pojo.User">
		select * from user where 1=1
		<!-- if:判断输入参数是否有效 -->
		<if test="user.username!=null and user.username!=''">
			and username like "%"#{user.username}"%"
		</if>
		<if test="user.sex!=null and user.sex!=''">
			and sex = #{user.sex}
		</if>
		 
	</select>
	
	
</mapper>

where标签

作用

添加where关键字

校验SQL语句去掉第一个and

<?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">
<!-- namespace:命名空间,作用:1.用于隔离sql 2.使用动态代理开发DAO,namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.itheima.mapper.UserMapper">

	<!-- 根据用户名称模糊查询用户信息 -->
	<select id="selectUserByUsername" parameterType="com.itheima.pojo.QueryVo" resultType="com.itheima.pojo.User">
		select * from user
		<!-- where: 1、添加where关键字;2、校验SQL语句去掉第一个and -->
		<where>
			<!-- if:判断输入参数是否有效 -->
			<if test="user.username!=null and user.username!=''">
				and username like "%"#{user.username}"%"
			</if>
			<if test="user.sex!=null and user.sex!=''">
				and sex = #{user.sex}
			</if>
		 </where>
	</select>
	
</mapper>

sql标签

作用

提取重复SQL片段

include标签

作用

引入SQL片段

<?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">
<!-- namespace:命名空间,作用:1.用于隔离sql 2.使用动态代理开发DAO,namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.itheima.mapper.UserMapper">

	<!-- 提取SQL语句的重复代码 -->
	<sql id="selectId">
		select * from user
	</sql>
	
	<select id="selectUserById" parameterType="Integer" resultType="com.itheima.pojo.User">
		<include refid="selectId"/> where id = #{id}
	</select>
	
</mapper>

foreach标签

  • collection : 要遍历的集合名称
    • 当输入参数类型是数组类型时,那么collection = array
    • 当输入参数类型是集合类型时,那么collection = list
    • 当输入参数类型是POJO对象类型时,那么collection = 对象属性名
  • item: 遍历的每一个元素的名称:注意:这个名称必须和后面的占位符中的参数一致
  • separator: 遍历的分隔符;当遍历到最后一位时,不会帮我们添加分隔符了!
  • open: 遍历的前缀
  • close:遍历的后缀
package com.itheima.mapper;

import java.util.List;

import com.itheima.pojo.QueryVo;
import com.itheima.pojo.User;

public interface UserMapper {

	/**
	 * @MethodName:findUserByIds
	 * @Description:
	 * @param ids
	 * @return
	 */
	public List<User> findUserByIds(Integer[] ids);

}

 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">
<!-- namespace:命名空间,作用:1.用于隔离sql 2.使用动态代理开发DAO,namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.itheima.mapper.UserMapper">
	
	<select id="findUserByIds" parameterType="Integer" resultType="com.itheima.pojo.User">
		select * from user
		<where>
			<!-- 
				id in (1,10,26,28)
				foreach : 遍历输入参数
				collection : 要遍历的集合名称
					当输入参数类型是数组类型时,那么collection = array
					当输入参数类型是集合类型时,那么collection = list
					当输入参数类型是POJO对象类型时,那么collection = 对象属性名
				item: 遍历的每一个元素的名称:注意:这个名称必须和后面的占位符中的参数一致
				separator: 遍历的分隔符;当遍历到最后一位时,不会帮我们添加分隔符了!
				open: 遍历的前缀
				close:遍历的后缀
			 -->
			<foreach collection="array" item="id" separator="," open=" id in (" close=")">
				#{id}
			</foreach>
		</where>
	</select>
	
</mapper>
package com.itheima.test;

import static org.junit.Assert.*;

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.Before;
import org.junit.Test;

import com.itheima.mapper.UserMapper;
import com.itheima.pojo.QueryVo;
import com.itheima.pojo.User;

public class UserMapperTest {

	private SqlSessionFactory sqlSessionFactory;

	@Before
	public void init() throws Exception {
		String resource = "SqlMapConfig.xml";
		// 读取配置文件
		InputStream inputStream = Resources.getResourceAsStream(resource);
		// 创建工厂
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	
	@Test
	public void findUserByIds() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		
		Integer [] ids = {1,10,27};
		List<User> list = mapper.findUserByIds(ids);
		for (User user : list) {
			System.err.println(user);
		}
	}
}

集合

package com.itheima.mapper;

import java.util.List;

import com.itheima.pojo.QueryVo;
import com.itheima.pojo.User;

public interface UserMapper {

	/**
	 * @MethodName:findUserByIds
	 * @Description:
	 * @param ids
	 * @return
	 */
	public List<User> findUserByIds(List<Integer> ids);

}
<?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">
<!-- namespace:命名空间,作用:1.用于隔离sql 2.使用动态代理开发DAO,namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.itheima.mapper.UserMapper">
	
	<select id="findUserByIds" parameterType="Integer" resultType="com.itheima.pojo.User">
		select * from user
		<where>
			<!-- 
				id in (1,10,26,28)
				foreach : 遍历输入参数
				collection : 要遍历的集合名称
					当输入参数类型是数组类型时,那么collection = array
					当输入参数类型是集合类型时,那么collection = list
					当输入参数类型是POJO对象类型时,那么collection = 对象属性名
				item: 遍历的每一个元素的名称:注意:这个名称必须和后面的占位符中的参数一致
				separator: 遍历的分隔符;当遍历到最后一位时,不会帮我们添加分隔符了!
				open: 遍历的前缀
				close:遍历的后缀
			 -->
			<foreach collection="list" item="id" separator="," open=" id in (" close=")">
				#{id}
			</foreach>
		</where>
	</select>
	
</mapper>
package com.itheima.test;

import static org.junit.Assert.*;

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.Before;
import org.junit.Test;

import com.itheima.mapper.UserMapper;
import com.itheima.pojo.QueryVo;
import com.itheima.pojo.User;

public class UserMapperTest {

	private SqlSessionFactory sqlSessionFactory;

	@Before
	public void init() throws Exception {
		String resource = "SqlMapConfig.xml";
		// 读取配置文件
		InputStream inputStream = Resources.getResourceAsStream(resource);
		// 创建工厂
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	
	@Test
	public void findUserByIds() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		
		List<Integer> ids = new ArrayList<>();
		ids.add(1);
		ids.add(10);
		ids.add(27);
		List<User> list = mapper.findUserByIds(ids);
		for (User user : list) {
			System.err.println(user);
		}
	}
}

POJO对象

package com.itheima.mapper;

import java.util.List;

import com.itheima.pojo.QueryVo;
import com.itheima.pojo.User;

public interface UserMapper {

        /**
	 * @MethodName:findUserByIds
	 * @Description:
	 * @param queryVo
	 * @return
	 */
	public List<User> findUserByIds(QueryVo queryVo);


}
<?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">
<!-- namespace:命名空间,作用:1.用于隔离sql 2.使用动态代理开发DAO,namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.itheima.mapper.UserMapper">
	
	<select id="findUserByIds" parameterType="com.itheima.pojo.QueryVo" resultType="com.itheima.pojo.User">
		select * from user
		<where>
			<!-- 
				id in (1,10,26,28)
				foreach : 遍历输入参数
				collection : 要遍历的集合名称
					当输入参数类型是数组类型时,那么collection = array
					当输入参数类型是集合类型时,那么collection = list
					当输入参数类型是POJO对象类型时,那么collection = 对象属性名
				item: 遍历的每一个元素的名称:注意:这个名称必须和后面的占位符中的参数一致
				separator: 遍历的分隔符;当遍历到最后一位时,不会帮我们添加分隔符了!
				open: 遍历的前缀
				close:遍历的后缀
			 -->
			<foreach collection="ids" item="id" separator="," open=" id in (" close=")">
				#{id}
			</foreach>
		</where>
	</select>
	
</mapper>
package com.itheima.test;

import static org.junit.Assert.*;

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.Before;
import org.junit.Test;

import com.itheima.mapper.UserMapper;
import com.itheima.pojo.QueryVo;
import com.itheima.pojo.User;

public class UserMapperTest {

	private SqlSessionFactory sqlSessionFactory;

	@Before
	public void init() throws Exception {
		String resource = "SqlMapConfig.xml";
		// 读取配置文件
		InputStream inputStream = Resources.getResourceAsStream(resource);
		// 创建工厂
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	
	@Test
	public void findUserByIds() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		
		QueryVo queryVo = new QueryVo();
		
		List<Integer> ids = new ArrayList<>();
		ids.add(1);
		ids.add(10);
		ids.add(27);
		queryVo.setIds(ids);
		List<User> list = mapper.findUserByIds(queryVo);
		for (User user : list) {
			System.err.println(user);
		}
		
	}
}

猜你喜欢

转载自blog.csdn.net/qq_35537301/article/details/82228108