mybatis一对一

MyBatis关联映射

别等时光非礼了梦想. 提交于 2019-11-29 06:44:27
1.关联映射(多表查询) 数据库中多表之间存在着三种关系,如图所示。 多对多: 程序员<------>项目 用户--------->角色 一对多: 班级----->学生 学校------>班级 帅哥----->多个女朋友 一对一: 学生----->学位证 人------>DNA 从图可以看出,系统设计的三种实体关系分别为:多对多、一对多和一对一关系。注意:一对多关系可以看为两种: 即一对多,多对一。 2.关联映射作用 在现实的项目中进行数据库建模时,我们要遵循数据库设计范式的要求,会对现实中的业务模型进行拆分,封装在不同的数据表中,表与表之间存在着一对多或是多对多的对应关系。进而,我们对数据库的增删改查操作的主体,也就从单表变成了多表。那么Mybatis中是如何实现这种多表关系的映射呢? 查询结果集ResultMap resultMap元素是 MyBatis中最重要最强大的元素。它就是让你远离90%的需要从结果 集中取出数据的JDBC代码的那个东西,而且在一些情形下允许你做一些 JDBC 不支持的事 情。 有朋友会问,之前的示例中我们没有用到结果集,不是也可以正确地将数据表中的数据映射到Java对象的属性中吗?是的。这正是resultMap元素设计的初衷,就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们的关系。 resultMap元素中,允许有以下直接子元素:

mybatis详解-resultMap(3)

