MyBatis表和实体关联

  用过hibernate的小伙伴都知道无论是采用注解还是对象关系映射文件,都会把实体类的属性和数据表的列联系起来。比如说Student 就有一个Student.hbm.xml文件,这个对象关系映射文件有id 也有property等标签。这样就能很好的做到表和实体关联。

  MyBatis也需要进行表和实体 的关联。我们查询的是表,返回的结果是实体类。这之间有一个对应关系。

  如果说实体类的属性和表的列名一一对应,名字一样,那就自动解决了这个问题。但是如果实体类的属性和表的列名不一致,这就需要我们手动的把它们关联起来。

  

  我们查官方文档,能看到这样一个配置:是否开启驼峰命名规则,这个稍后再说。

  

先创建一个数据表book

create table book(
    book_id int not null auto_increment COMMENT ‘书籍ID‘,
    book_name varchar(120) not null COMMENT ‘书籍名称‘,
    primary key(book_id)
)ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT ‘书籍‘;insert into book(book_name) values(‘冰与火之歌‘);

再创建一个实体类Book,这里我刻意的让实体类属性和表的列名不一致

package com.zhao.entity;

public class Book {
    private int id;
    private String bookName;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    @Override
    public String toString() {
        return "Book [id=" + id + ", bookName=" + bookName + "]";
    }

}

现在能看到 表book 列 book_id book_name;   实体类Book 属性 id bookName。

我依旧采用xml和dao接口组合使用的方法进行数据表操作

package com.zhao.dao;

import com.zhao.entity.Book;

public interface BookDao {
    /*
     * 插入书籍信息
     */
    public int insertBook(Book book);
    /*
     * 根据Id查询Book信息
     */
    public Book queryById(int id);
}

在接口中我们定义了两个方法,一个插入 一个查询。

接下来看BookDao.xml

