基于Mybatis映射的一点心得(分享)
作者:红尾巴的猪 发布时间:2023-08-08 13:15:53
以前一直使用Hibernate,基本上没用过Mybatis,工作中需要做映射关系,简单的了解下Mybatis的映射。
两者相差不多都支持一对一,一对多,多对多,本章简单介绍一对一的使用以及注意点。
建表语句:
CREATE TABLE `bloc` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(255) collate utf8_bin default NULL,
`company_id` int(11) default NULL,
`intro` varchar(255) collate utf8_bin default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
INSERT INTO`bloc` (`id`, `name`, `company_id`, `intro`) VALUES ('1', '宏伟集团', '1', '跨国集团');
CREATE TABLE `company` (
`id` int(11) NOT NULL,
`name` varchar(255) collate utf8_bin default NULL,
`intro` varchar(255) collate utf8_bin default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
INSERT INTO company (`id`, `name`, `intro`) VALUES ('1', '', NULL);
形式一:子查询
JAVA代码:SqlSessionHelper.java
package com.demo.mybatis;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlSessionHelper {
public static SqlSessionFactory getSessionFactory() throws IOException{
SqlSessionFactory sessionFactory = null;
Reader reader = Resources.getResourceAsReader("configuration.xml");
try{
sessionFactory = new SqlSessionFactoryBuilder().build(reader);;
}catch(Exception ex){
ex.printStackTrace();
}
return sessionFactory;
}
}
Test.java:
package com.demo.mybatis;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import mapper.BlocMapper;
import model.Bloc;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
try{
SqlSession sqlSession = SqlSessionHelper.getSessionFactory().openSession();
BlocMapper blocMapper = sqlSession.getMapper(BlocMapper.class);
List<Bloc> blocs = blocMapper.getBlocList("1");
for (Bloc bloc : blocs) {
System.out.println("companyName = "bloc.getCompany().getName());
}
}catch(Exception ex){
System.out.println(ex.getMessage());
}
}
}
mapper:
package mapper;
import java.util.List;
import model.Bloc;
public interface BlocMapper {
public List<Bloc> getBlocList(String name);
}
package mapper;
public interface CompanyMapper {
}
model:
package model;
public class Bloc {
private Integer id;
private String name;
private String intro;
private Company company;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIntro() {
return intro;
}
public void setIntro(String intro) {
this.intro = intro;
}
public Company getCompany() {
return company;
}
public void setCompany(Company company) {
this.company = company;
}
}
package model;
public class Company {
private Integer id;
private String name;
private Integer intro;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getIntro() {
return intro;
}
public void setIntro(Integer intro) {
this.intro = intro;
}
}
映射配置如下:(如果是一堆多的话“brandObject”改成实体List属性association 改成collection )
<?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="mapper.CompanyMapper">
<resultMap id="BaseResultMap" type="model.Company" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="intro" property="intro" jdbcType="VARCHAR" />
</resultMap>
<select id = "getCompanyInfo" parameterType="Integer" resultMap="BaseResultMap">
select * from company where id = #{id}
</select>
</mapper>
<mapper namespace="mapper.BlocMapper">
<resultMap id="BaseResultMap" type="model.Bloc" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="intro" property="intro" jdbcType="VARCHAR" />
<association column="company_id" property="company" select="mapper.CompanyMapper.getCompanyInfo">
</association>
</resultMap>
<select id="getBlocList" parameterType="String" resultMap="BaseResultMap">
select * from bloc where name = #{name}
</select>
</mapper>
column:表中的字段 property:实体当中的字段名 select:引入的另一个xxxMapper.xml的getCompanyInfo方法
这样当查询用的映射时检测到有select就会执行你引入的另一个Mapper的查询方法,查询条件是company_id= 查询方法的参数
运行结果
companyName =
形式二:关联查询
映射配置实体测试类一样:
<?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="mapper.BlocMapper">
<resultMap id="BaseResultMap" type="model.Bloc" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="intro" property="intro" jdbcType="VARCHAR" />
<!-- 查询会有赋值紊乱问题 -->
<association column="company_id" property="company" resultMap = "mapper.CompanyMapper.BaseResultMap">
</association>
<!-- <association column="company_id" property="company" select="mapper.CompanyMapper.getCompanyInfo">
</association> -->
</resultMap>
<select id="getBlocList" parameterType="String" resultMap="BaseResultMap">
<!-- select * from bloc where name = #{name} -->
<!-- 查询会有赋值紊乱问题 -->
select * from bloc b left join company c on b.company_id = c.id where b.name = #{name}
</select>
</mapper>
column:表中的字段 property:实体当中的字段名 resultMap :引入另一个Mapper的映射
值得注意的是:因为是嵌套映射,所以形式二在两个实体字段名一样的情况下会引发字段赋值的紊乱,例如两个实体都有name 当第一个实体name有值,第二个实体name没有值的时候,查询出来的结果是两个实体name都有值,且都是一样的为第一个实体的name值
运行结果为
companyName = 宏伟集团
显然运行结果不是我们想要的结果
以上简单的Demo希望能帮助初学Mybatis童鞋!!
这篇基于Mybatis映射的一点心得(分享)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
来源:http://www.cnblogs.com/zhuxiansheng/p/7794292.html


