目录
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();
}
- 测试结果