<?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="com.zhao.dao.BookDao">
    <insert id="insertBook" parameterType="Book">
        insert into
        book(book_name) values(#{bookName})
    </insert>
    <select id="queryById" resultType="Book">
        select * from book where book_id=#{id}
    </select>
</mapper>

现在进行简答的测试

package com.zhao.dao;

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.zhao.entity.Book;

public class BookDaoTest {
    private String resource = "mybatis-config.xml";
    private Reader reader;
    private SqlSessionFactory sqlSessionFactory;
    private SqlSession sqlSession;
    private BookDao bookDao;

    @Before
    public void before() throws IOException {
        reader = Resources.getResourceAsReader(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        sqlSession = sqlSessionFactory.openSession();
        bookDao=(BookDao)sqlSession.getMapper(BookDao.class);
    }

    @After
    public void after() {
        sqlSession.close();
    }

    @Test
    public void testInsertBook() {
        Book book=new Book();
        book.setBookName("冰与火之歌");
        int insertCount=bookDao.insertBook(book);
        //一定要记得提交 事务
        sqlSession.commit();
        System.out.println("InsertCount: "+insertCount);
    }

    @Test
    public void testQueryById() {
        Book book=bookDao.queryById(3);
        System.out.println(book);
    }

}

测试结果

  

思路特别简单,就是把从数据表book查到结果赋给Book对象。程序运行没有报错,结果不正确只是因为数据表和实体类没有进行关联。实际上我们已经从表中查出了数据,只是在赋给Book这一步失败了。

解决办法:

  1:给数据表的列定义别名

  修改BookDao.xml

    <select id="queryById" resultType="Book">
        select book_id as id, book_name as bookName from book where book_id=#{id}
    </select>

  把刚才的select * 进行了修改,把结果增加了别名。这个别名对应着Book的属性。

  查看结果

  

  2:resultMap手动配置关联

  我们的目的依旧是把表的列和实体类的属性进行关联,上面也提到hibernate的对象关系映射,其实mybatis的配置resultMap和hibernate的对象关系映射很相似。

  修改BookDao.xml

    <select id="queryById" resultMap="BookResultMap">
        select * from book where book_id=#{id}
    </select>
    <resultMap type="Book" id="BookResultMap">
        <id property="id" column="book_id"/>
        <result property="bookName" column="book_name"/>
    </resultMap>

  只用select * 肯定是失败的。但是我们可以配置实体类的属性和数据表的列之间的一一对应关系。

  查询结果

  

  3:用了上面两种方法,我觉得还是有点繁琐。有没有更简单的方法 ,有。

  就用上面提到的是否开启驼峰规则。

  一般情况下,数据库表的列是以 A_column的格式定义的,而实体类的属性是以aColumn的格式定义的。就像上面用到的

  book_name和bookName。

  这两天我整理的xml和dao层组合使用进行mybatis操作,并没有使用上面所说的定义别名或者定义resultMap。而是使用了开启驼峰规则。

  在mybatis-config.xml中

  

    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true" />
        <setting name="useGeneratedKeys" value="true" />
    </settings>

  当然,在设计表和创建实体类的时候,还要注意book_name 和 bookName这种对应关系。

  其实,开启驼峰规则的本质还是给表定义了别名。不过这种别名是有规范的,book_name的别名就说bookName。

时间: 2024-10-12 11:39:43

MyBatis表和实体关联的相关文章

Mybatis一对多双向关联

在弄Mybatis的一对多关联的时候,不知道有没有遇到这样的问题,本来数据库中对应有多条数据,然而关联出来却只有一条数据,比如数据库中有个班级表和学生表,数据库中一个班级中对应了多个学生,但使用Mybatis做一对多关联的时候,查询出来的却只有一条.如果出现这样的问题,那么就是两张数据表中的主键重名了,导致在关联查询时分不清到底是那一张表了,因此有关联的数据表时,主键id不要重名,一对多关联实现如下: 数据表: CREATE TABLE tab_class ( c_id INT PRIMARY

MyBitis(iBitis)系列随笔之五:多表(一对多关联查询)

MyBitis(iBitis)系列随笔之一:MyBitis入门实例 MyBitis(iBitis)系列随笔之二:类型别名(typeAliases)与表-对象映射(ORM) MyBitis(iBitis)系列随笔之三:简单实现CRUD MyBitis(iBitis)系列随笔之四:多表(多对一查询操作) MyBitis(iBitis)系列随笔之五:多表(一对多关联查询) MyBitis(iBitis)系列随笔之六:mybitis与spring集成 这篇博文介绍的是多表中的一对多表关联查询还是按照上一

Entity Framework Code First实体关联数据加载

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 在项目过程中,两个实体数据之间在往往并非完全独立的,而是存在一定的关联关系,如一对一.一对多及多对多等关联.存在关联关系的实体,经常根据一个实体的实例来查询获取与之关联的另外实体的实例. Entity Framework常用处理数据关联加载的方

MyBatis:学习笔记(3)——关联查询

MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统,如果我们将用户信息和订单信息都保存在user表中,这样就不存在联结关系,因为我们仅仅操作一张表就好. 但是这是非常不明智的选择,举例来说,一个用户可以拥有多个订单,如果保存在一个表中,势必会导致用户信息的多次出现,因为每个订单绑定的用户信息都是相同的. 所以我们尽量要将不同的信息存储与不同的表中,但

MyBatis 系列五 之 关联映射

MyBatis 系列五 之 关联映射 一对多的关联映射 一对多关联查询多表数据 1.1在MyBatis映射文件中做如下配置 <!--一对多单向的连接两表的查询--> <resultMap type="Dept" id="deptMapper"> <id property="deptNo" column="deptNo"/> <result property="deptName

【Hibernate学习笔记-6.1】无连接表的N-1关联(单向)

作者:ssslinppp       1. 摘要 主要讲解N-1关系表的设计,N:从表,1:主表: 从表(N)中使用外键关联到主表(1),单向的: 场景: 许多人(N)可以住在同一个地方(1),知道人就可以知道这个人的地址: 反过来,知道地址,不能知道该地址住的人. 2. 数据表设计 地址表: Person表: e 3. 实体类-注解方式 Address.java package org.crazyit.app.domain; import javax.persistence.Column; i

Mybatis自动生成实体类和实体映射工具

Mybatis Mysql生成实体类 用到的Lib包: mybatis-generator-core-1.3.2.jarmysql-connector-java-5.1.30.jar 1. 创建一个文件generator.properties, 主要用于配置相关路径和数据库信息. #工程src路径 project = D:/project/ #工程存放mapper.xml路径 resource = D:/project/ #指定数据连接驱动jar地址 classPath=D:/project/m

ios CoreData框架的使用,对上下文数据的增删改查,表与表之间的关联,1对多,1对1,谓词查询,多表连接

这里是只是代码,因为博客插入图片效果不是很好,我自己写的总结比较详细,有兴趣的朋友可以在评论里留下邮箱,我收到后会发给大家. 转载注明出处,重视原创者的劳动成果,谢谢! - (void)viewDidLoad { [super viewDidLoad]; [self _creatTable];//插入数据 //    [self _query];// 查询数据 // KVC很霸道,即使readonly通过kvc也可赋值,kvo精华 //    Book * book = [[Book alloc

Asp.net动态页面静态化之输出对象属性(实体关联)

Asp.net动态页面静态化之输出对象属性(实体关联) 模板引擎不单单可以输出单一的数据,还能直接输出对象的属性 using System; using System.Collections.Generic; using System.Linq; using System.Web; using NVelocity.Runtime; using NVelocity; using NVelocity.App; namespace czbk { /// <summary> /// Handler2