猜你喜欢
- 在看别人的关于CopyOnWriteArrayList 这个类的时候,看到有人提出了关于:数组拷贝的方法Arrays.copyOf() 的问
- Java语言的垃圾回收1.垃圾回收机制的基本概念问:1.什么是Java垃圾回收?答:在Java语言的生命周期中,Java运行环境提供了一个系
- Java 线程同步根本上是要符合一个逻辑:加锁------>修改------>释放锁1、同步代码块示例如下:public cla
- 这篇文章主要介绍了Spring框架构造注入type属性实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- Android绘图操作,通过继承View实现,在onDraw函数中实现绘图。下面是一个简单的例子:public class AndroidT
- 本文实例为大家分享了PhotoView实现图片双击放大单击退出的具体代码,供大家参考,具体内容如下实现思路1.复制PhotoView&nbs
- 为什么我们要爬取数据在大数据时代,我们要获取更多数据,就要进行数据的挖掘、分析、筛选,比如当我们做一个项目的时候,需要大量真实的数据的时候,
- 通过子类调用父类的变量,有两种方法:1、把父类的变量设置成public:package triangle.opengl.wlz.stu.ch
- 一. Base64编码由来为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASC
- Maven本地jar引用的实现方法有的时候需要在maven工程项目中引用本地的jar,pom.xml配置如下:<dependency&
- 波浪球的效果一直都是想模仿的对象,在最近一段时间里模仿了这一界面,其实所用知识并不多。1)、波浪的效果是利用三角函数来实现的,在自定义vie
- 本文实例为大家分享了Android文本视图TextView实现聊天室的具体代码,供大家参考,具体内容如下Math.random()生成随机数
- 概述在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。也就是说,程序的流程对运行结果有直接的影响。所以,我们必须清楚每条
- JTable的排序是一个让人头疼的问题,Sun没有为排序这个最常用的功能提供类。但是近日翻看Sun官方java的tutorial,却发现其在
- 本文主要介绍了Maven实战之搭建Maven * 和镜像的方法(图文),分享给大家,具体如下:准备工作安装3.6.*的Nexus理论Nexus
- 相信大家一定遇到过某些App在手机桌面打开时会出现短暂或者几秒钟的白屏情况吧,没错那是应用程序启动后系统默认的背景色,此时应用的第一个Act
- Java中对象的创建clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一
- Lombok中@Builder用法1、建造者模式简介:Builder 使用创建者模式又叫建造者模式。简单来说,就是一步步创建一个对象,它对用
- 平时开发,基本不改变的常量我们都放在了配置项里,如properties或yml文件里,这个时候为了只在启动时候进行加载。如何做呢?我们通过s
- 背景项目中要实现横向列表的无限循环滚动,自然而然想到了RecyclerView,但我们常用的RecyclerView是不支持无限循环滚动的,