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

以前一直使用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童鞋!!

这篇基于Mybaits映射的一点心得(分享)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • MyBatis高级映射学习教程

    对mybatis基础入门不太清楚的朋友可以参考下本篇文章:MyBatis入门学习教程(一)-MyBatis快速入门. 认识MyBatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .2013年11月迁移到Github. iBATIS一词来源于"internet"和"abatis"的组合,是一个基于Java的持久层框架

  • MyBatis高级映射和查询缓存

     mybatis框架执行过程: 1.配置mybatis的配置文件,SqlMapConfig.xml(名称不固定) 2.通过配置文件,加载mybatis运行环境,创建SqlSessionFactory会话工厂 SqlSessionFactory在实际使用时按单例方式. 3.通过SqlSessionFactory创建SqlSession SqlSession是一个面向用户接口(提供操作数据库方法),实现对象是线程不安全的,建议sqlSession应用场合在方法体内. 4.调用sqlSession的方

  • 基于mybatis高级映射多对多查询的实现

    1.同以前一样,首先给一个使用多对多的需求, 要查询用户以及用户所购买的商品信息,经过分析用户和商品数据库级别没有任何关系,用户和商品需要建立关系,要通过订单,订单明细建立关系.根据这个需求,可以分析出需要查询的主表为: 查询主表:用户表 查询关联表:由于商品和用户没有关系,通过订单和订单明细进行关联,所以得出关联表是:orders订单表,orderDetail订单明细表,items商品表.这样的话,sql该如何去写?这样写: select orders.*, t_user.id user_id

  • Mybatis映射文件实例详解

     一.输入映射 parameterType 指定输入参数的Java类型,可以使用别名或者类的全限定名.它可以接收简单类型.POJO.HashMap. 1.传递简单类型 根据用户ID查询用户信息: <select id="findUserById" parameterType="int" resultType="com.itheima.mybatis.po.User"> SELECT * FROM USER WHERE id =#{id

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

    以前一直使用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,

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

  • 基于JavaScript 性能优化技巧心得(分享)

    JavaScript 作为当前最为常见的直译式脚本语言,已经广泛应用于 Web 应用开发中.为了提高Web应用的性能,从 JavaScript 的性能优化方向入手,会是一个很好的选择. 本文从加载.上下文.解析.编译.执行和捆绑等多个方面来讲解 JavaScript 的性能优化技巧,以便让更多的前端开发人员掌握这方面知识. 什么是高性能的 JavaScript 代码? 尽管目前没有高性能代码的绝对定义,但却存在一个以用户为中心的性能模型,可以用作参考:RAIL模型. 响应 如果你的应用程序能在1

  • 基于tomcat映射路径配置方法分享

    tomcat请求头配置 在使用postman测试的时候(携带参数)我们经常会发现浏览器一个错误:request header is too large,意思是请求头字段太长了.在这里需要配置下tomcat请求头长度. tomcat-service.xml <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443&q

  • 关于微信jssdk实现多图片上传的一点心得分享

    一.首先在common.js里封装一个函数,在需要调用jsSDK的页面引用此方法即可实现微信的信息配置 function signatureJSSDK() { var url = window.location.href.split('#')[0];//后台需要此页面的url来生成参数 $.ajax({ url:IPWeiXinJssdk,//调用后台接口,用后台返回的结果来进行微信接口的基础配置 type:"post", dataType:"json", data

  • 基于twbsPagination.js分页插件使用心得(分享)

    项目中之前需要分页插件,以前用的都是单纯叫做pagenation.js的插件,但是这次集成的时候,项目组一个孩纸用了这个插件,结合网上的例子琢磨了一把.其实大致流程都是相同的,主要将我在用这个分页插件的一些心得分享出来: 1.分页插件引入html中需要: bootstrap.css 分页插件js 自己写的分页的样式css[如果不用,也可以直接用bootstrap所带的分页css.] 使用jquery可以引入jquery.js html中: <script type="text/javasc

  • 基于angular-utils-ui-breadcrumbs使用心得(分享)

    angular-utils-ui-breadcrumbs是一个用来自动生成面包屑导航栏的一个插件,需要依赖angular.UIRouter和bootstrap3.css.生成的界面截图如下,点击相应的面包屑会跳转到相应的路由,点击相应的路由也会自动生成相应的面包屑: 安装:npm install angular-utils-ui-breadcrumbs github:https://github.com/michaelbromley/angularUtils/tree/master/src/di

  • 基于node打包可执行文件工具_Pkg使用心得分享

    项目地址 这个项目很神奇,直接将node.js项目打包成windows可以直接执行的exe文件(也支持FreeBSD.linux.macos.arm系统),甚至不需要安装Node.js,且无须修改你项目中的任何代码! 首先安装pkg npm install -g pkg 然后在项目目录下执行 pkg entrance.js 即可打包linux,macos,win3个平台的可执行文件.entrance.js为你node项目的入口文件. 如果只想打包windows下的exe,则加上-t参数.win即

  • 基于Hibernate中配置文件的学习(分享)

    首先我们看一下hibernate的主配置文件 <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <!-- 通常,一个sessi

  • js断点调试心得分享(必看篇)

    1.断点调试是啥?难不难? 断点调试其实并不是多么复杂的一件事,简单的理解无外呼就是打开浏览器,打开sources找到js文件,在行号上点一下罢了.操作起来似乎很简单,其实很多人纠结的是,是在哪里打断点?(我们先看一个断点截图,以chrome浏览器的断点为例) 步骤记住没? 用chrome浏览器打开页面 → 按f12打开开发者工具 → 打开Sources → 打开你要调试的js代码文件 → 在行号上单击一下,OK!恭喜你的处女断点打上了,哈哈~~ 2.断点怎么打才合适? 打断点操作很简单,核心的

随机推荐