mybatis的输入和输出映射

引入约束:

<?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="test">
 </mapper>

namespace 命名空间,用于隔离sql语句,使用接口代理的时候关联接口(填写接口的全路径)

<!-- 根据id获取用户信息 -->
	<select id="findUserById" parameterType="int" resultType="mybatis.po.User">
		select * from user where id = #{id}
	</select>

parameterType:定义输入到sql中的映射类型,#{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql

              ${value}表示使用参数将${value}替换,做字符串的拼接。

#{}表示一个占位符号

${}表示拼接sql

注意:如果是取简单数量类型的参数,括号中的值必须为value,


添加selectKey实现将主键返回

<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
			select LAST_INSERT_ID()
</selectKey>

keyProperty:返回的主键存储在pojo中的哪个属性

orderselectKey的执行顺序,是相对与insert语句来说,由于mysql的自增原理执行完insert语句之后才将主键生成,所以这里selectKey的执行顺序为after

resultType:返回的主键是什么类型

LAST_INSERT_ID():mysql的函数,返回auto_increment自增列新记录id值。

select uuid():返回的是随机的字符串


 parameterType(输入类型)


1:传递简单类型
2:传递pojo对象       

            mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo属性名称

3:传递pojo包装对象

    开发中通过pojo传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。

    例:根据用户名查询用户信息,查询条件放到QueryVouser属性中。

        
public class QueryVo {

	private User user;

	public User getUser() {
		returnuser;
	}

	publicvoid setUser(User user) {
		this.user = user;
	}
	
	
}
    

        Mapper文件:

<!-- 使用包装类型查询用户 
		使用ognl从对象中取属性值,如果是包装对象可以使用.操作符来取内容部的属性
	-->
	<select id="findUserByQueryVo" parameterType="QueryVo" resultType="user">
		SELECT * FROM user where username like '%${user.username}%'
	</select>
        

         接口文件方法:

    public List<User> findUserByQueryVo(QueryVo queryVo);

  

resultType(输出类型)


    1:简单的输出类型         

        输出简单类型必须查询出来的结果集有一条记录,最终将第一个字段的值转换为输出类型。

    2:输出pojo对象
    3:输出pojo列表(集合)
    4:resultMap 

    如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系,resultMap实质上还需要将查询结果映射到pojo对象中。

                resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojolist实现一对一查询和一对多查询。

           

id :此属性表示查询结果集的唯一标识,非常重要。如果是多个字段为复合唯一约束则定义多个<id />

property:表示User类的属性。

column:表示sql查询出来的字段名。

columnproperty放在一块儿表示将sql查询出来的字段映射到指定的pojo类属性上。

<result />:普通结果,即pojo的属性。


映射文件一对一配置


使用association完成关联查询

pojo:

public class Order {
	private Integer id;
	private Integer userId;
	private String number;
	private Date createtime;
	private String note;
        private User user;

Mapper.xml

<!-- 查询订单关联用户信息使用resultmap -->
	<result Maptype="Orders" id="orderUserResultMap">
		<id column="id" property="id"/>
		<result column="user_id" property="userId"/>
		<result column="number" property="number"/>
		<result column="createtime" property="createtime"/>
		<result column="note" property="note"/>
		<!-- 一对一关联映射 -->
		<!-- 
		property:Orders对象的user属性
		javaType:user属性对应 的类型
		 -->
		<association property="user"javaType="cn.po.User">
			<!-- column:user表的主键对应的列  property:user对象中id属性-->
			<idcolumn="user_id"property="id"/>
			<resultcolumn="username"property="username"/>
			<resultcolumn="address"property="address"/>
		</association>
	</resultMap>
	<select id="findOrdersWithUserResultMap" resultMap="orderUserResultMap">
		SELECT
			o.id,
			o.user_id,
			o.number,
			o.createtime,
			o.note,
			u.username,
			u.address
		FROM
			orders o
		JOIN `user` u ON u.id = o.user_id
	</select>

这里resultMap指定orderUserResultMap

association表示进行关联查询单条记录

property表示关联查询的结果存储在cn.po.Ordersuser属性中

javaType表示关联查询的结果类型

<id property="id" column="user_id"/>查询结果的user_id列对应关联对象的id属性,这里是<id />表示user_id是关联查询对象的唯一标识。

<result property="username" column="username"/>查询结果的username列对应关联对象的username属性。

Mapper接口:


public List<Orders> findOrdersListResultMap():

 测试:

public void testfindOrdersListResultMap()throws Exception{
		//获取session
		SqlSession session = sqlSessionFactory.openSession();
		//获限mapper接口实例
		UserMapper userMapper = session.getMapper(UserMapper.class);
		//查询订单信息
		List<Orders> list = userMapper.findOrdersList2();
		System.out.println(list);
		//关闭session
		session.close();
	}

映射文件一对多配置

使用collection完成关联查询


pojo:

public class User {
	private Integer id;
	private String username;// 用户姓名
	private String sex;// 性别
	private Date birthday;// 生日
	private String address;// 地址
	private List<Order> orders;

 Mapper.xml


<resultMap type="user" id="userOrderResultMap">
		<!-- 用户信息映射 -->
		<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"/>
		<!-- 一对多关联映射 -->
		<collection property="orders" ofType="orders">
			<id property="id" column="oid"/>	
		<!--用户id已经在user对象中存在,此处可以不设置-->
			<!-- <result property="userId" column="id"/> -->
			<resultproperty="number"column="number"/>
			<resultproperty="createtime"column="createtime"/>
			<resultproperty="note"column="note"/>
		</collection>
	</resultMap>
	<selectid="getUserOrderList"resultMap="userOrderResultMap">
		SELECT
		u.*, o.id oid,
		o.number,
		o.createtime,
		o.note
		FROM
		`user` u
		LEFT JOIN orders o ON u.id = o.user_id
	</select>

collection部分定义了用户关联的订单信息。表示关联查询结果集

property="orders"关联查询的结果集存储在User对象的上哪个属性。

ofType="orders"指定关联查询的结果集中的对象类型即List中的对象类型。此处可以使用别名,也可以使用全限定名。

<id /><result/>的意义同一对一查询。

 Mapper接口:

List<User> getUserOrderList();

测试

@Test
	public void getUserOrderList() {
		SqlSession session = sqlSessionFactory.openSession();
		UserMapper userMapper = session.getMapper(UserMapper.class);
		List<User>result = userMapper.getUserOrderList();
		for (User user : result) {
			System.out.println(user);
		}
		session.close();
	}





猜你喜欢

转载自blog.csdn.net/wyb_night/article/details/80207215