Java网课基础笔记(26)19-08-08

目录

Mybatis自定义别名

mappers(映射器)

输入映射和输出映射

parameterType(输入类型)

resultType(输出类型)

resultMap


Mybatis自定义别名

SqlMapConfig.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>
	<typeAliases>
		<!-- (大小写不敏感) -->
		<!-- 单个别名定义 -->
		<typeAlias alias="user" type="com.feng.pojo.User" />
		<!-- 批量定义别名, 扫描整个包下的类, 别名为类名 -->
		<package name="com.feng.pojo" />
	</typeAliases>
	<!-- 和spring整合后 environments配置将废除 -->
	<environments default="development">
		<environment id="development">
			<!-- 使用jdbc事务管理 -->
			<transactionManager type="JDBC" />
			<!-- 数据库连接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url"
					value="jdbc:mysql://localhost:3306/mybatis1?characterEncoding=utf-8" />
				<property name="username" value="root" />
				<property name="password" value="12345678" />
			</dataSource>
		</environment>
	</environments>
	<!-- 加载映射文件 -->
	<mappers>
		<mapper resource="sqlmap/User.xml" />
		<mapper resource="mapper/UserMapper.xml" />
	</mappers>
</configuration>


之后的配置文件com.feng.pojo.User换成设置的别名user即可。

mappers(映射器)

Mapper配置的集中方法:

  • <mapper resource="" />

      使用相对于路径的资源(现在的使用方式)

      如: <mapper resource="sqlmap/User.xml">

  • <mapper class="" />

     使用mapper接口类路径

     如:<mapper class="com.feng.dao.UserMapper" />

 
  • <package name="" />

     注册指定包下的所有mapper接口

     如:<package name="com.feng.mapper" />

注意: 此种方法要求mapper接口名称和mapper映射名称相同, 且放在同一个目录中

输入映射和输出映射

复制昨天的工程Java网课基础笔记(25),只保留Mapper接口开发相关的文件,其他的删除,最终如下图

Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心。

parameterType(输入类型)

  • 传递简单类型
  • <select id="queryUserById" parameterType="int"
    		resultType="com.feng.pojo.User">
    		SELECT * FROM user WHERE id = #{id}
    	</select>
  • 传递pojo对象

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

<update id="updateUserById" parameterType="com.feng.pojo.User">
		update user set
		username = #{username} where id = #{id}
	</update>
  • 传递pojo包装对象

开发中通过pojo传递查询条件,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。即pojo类中包含pojo类。 
例如这样一个需求:根据用户id查询用户信息,查询条件放到QueryVo类的user属性中。

1.package com.feng.vo下新建QueryVo类

public class QueryVo {
	private User user;

	public User getUser() {
		return user;
	}

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

2.UserMapper.xml映射文件中添加如下配置信息:

<mapper namespace="com.feng.mapper.UserMapper">
<select id="getUserByQueryVo" parameterType="queryVo" resultType="user">
    select * from user where username like '%${user.username}%'
</select>
</mapper>

3.UserMapper接口中添加如下方法:

List<User> getUserByQueryVo(QueryVo queryVo);

4.在测试类UserMapperTest.java增加一下方法

@Test
    public void testgetUserByQueryVo() {
        // 获取sqlSession, 和spring整合后由spring管理
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        // 从sqlSession中获取Mapper接口的代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 执行查询方法
        QueryVo queryVo=new QueryVo();
        User u=new  User();
        u.setUsername("王");
        queryVo.setUser(u);
        List<User> list = userMapper.getUserByQueryVo(queryVo);
        for (User user1 : list) {
            System.out.println(user1);
        }
        // 和spring整合后由spring管理
        sqlSession.close();
    }

5.测试结果

resultType(输出类型)

  • 输出简单类型

需求:查询用户表中的记录数

1.UserMapper.xml映射文件中添加如下配置信息:

<!-- 查询用户表中的记录数 -->
	<select id="getUserCount" resultType="int">
		SELECT COUNT(*) FROM user
	</select>

2.UserMapper接口中添加如下方法:

Integer getUserCount();

3.在测试类UserMapperTest.java增加一下方法

@Test
public void testGetUserCount() {
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // 获得mapper代理对象
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    // 执行查询
    int count = userMapper.getUserCount();
    System.out.println(count);
    sqlSession.close();
}

4.测试结果

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

  • 输出pojo对象
<select id="queryUserById" parameterType="int"
		resultType="com.feng.pojo.User">
		select * from user where id = #{id}
	</select>
  • 输出pojo列表
<select id="queryUserByUsername" parameterType="string"
		resultType="com.feng.pojo.User">
		select * from user where username like '%${value}%'
	</select>

resultMap

resultMap可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。 
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。 

  • 数据库字段名称

  • 在com.feng.pojo包下新建Orders类
package com.feng.pojo;

import java.util.Date;

public class Orders {
	private Integer id;
	//userId跟数据库的user_id对应,但是名字不一样
    private Integer userId;

    private String number;

    private Date createtime;

    private String note;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number == null ? null : number.trim();
    }

    public Date getCreatetime() {
        return createtime;
    }

    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note == null ? null : note.trim();
    }

	@Override
	public String toString() {
		return "Orders [id=" + id + ", userId=" + userId + ", number=" + number + ", createtime=" + createtime
				+ ", note=" + note + "]";
	}
    
}
  • 在com.feng.mapper包下新建OrderMapper.xml配置文件

type:指resultMap要映射成的数据类型(返回结果映射的pojo,可以使用别名)。
<id />:此属性表示查询结果集的唯一标识,非常重要。如果是多个字段为复合唯一约束则定义多个<id />。
property:表示Orders类的属性。
column:表示sql查询出来的字段名。 
column和property放在一块儿表示将sql查询出来的字段映射到指定的pojo类属性上。
<result />:普通列使用result标签映射。

<?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.feng.mapper.OrderMapper">
	<resultMap type="Orders" id="order_list_result_map">
		<!-- id是主键的映射,其中property是pojo中主键的属性,column是返回结果中主键的列 -->
		<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>
	<select id="getOrderListResultMap" resultMap="order_list_result_map" resultType="com.feng.pojo.Orders">
    select id,user_id,number,createtime,note from orders
</select>
</mapper>
  • OrderMapper接口
public interface OrderMapper {
	 List<Orders> getOrderList();
}
  • 在测试类UserMapperTest.java增加一下方法
@Test
    public void testGetOrderListResultMap() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
        List<Orders> orderList = orderMapper.getOrderListResultMap();
        for (Orders orders : orderList) {
            System.out.println(orders);
        }
        sqlSession.close();
    }
  • 测试结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值