基于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

标签:Mybatis,映射
0
投稿

猜你喜欢

  • C#基于TCP协议的服务器端和客户端通信编程的基础教程

    2023-08-20 13:09:55
  • Android表格自定义控件使用详解

    2023-12-23 23:35:36
  • 浅谈java中BigDecimal的equals与compareTo的区别

    2023-09-02 07:20:22
  • Asp.Net中MVC缓存详解

    2023-06-08 13:44:45
  • Swagger及knife4j的基本使用详解

    2023-02-13 09:34:00
  • Java经典面试题最全汇总208道(三)

    2023-11-15 23:30:42
  • apache ant进行zip解压缩操作示例分享

    2021-11-08 09:16:03
  • C#把数组中的某个元素取出来放到第一个位置的实现方法

    2021-11-26 00:17:36
  • 深入浅析java中flyway使用简介

    2022-06-05 20:45:45
  • SpringBoot如何返回Json数据格式

    2023-01-12 16:28:51
  • log4j使用教程详解(怎么使用log4j2)

    2022-06-18 23:48:47
  • C#实现微信红包功能

    2023-11-30 02:49:51
  • c#异常处理示例分享

    2022-09-10 23:20:54
  • Android NTP 时间同步机制详解

    2023-03-29 23:02:09
  • Java并发编程之Exchanger方法详解

    2022-08-22 02:44:41
  • C#实现只运行单个实例应用程序的方法(使用VB.Net的IsSingleInstance)

    2023-06-16 07:54:29
  • 三行Android代码实现白天夜间模式流畅切换

    2021-06-11 08:15:12
  • 微信公众平台开发教程(三) 基础框架搭建

    2022-08-12 00:33:50
  • Android自定义状态栏颜色与应用标题栏颜色一致

    2022-01-12 02:24:31
  • Maven构建生命周期详细介绍

    2023-04-06 13:02:59
  • asp之家 软件编程 m.aspxhome.com