基于Mybatis映射的一点心得(分享)

以前一直使用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映射的一点心得(分享)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • MyBatis中的JdbcType映射使用详解

    Java项目涉及到数据库交互,以往常用的是JDBC,现在则有Hibernate.Mybatis等这些持久化支持. 项目中用到了MyBatis,和JDBC最显著的区别,就是SQL语句配置化,通过xml文件定义SQL语句,当然JDBC也可以将SQL配置化,需要定制开发,MyBatis则直接支持这种方法. 官方对于MyBatis的介绍, MyBatis is a first class persistence framework with support for custom SQL, stored

  • Mybaits的特点及优点

    什么是mybatis,mybatis有什么特点,下面先给大家介绍下mybatis的概念及特点. jdbc开发优缺点: 1)优点:简单易学,上手快,非常灵活构建SQL,效率高 2)缺点:代码繁琐,难以写出高质量的代码(例如:资源的释放,SQL注入安全性等) 开发者既要写业务逻辑,又要写对象的创建和销毁,必须管底层具体数据库的语法 (例如:分页). 3)适合于超大批量数据的操作,速度快 hibernate开发优缺点: 1)优点:不用写SQL,完全以面向对象的方式设计和访问,不用管底层具体数据库的语法

  • mybatis某些字段无法映射成功的解决

    随笔记录下: 刚刚遇到一个mybatis中reultMap定义正确column与property也都正确,字段的getset方法也都有,但是返回对象时,有些字段可以对应上有一些则不可以. 找了好久才发现在sql语句中的 resultMap 写成了 resultType... 很low但是痛.改成resultMap一切正常! 补充知识:MyBatis学习总结--解决字段名与实体类属性名不相同的冲突 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况

  • MyBaits 入门之MyBatis环境搭建(第一篇)

    MyBatis 简介 MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis. MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Object

  • Mybaits通用的10种写法总结大全

    前言 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录. 用来循环容器的标签forEach,查看例子 foreach元素的属性主要有item,index,collection,open,sepa

  • mybaits非配置原因,导致SqlSession was not registered for synchronization异常

    今天运行程序时报了 SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@69d4fb43] was not registered for synchronization because synchronization is not active [11:03:17]-Closing non transactional SqlSession [org.apache.ibatis.session.defaults.Defa

  • Mybatis自定义SQL的关系映射、分页、排序功能的实现

    目的: 记录数据库表与实体对象之间不同的映射关系如何用mybatis的自定义sql和结果返回集处理. 1.三种对象映射关系 1.1 一对一 一个人对应一个身份证,一位同学对应一个班级,每个房间都有自己的房间号,当一个事物它对应另一个事物是唯一的,那么它们之间的关系就是一对一的. 这里我演示的案例是,一个学生有着一位老师 老师基础信息: 学生详细信息: 如果说,我们需要将两个表一起查出来,我们可以这么做: 问题: 如果对象的列重复了,必须要使用到别名 1.先定义实体结构,也就是我们返结果的实体类

  • Mybaits配置文件之动态SQL配置备忘录

    动态参数拼接的查询语句 –传入参数类型为自定义数据类型 <select id="queryMessageList" parameterType="com.imooc.bean.Message" resultMap="MessageResult"> select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE where 1=1 <if test="command !=null &

  • 解决mybatis 数据库date 与 java中Date类型映射问题

    使用mybatis 从数据库中查询出date 类型字段,在java 类型中只看到了日期,没有看到时分秒, 从数据库中是可以看到时分秒的.后来发现是mybatis 映射数据类型的原因: 如: <result column="CREATEDATE" property="createdate" jdbcType="Date" /> 映射出来的时间格式时分秒都为0 (2017-01=12 00:00:00) <result column

  • 解决mybatis映射结果集失效的问题

    在开发中可能会遇到这样的问题,使用mybatis进行结果集与实体类之间的关系映射时,可能会出现某些属性映射不上去的情况. 为了方便排查问题我们需要查看mybatis访问数据库SQL信息. 可以在配置Log4J: log4j.logger.com.xxx.dao=TRACE log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = DEBUG log4j.logger.com.ibatis.common.jdbc.ScriptRunner = D

  • MyBatis映射文件resultMap元素中使用多个association的方法

    现在有一张订单表t_stockorder,其拥有id.code.client_id.merchandise_id.merchandise_number.order_date.operator_id这些字段,其中client_id关联t_client表中code字段,merchandise_id关联t_merchandise表的code字段,operator_id关联t_employee表的code字段. 现在要通过SQL语句将订单表中t_stockorder的数据全部查询出来,SQL语句如下所示

  • mybatis-plus实体类中出现非数据库映射字段解决办法

    在使用mybatis 或者其它mybatis的二次开发框架时(例如mybatis-plus),有时候数据库中的字段和实体类中的字段可能不一致.例如数据库中只有3个字段,而实体类中除了数据库中对应映射的三个字段以外还有多余的其余字段,例如实体类中有5个字段.那么运行就会报错 如果需要在mybatis映射实体类中加入非数据库映射字段.那么可以使用@TableField(exist = false)进行标识对应字段不属于数据库的映射字段即可. 当然可以点击进入@TableField(exist = f

随机推荐