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

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

先创建一个数据表book

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

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

  1. package com.zhao.entity;
  2.  
  3. public class Book {
  4. private int id;
  5. private String bookName;
  6.  
  7. public int getId() {
  8. return id;
  9. }
  10.  
  11. public void setId(int id) {
  12. this.id = id;
  13. }
  14.  
  15. public String getBookName() {
  16. return bookName;
  17. }
  18.  
  19. public void setBookName(String bookName) {
  20. this.bookName = bookName;
  21. }
  22.  
  23. @Override
  24. public String toString() {
  25. return "Book [id=" + id + ", bookName=" + bookName + "]";
  26. }
  27.  
  28. }

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

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

  1. package com.zhao.dao;
  2.  
  3. import com.zhao.entity.Book;
  4.  
  5. public interface BookDao {
  6. /*
  7. * 插入书籍信息
  8. */
  9. public int insertBook(Book book);
  10. /*
  11. * 根据Id查询Book信息
  12. */
  13. public Book queryById(int id);
  14. }

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

接下来看BookDao.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.zhao.dao.BookDao">
  6. <insert id="insertBook" parameterType="Book">
  7. insert into
  8. book(book_name) values(#{bookName})
  9. </insert>
  10. <select id="queryById" resultType="Book">
  11. select * from book where book_id=#{id}
  12. </select>
  13. </mapper>

现在进行简答的测试

  1. package com.zhao.dao;
  2.  
  3. import java.io.IOException;
  4. import java.io.Reader;
  5.  
  6. import org.apache.ibatis.io.Resources;
  7. import org.apache.ibatis.session.SqlSession;
  8. import org.apache.ibatis.session.SqlSessionFactory;
  9. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  10. import org.junit.After;
  11. import org.junit.Before;
  12. import org.junit.Test;
  13.  
  14. import com.zhao.entity.Book;
  15.  
  16. public class BookDaoTest {
  17. private String resource = "mybatis-config.xml";
  18. private Reader reader;
  19. private SqlSessionFactory sqlSessionFactory;
  20. private SqlSession sqlSession;
  21. private BookDao bookDao;
  22.  
  23. @Before
  24. public void before() throws IOException {
  25. reader = Resources.getResourceAsReader(resource);
  26. sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
  27. sqlSession = sqlSessionFactory.openSession();
  28. bookDao=(BookDao)sqlSession.getMapper(BookDao.class);
  29. }
  30.  
  31. @After
  32. public void after() {
  33. sqlSession.close();
  34. }
  35.  
  36. @Test
  37. public void testInsertBook() {
  38. Book book=new Book();
  39. book.setBookName("冰与火之歌");
  40. int insertCount=bookDao.insertBook(book);
  41. //一定要记得提交 事务
  42. sqlSession.commit();
  43. System.out.println("InsertCount: "+insertCount);
  44. }
  45.  
  46. @Test
  47. public void testQueryById() {
  48. Book book=bookDao.queryById(3);
  49. System.out.println(book);
  50. }
  51.  
  52. }
 

测试结果

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

解决办法:

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

  修改BookDao.xml

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

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

  查看结果

2:resultMap手动配置关联

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

  修改BookDao.xml

  1. <select id="queryById" resultMap="BookResultMap">
  2. select * from book where book_id=#{id}
  3. </select>
  4. <resultMap type="Book" id="BookResultMap">
  5. <id property="id" column="book_id"/>
  6. <result property="bookName" column="book_name"/>
  7. </resultMap>

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

  查询结果

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

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

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

  book_name和bookName。

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

  在mybatis-config.xml中

  

  1. <settings>
  2. <setting name="mapUnderscoreToCamelCase" value="true" />
  3. <setting name="useGeneratedKeys" value="true" />
  4. </settings>

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

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

mybatis 是如何与数据表对应上的 ?的更多相关文章

  1. MySQL学习笔记_2_MySQL创建数据表(上)

    MySQL创建数据表(上) 一.创建数据表的SQL语句模型[弱类型] CREATETABLE [IF NOT EXISTS] 表名称( 字段名1列的类型[属性][索引], 字段名2 列的类型[属性][ ...

  2. CSS表单与数据表(上)

    表单在现代Web应用中占据着重要地位. 表单可以很简单,也可以非常复杂,要横跨几个页面. 除了从用户哪里获得数据,Web应用还需要以容易看懂的方式展示数据.表格是展示复杂数据的最佳方式. 1.设计数据 ...

  3. MySQL数据库-数据表(上)

    数据表的基本操作. MySQL 数据库支持多种数据类型,大致可以分为 3 类:数值类型.日期和时间类型.字符串(字符)类型. (1)数值类型 数值类型用于存储数字型数据,这些类型包括整数类型(TINY ...

  4. 2015-10-22 前思后想,决定重构表结构,免得这个APP死在数据表设计上

    新的设计稿出来了,如下,原来旧的是第二张       -------  原来的评论级数只有2级,现在是不限,2级的意思是,用户评论该帖是一级,用户的评论能被人评论,这是第2级,评论评论的评论不能够再被 ...

  5. Mysql学习(慕课学习笔记6)修改数据表(上)

    添加单列 Alter table tb1_name ADD[column] col_name column_definition [first | after col_name] 列名称       ...

  6. 默认情况下,不使用of子句表示在select所有的数据表中加锁(转)

    Select …forupdate语句是我们经常使用手工加锁语句.通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作.同时,在多版本一致读机制的支持下,select语句也不 ...

  7. SpringBoot+Mybatis 自动创建数据表(适用mysql)

    Mybatis用了快两年了,在我手上的发展史大概是这样的 第一个阶段 利用Mybatis-Generator自动生成实体类.DAO接口和Mapping映射文件.那时候觉得这个特别好用,大概的过程是这样 ...

  8. mybatis 操作其他数据库的数据表

    配置文件里面配置的数据库只是默认数据库,并不是只能操作默认数据库.(被自己蠢死了,唉) 1. 注解方式 使用BaseMapper方式操作数据表时,在表对应的实体类上的 @table 注解描述表名时加上 ...

  9. 17数据表&E-R模型&概念数据模型上-选学天轰穿大话数据库视频教程

    大纲:解剖“数据表”,戏说E-R模型,概念数据模型(E-R 到 CDM),使用PowerDesigner创建概念模型,生成逻辑数据模型 土豆超清地址: 腾讯超清地址: 百度云盘下载地址:上传ing,稍 ...

随机推荐

  1. 用ViewPager实现一个程序引导界面

    下面使用ViewPager来实现一个程序引导的demo: 一般来说,引导界面是出现第一次运行时出现的,之后不会再出现.所以需要记录是否是第一次使用程序,办法有很多,最容易想到的就是使用SharedPr ...

  2. layer.confirm 询问框 的层遮盖

    function admin_del(obj) { layer.confirm('确认要重启吗?', { btn : [ '确定', '取消' ]//按钮 }, function(index) { l ...

  3. 使用java中replaceAll方法替换字符串中的反斜杠

    今天在项目中使用java中replaceAll方法将字符串中的反斜杠("\")替换成空字符串(""),结果出现如下的异常: java.util.regex.Pa ...

  4. 解决ubuntu上在androidstudio中启动emulator闪退的问题(2)

    平台 Ubuntu14.04 64 现象 在AndrodStudio中点击模拟器的启动按钮后,模拟器界面弹出后,又立刻闪退. 解决 一.查看模拟器的信息 从上面可以看到模拟器的存放路径以及名称: 路径 ...

  5. ASP.NET Web API中展示实体Link相关的方面

    有时候,向服务端请求一个实体,我们希望返回如下的格式: links: [    href: http://localhost:8901/api/user/diaries/2013-08-17,    ...

  6. NavigateToPageAction打开新页面

    首先要加上两个命名空间 分别为: xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.In ...

  7. 咏南中间件支持DELPHI6及以上版本开发的客户端

    咏南中间件支持DELPHI6及以上版本开发的客户端 下面是测试用DELPHI7开发的客户端,调用DELPHI10.3.1开发的中间件,完全兼容. 这样,有利于维护原来用D7开发的老程序. 如上所述,只 ...

  8. eclipse 安装 weblogic server

  9. ./adb: error while loading shared libraries: libncurses.so.5:

    from://http://stackoverflow.com/questions/10005907/eclipse-android-plugin-libncurses-so-5 sudo apt-g ...

  10. POJ 1135 Domino Effect (Dijkstra 最短路)

    Domino Effect Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9335   Accepted: 2325 Des ...