强颜欢笑 提交于 2019-11-29 06:44:20
resultMap resultType 可以指定将查询结果映射为pojo,但 需要pojo的属性名和sql查询的列名一致方可映射成功。 如果sql查询字段名和pojo的属性名 不一致 ,可以 通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。 resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list 实现一对一查询和一对多查询 。 如下图所示userID与数据库表中user_id 不一致,将会产生无法取得该列数据情况; Order对象 public class Order { // 订单id private int id; // 用户id private Integer userId; // 订单号 private String number; // 订单创建时间 private Date createtime; // 备注 private String note; get/set。。。 } 创建OrderMapper.xml配置文件,如下: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http:/

Mybatis基于注解实现多表查询

强颜欢笑 提交于 2019-11-29 03:43:45
  对应的四种数据库表关系中存在四种关系:一对多,多对应,一对一,多对多。在前文中已经实现了xml配置方式实现表关系的查询,本文记录一下Mybatis怎么通过注解实现多表的查询,算是一个知识的补充。   同样的先介绍一下Demo的情况:存在两个实体类用户类和账户类,用户类可能存在多个账户,即一对多的表关系。每个账户只能属于一个用户,即一对一或者多对一关系。我们最后实现两个方法,第一个实现查询所有用户信息并同时查询出每个用户的账户信息,第二个实现查询所有的账户信息并且同时查询出其所属的用户信息。   1.项目结构      2.领域类 public class Account implements Serializable{ private Integer id; private Integer uid; private double money; private User user; //加入所属用户的属性 省略get 和set 方法............................. } public class User implements Serializable{ private Integer userId; private String userName; private Date userBirthday; private String userSex;

Mybatis

丶灬走出姿态 提交于 2019-11-28 21:43:52
1. 什么是 mybatis MyBatis 是一个优秀的持久层框架,它对 jdbc 的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建 connection 、创建 statement 、手动设置参数、结果集检索等 jdbc 繁杂的过程代码。 2. mybatis 入门 2.1 mybatis 下载 mybaits 的代码由 github.com 管理,地址: https://github.com/mybatis/mybatis-3/releases 2.2 工程搭建 第一步: 创建 java 工程 第二步:加入需要的jar 包 第三步:配置 db.properties 文件 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm?characterEncoding=utf-8 jdbc.username=root jdbc.password=123456 第四步: 编写 mybatyis 配置文件 SqlMapConfig.xml 为了看起来清晰,就把所有的配置文件放在一个新的文件夹中,所有在项目下新建一个文件夹 config, 把他设置为资源目录( classpath , src 也是资源目录),然后新建一个

layui mybatis 实现 一对一关联表查询界面数据显示

放肆的年华 提交于 2019-11-28 21:21:44
layui mybatis 实现 一对一关联表查询界面数据显示 一开始找了两天半天找不到,后来解决了,分享给大家。 table . render ( { id : 'departmentTable' , elem : '#test' , url : '/firstWeb/inproduct/queryAll' , title : '出入库管理表' , where : { } , cols : [ [ { field : 'id' , title : '编号' } , { field : 'sort' , title : '产品类别' , templet : function ( data ) { return data . sort . name ; } } , { field : 'time' , title : '产品名' , templet : function ( data ) { return data . product . name ; } } , { field : 'product' , title : '产地' , templet : function ( data ) { return data . product . area ; } } , { field : 'product' , title : '规格' , templet : function (

MyBatis开发重点知识

末鹿安然 提交于 2019-11-28 16:35:18
1.1 为什么需要 ORM 框架? 传统的 JDBC 编程存在的弊端: ü 工作量大,操作数据库至少要 5 步; ü 业务代码和技术代码耦合; ü 连接资源手动关闭,带来了隐患; MyBatis 前身是 iBatis, 其源于“ Internet ”和“ ibatis ”的组合,本质是一种半自动的 ORM 框架,除了 POJO 和映射关系之外,还需要编写 SQL 语句; Mybatis 映射文件三要素: SQL 、映射规则和 POJO ; 1.2 MyBatis 快速入门 步骤如下: 加入 mybatis 的依赖,版本 3.5.x 添加 mybatis 的配置文件,包括 MyBatis 核心文件和 mapper.xml 文件 场景介绍:基于 t_user 表单数据查询、多数据查询; 编写实体类、 mapper 接口以及 mapper xml 文件; 编写实例代码:com.enjoylearning.mybatis.MybatisDemo. quickStart 核心类分析: SqlSessionFactoryBuilder :读取配置信息创建 SqlSessionFactory ,建造者模式,方法级别生命周期; SqlSessionFactory :创建 Sqlsession ,工厂单例模式,存在于程序的整个生命周期; SqlSession :代表一次数据库连接,一般通过调用

myBatis深入学习

别说谁变了你拦得住时间么 提交于 2019-11-28 15:00:16
本文在前一篇文章的基础上记录了对mybatis的表之间的关系映射、延迟加载、缓存等高级功能的学习。 1.表之间的关系映射   既然要明确表之间的关系映射,那么首先要分析数据库中表之间的关系,假设数据库中现在有4张表:user(用户表,记录了购买商品的用户信息)、orders(订单表,记录了用户所创建的订单)、orderdetails(订单明细表,记录了订单的详细信息即购买商品的信息)、items(商品表,记录了商品信息),对数据库中表的分析要重点看表中的 主键、非空字段、外键 ,经过对表的分析,可以得到如下的数据模型分析:    一对一查询   一对一的查询在实现时可以使用resultType和resultMap实现,关于二者的区别如下:   resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。如果没有查询结果的特殊要求建议使用resultType。   resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。resultMap可以实现延迟加载,resultType无法实现延迟加载。 一对多查询  

mybatis一对一关联关系映射

Deadly 提交于 2019-11-28 05:41:03
mybatis一对一关联关系映射 在关联关系中,有一对一,一对多,多对多三种关联关系。 一对一关系:在操作上,任意一方引入对方的主键作为外键。 一对多关系:在“多”的一方添加“一”的一方的主键作为外键。 多对多关系:产生中间表引入两张表的主键作为外键,将两个主键作为联合主键或者引入新的字段作为这个中间表的主键。 一对一关联关系 例如person和IDcard,一个人只有一个身份证号,而一个身份证号只对应一个人。 以上是person表和IDcard表。 public class Person { private Integer id; private String name; private Integer age; private String sex; private IdCard card;//一对一关系映射 setter/getter方法 } //身份证持久化类 public class IdCard { private Integer id; private String code; } PersonMapper接口 public interface PersonMapper { Person selectPersonById(int id); } PersonMapper.xml映射文件 <?xml version="1.0" encoding="UTF-8" ?> <

mybatis的SQL映射(加强)

佐手、 提交于 2019-11-28 04:52:02
1.SQL映射器Mapper   a) 引入MyBatis基于动态代理机制,让我们无需再编写Dao的实现。   传统Dao接口,现在名称统一以Mapper结尾,还有我们映射器配置文件要和映射器在同一个包。   b) 映射器使用步骤 i. 根据数据库表创建domain类(User.java) ii. 根据domain类创建Mapper接口(UserMapper.java)   增删改查和一些其他的方法   可以在Mapper的方法上面通过注解来写SQL,但是不建议使用 iii. 编写配置xml映射文件(UserMapper.xml)   SQL语句标签的id必须和接口中方法的名字一致 iv. 获取session—>session获取Mapper--> mapper调用方法 高级查询功能   a) 模糊查询拼接字符串的时候用concat来拼接 like concat(“%”,#{name},“%”)   b) >=可以正常使用,而<=不能,需要对” <”进行一个转译”<”,但是开发时可能很多的<符号,就是CDATA断来表示<![CDATA[条件]]>   c) 多条件查询的时候,在xml映射文件里面使用一个<where>标签后会将后面的第一个and自动转换成where   d) 条件的抽取   <sql id=”sqlWhere”>查询条件</sql>,然后在SQL语句里引入这个条件

mybatis框架学习-延迟加载

时间秒杀一切 提交于 2019-11-27 11:19:31
罗里吧嗦 延迟加载: 就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载,按需加载。 延迟加载对应的是立即加载:不管用不用,只要一调用方法,马上发起查询。 好处: 先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。 坏处: 因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗 时间,所以可能造成用户等待时间变长,造成用户体验下降 实际开发过程中很多时候我们并不需要总是在加载用户信息时就一定要加载他的账户信息。 此时就是我们所说的延迟加载。 在对应的四种表关系中:一对多,多对一,一对一,多对多 一对多,多对多:通常情况下我们都是采用延迟加载。 多对一,一对一:通常情况下我们都是采用立即加载。 概要 1.打开延迟加载 <configuration> <settings> <!-- 延迟加载的开关 默认是false --> <setting name="lazyLoadingEnabled" value="true"></setting> <!-- 将积极加载改为按需加载,默认是false,即在这里配不配置都一样 --> <!--<setting name="aggressiveLazyLoading" value="false"></setting>--> <