Mybatis学习记录(3)
1.输出映射和输入映射
Mapper.xml映射文件定义了操作数据库的sql,每个sql就是一个statement,映射文件是mybatis的核心。
(1)parameterType(输入类型)
1.传递简单类型
使用占位符#{},或者${}进行sql拼接。
2.传递pojo对象
使用ognl表达式解析对象字段的值,#{}或者${}括号中的值 为pojo属性名称。
3.传递pojo包装对象
开发中可以通过使用pojo传递查询条件,查询的条件可能是综合的查询条件,这时可以使用包装对象传递输入参数。
包装对象:Pojo类中的一个属性是另一个pojo
即新建一个queryInfo类将所需要的查询条件全部声明到此类中,并生成get,set方法。
编写QueryInfo类 UserQueryInfo.java

package com.javaweb.mybatis.model.queryInfo;
import java.io.Serializable;
import com.javaweb.mybatis.model.User;
public class UserQueryInfo implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
Mapper.xml配置文件
<!-- 根据用户名模糊查询 -->
<select id="findUserByQueryInfo" parameterType="com.javaweb.mybatis.model.queryInfo.UserQueryInfo" resultType="com.javaweb.mybatis.model.User">
select * from mybatis_user where username like "%${user.userName}%"
</select>
Mapper接口
public interface UserMapper {
/**
* 遵循四个原则
* 1.接口方法名 ==User.xml中的id名
* 2.返回值类型与Mapper.xml的返回值类型一致
* 3.方法的入参类型与Mapper.xml中的入参类型一致
* 4.命名空间绑定此接口,即Mapper.xml的namespace是此接口的路径
*/
public List<User> findUserByQueryInfo(UserQueryInfo queryInfo);
Jubit单元测试类:
@Test
public void testMapperQueryInfo() throws Exception{
//加载核心配置文件
String resource="sqlMapConfig.xml";
InputStream in=Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession sqlSession=sqlSessionFactory.openSession(); //SqlSession帮我生成一个实现类
UserMapper userMapper=sqlSession.getMapper(UserMapper.class); UserQueryInfo queryInfo =new UserQueryInfo();
User user=new User();
user.setUserName("王");
queryInfo.setUser(user); List<User> userList=userMapper.findUserByQueryInfo(queryInfo);
for(User u:userList){
System.out.println(u);
}
}
2.resultType(输出类型)
(1)输出简单类型
需求查询用户表的数据总条数
Mapper接口:
public interface UserMapper {
/**
* 遵循四个原则
* 1.接口方法名 ==User.xml中的id名
* 2.返回值类型与Mapper.xml的返回值类型一致
* 3.方法的入参类型与Mapper.xml中的入参类型一致
* 4.命名空间绑定此接口,即Mapper.xml的namespace是此接口的路径
*/
//查询数据条数
public Integer countUser();
Mapper.xml配置文件
<!-- 查询数据条数 -->
<select id="countUser" resultType="Integer">
select count(1) from mybatis_user where 1=1 and id=2
</select>
Junit单元测试类:
@Test
public void testMapperCountUserQueryInfo() throws Exception{
//加载核心配置文件
String resource="sqlMapConfig.xml";
InputStream in=Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession sqlSession=sqlSessionFactory.openSession(); //SqlSession帮我生成一个实现类
UserMapper userMapper=sqlSession.getMapper(UserMapper.class); Integer countUser = userMapper.countUser();
System.out.println(countUser);
}
(2)输出pojo对象
见上一章
(3)输出pojo列表
见上一章
3.resultMap(输出类型)
resultType可以指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致才能映射成功。
但是如果是sql查询字段名和pojo的属性名不一致,就可以通过resultMap将字段名和属性名手动做一个对应关系,resultMap实质上还需要将查询结果映射到pojo对象中。
resultMap可以实现将映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
示例:查询订单表order中的所有数据
数据库表构造如下:

Order对象order.java
public class Order implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String id;
private String userId;
private Integer number;
private String note;
private Date createTime;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Override
public String toString() {
return "Order [id=" + id + ", userId=" + userId + ", number=" + number + ", note=" + note + ", createTime="
+ createTime + "]";
}
OrderMapper.java接口
/**
* 订单接口
* @author fanyukai
*
*/
public interface OrderMapper { public List<Order> orderList();
}
Mapper.xml配置文件
<mapper namespace="com.javaweb.mybatis.mapper.OrderMapper">
<!-- id:设置resultMap的id -->
<resultMap type="com.javaweb.mybatis.model.Order" id="orders">
<!-- 定义主键 -->
<!-- property:主键在pojo的属性名 -->
<!-- colunm:主键在数据库中的列名 -->
<id property="id" column="id" /> <!-- 定义普通属性 -->
<result column="user_id" property="userId"/>
</resultMap> <!-- 查询所有订单 -->
<select id="orderList" resultMap="orders">
select id,user_id,number,note,createtime from mybatis_orders
</select>
</mapper>
Junit单元测试类:
@Test
public void testMapperOrderList() throws Exception{
//加载核心配置文件
String resource="sqlMapConfig.xml";
InputStream in=Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession sqlSession=sqlSessionFactory.openSession(); //SqlSession帮我生成一个实现类
OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class); List<Order> orderList=orderMapper.orderList();
for(Order orders :orderList){
System.out.println(orders);
}
}
3.动态sql
(1)通过mybatis提供的各种标签方法实现动态拼接sql
<sql>和<include>标签


(2)where,if 标签

4.关联查询
一对一关联:一份订单对应一个用户
使用resultMap,定义专门的resultMap用于映射一对一查询结果
sql语句:
select
o.id,
o.user_id,
o.number,
o.note,
o.createtime,
u.id,
u.username
FROM mybatis_orders o
LEFT JOIN mybatis_user u
ON o.user_id=u.id
改造pojo类
public class Order implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String id;
private String userId;
private Integer number;
private String note;
private Date createTime;
//附加对象 用户对象
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
/* 后面get,set方法省略*/
Mapper.xml配置文件
<resultMap type="com.javaweb.mybatis.model.Order" id="order">
<!-- 定义普通属性 -->
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createTime"/> <!-- 一对一 -->
<association property="user" javaType="com.javaweb.mybatis.model.User" >
<id column="id" property="user_id"/>
<result column="userName" property="userName"/>
</association>
</resultMap> <!-- 一对一关联查询 以订单为中心关联用户 -->
<select id="selectOrder" resultMap="order">
select
o.id,
o.user_id,
o.number,
o.note,
o.createtime,
u.id,
u.username
FROM mybatis_orders o
LEFT JOIN mybatis_user u
ON o.user_id=u.id
</select>
Mapper接口:
public interface OrderMapper {
//一对一关联查询 以订单为中心关联用户
public List<Order> selectOrder();
Junit单元测试类:
@Test
public void testMapperOrderOneToOne() throws Exception{
//加载核心配置文件
String resource="sqlMapConfig.xml";
InputStream in=Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession sqlSession=sqlSessionFactory.openSession(); //SqlSession帮我生成一个实现类
OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class); List<Order> orderList=orderMapper.selectOrder();
for(Order orders :orderList){
System.out.println(orders);
}
}
一对多关联:一个用户对应多个订单
sql语句
select
o.id,
o.user_id,
o.number,
o.note,
o.createtime,
u.username
FROM mybatis_user u
LEFT JOIN mybatis_orders o
ON o.user_id=u.id
改造pojo类 User.java:
public class User implements Serializable{
/**
* user表的pojo对象
*/
private static final long serialVersionUID = 1L;
private String id;
private String userName;
private String userAge;
private String userSex;
private String userAddress;
//附加对象list 一对多
private List<Order> orderList;
public List<Order> getOrderList() {
return orderList;
}
public void setOrderList(List<Order> orderList) {
this.orderList = orderList;
}
/*后面get,set方法省略*/
Mapper.xml配置文件:
<!-- 一对多 以用户为中心-->
<resultMap type="com.javaweb.mybatis.model.User" id="user">
<id column="id" property="id"/>
<result column="username" property="userName"/> <!-- 一对多 -->
<collection property="orderList" ofType="com.javaweb.mybatis.model.Order">
<!-- 配置主键,是关联Order的唯一标识 -->
<id column="id" property="id"/>
<result column="number" property="userName"/>
<result column="user_id" property="userId"/>
<result column="note" property="note"/>
<result column="createtime" property="createTime"/>
</collection> </resultMap>
<select id="selectUserList" resultMap="order">
select
o.id,
o.user_id,
o.number,
o.note,
o.createtime,
u.username
FROM mybatis_user u
LEFT JOIN mybatis_orders o
ON o.user_id=u.id
</select>
Mapper接口:
public interface OrderMapper {
//一对多关联
public List<User> selectUserList();
}
Junit单元测试类:
@Test
public void testMapperOrderOneToMany() throws Exception{
//加载核心配置文件
String resource="sqlMapConfig.xml";
InputStream in=Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession sqlSession=sqlSessionFactory.openSession(); //SqlSession帮我生成一个实现类
OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class); List<User> selectUserList = orderMapper.selectUserList();
for(User user :selectUserList){
System.out.println(user);
}
}
Mybatis学习记录(3)的更多相关文章
- MyBatis 学习记录5 MyBatis的二级缓存
主题 之前学习了一下MyBatis的一级缓存,主要涉及到BaseExecutor这个类. 现在准备学习记录下MyBatis二级缓存. 配置二级缓存与初始化发生的事情 首先二级缓存默认是不开启的,需要自 ...
- MyBatis 学习记录3 MapperMethod类
主题 之前学习了一下MapperProxy的生产过程,自定义Mapper类的对象是通过动态代理生产的,调用自定义方法的时候实际上是调用了MapperMethod的execute方法:mapperMet ...
- MyBatis 学习记录7 一个Bug引发的思考
主题 这次学习MyBatis的主题我想记录一个使用起来可能会遇到,但是没有经验的话很不好解决的BUG,在特定情况下很容易发生. 异常 java.lang.IllegalArgumentExceptio ...
- MyBatis 学习记录6 TypeHandler
主题 因为对MyBatis在JDBC数据和Java对象之间数据转化比较感兴趣,所以就记录并学习一下TypeHandler. 使用场景 如上图所示,观察下接口方法就能明白.TypeHandler主要用于 ...
- MyBatis 学习记录4 MyBatis的一级缓存
主题 分享记录一下MyBatis的一级缓存相关的学习. Demo public static void firstLevelCache() { init("mybatis-config.xm ...
- mybatis 学习记录1
起因 以前刚学习java三大框架的时候持久层框架我是自学的是hibernate..感觉蛮好用的,so easy..后来大三实习公司用的是jpa(hibernate外包装一层)...再后来工作1年多用的 ...
- mybatis学习记录六——一对一、一对多和多对多查询
9 订单商品数据模型 9.1 数据模型分析思路 1.每张表记录的数据内容 分模块对每张表记录的内容进行熟悉,相当 于你学习系统 需求(功能)的过程. 2.每张表重要的字段设置 非空 ...
- Mybatis学习记录(六)----Mybatis的高级映射
1.一对多查询 1.1 需求 查询订单及订单明细的信息. 1.2 sql语句 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查询基础上添加订单明细表关联即可. SELECT orders. ...
- Mybatis学习记录(五)----Mybatis的动态SQL
1. 什么是动态sql mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.1 需求 用户信息综合查询列表和用户信息查询列表总数这两个statemen ...
- MyBatis 学习记录1 一个简单的demo
主题 最近(N个月前)clone了mybatis的源码..感觉相比于spring真的非常小...然后看了看代码觉得写得很精简...感觉我的写代码思路和这个框架比较相似(很难具体描述...就是相对来说比 ...
随机推荐
- struts 日期组件
1.组件文件夹 datepicker 一般放在WebRoot/js下. 2.前台页面: 在head里面:引入 <script type="text/javascript" ...
- 《Python数据科学手册》第五章机器学习的笔记
目录 <Python数据科学手册>第五章机器学习的笔记 0. 写在前面 1. 判定系数 2. 朴素贝叶斯 3. 自举重采样方法 4. 白化 5. 机器学习章节总结 <Python数据 ...
- eclipse中windows下的preferences左栏没有tomcat?
是因为缺少eclipse for tomcat 插件,到http://www.eclipsetotale.com/tomcatPlugin.html此网站下载,我的eclipse版本是4.4版本的,所 ...
- [TCP/IP]IP协议
IP数据报 IP是TCP/IP协议族中最核心的协议,所有的TCP.UDP.ICMP.IGMP数据都以IP数据报的格式传输.IP仅提供尽力而为的传输服务,如果发生某种错误,IP会丢失该数据,然后发送IC ...
- java中实现定时任务 task 或quartz
转载大神的 https://www.cnblogs.com/hafiz/p/6159106.html https://www.cnblogs.com/luchangyou/p/6856725.html ...
- 使用表达式目录树实现SqlDataReader到实体的映射
SqlDataReader映射实体,是ORM的基础功能,常见的实现方式有反射.表达式目录树和emit,这里要说的就是用表达式目录树生成实体的方法. 先分析下思路: 假设有个数据实体类,Student ...
- 项目模板eShopOnContainers
.NET Core多平台项目模板eShopOnContainers编译手记 之前写了一个功能性的文件上传asp.net core的小程序,加上点七七八八的东西,勉强能够应付了,打算学习一下微软的官 ...
- NET Core2
NET Core的介绍 .NET Core 是一个通用开发平台,它由微软和开源社区共同管理(git hub的.NET开源社区): 他支持Windows,macOS和Linux,并且可以运行在硬件设 ...
- 1550: Simple String 最大流解法
http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1550 很久以前做的一题,当时队友用最大流做,现在我也是 这个转化为二分图多重匹配,就是一样的意 ...
- 自定义Spring Security的身份验证失败处理
1.概述 在本快速教程中,我们将演示如何在Spring Boot应用程序中自定义Spring Security的身份验证失败处理.目标是使用表单登录方法对用户进行身份验证. 2.认证和授权(Authe ...