mybatis一对一

mybatis 入门

▼魔方 西西 提交于 2020-01-01 00:16:15
mybatis mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc ,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。 mybatis 通过 xml 或 注解 的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。 采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,使我们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。 jdbc问题 1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。 2、Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。 3、使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。 4、对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护

MyBatis进阶

*爱你&永不变心* 提交于 2019-12-31 20:01:49
Mapper代理 上一节 中直接利用session+id来执行sql的方式存在一些问题 session执行sql时都需要提供要执行sql的id,而这个id是字符串类型,意味着id是否正确在编译期间是无法获知的,必须等到运行时才能发现错误, sql需要的参数和返回值类都不明确,这也增加了出错的概率 理想的状况:像调用方法一样调用sql,既避免了直接写id的问题,也可以明确指定方法的参数类型和返回值类型 解决方案: MyBatis通过动态代理来解决,简单的说动态代理(动态生成),就是在运行过程中自动产生一个对象,用它来代理原本已经存在的对象的方法 MyBatis中本来由Executor(被代理对象)来完成sql的执行,现在由代理对象(自动生成)来代理Executor完成,代理对象会将我们的操作转交给Executor 问题是:MyBatis怎么知道代理对象是什么样的对象呢?,这就需要为MyBatis提供Mapper接口,这个接口就是对mapper.xml中的sql语句的声明,与DAO层的接口一毛一样 使用步骤 创建接口类 package com.kkb.mapper; import com.kkb.pojo.Products; public interface ProductsMapper { //根据name查询一个Products public Products

2019年mybatils面试高频题(java)

浪尽此生 提交于 2019-12-31 12:33:04
前言 2019即将过去,伴随我们即将迎来的又是新的一年,过完春节,马上又要迎来新的金三银四面试季。 那么,作为程序猿的你,是否真的有所准备的呢,亦或是安于本职工作,继续做好手头上的事情。 当然,不论选择如何,假如你真的准备在之后的金三银四跳槽的话,那么作为一个Java工程师,就不可不看了。 如何在几个月的时间里,快速的为即将到来的面试进行充分的准备呢? 一、什么是MyBatis? 答:MyBatis是一个可以自定义SQL、存储过程和高级映射的持久层框架。 二、讲下MyBatis的缓存 答:MyBatis的缓存分为一级缓存和二级缓存,一级缓存放在session里面,默认就有二级缓存放在它的命名空间里,默认是不打开的,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置 三、Mybatis是如何进行分页的?分页插件的原理是什么? 答: 1、Mybatis使用RowBounds对象进行分页,也可以直接编写sql实现分页,也可以使用Mybatis的分页插件。 2、分页插件的原理:实现Mybatis提供的接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql。 举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t

备战2020春招,这次彻底搞懂MyBatis,这些面试题没白刷(附答案)

﹥>﹥吖頭↗ 提交于 2019-12-28 02:54:15
前言: 春招面试题MyBatis篇来咯!!! Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。 最近有好多朋友在准备春招,所以小编也会多出一些面试专题的文章给有需要的人,所以记得给我点个关注哦 一.MyBatis 框架的缺点: 1、SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写 SQL 语句的功底有一定要求。 2、SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。 二.MyBatis 框架适用场合: 1、MyBatis 专注于 SQL 本身,是一个足够灵活的 DAO 层解决方案。 2、对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis 将是 不错的选择。 三.MyBatis 与 Hibernate 有哪些不同? 1、Mybatis 和 hibernate 不同,它不完全是一个 ORM 框架,因为 MyBatis 需要 程序员自己编写 Sql 语句。 2、Mybatis 直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高,非常 适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需

MyBatis基础入门《十四》ResultMap子元素(association )

二次信任 提交于 2019-12-26 15:18:31
MyBatis基础入门《十四》ResultMap子元素(association ) 1. id: >> 一般对应数据库中改行的主键ID,设置此项可以提高Mybatis的性能 2. result >> 映射到JavaBean的某个“简单类型”属性 3. association >> 映射到javaBean的某个“复杂类型”属性,比如:javabean类 4. collection >> 映射到javabean的某个“复杂类型”属性,比如:集合 描述:   id、result在前面的章节中已经使用到,不再讲述。从这章节开始接触:association、collection。 》》 association >> 复杂的关联类型,一对一或多对一 >> 内部嵌套     >> 映射一个嵌套的JavaBean属性 >> 属性     >> property : 映射数据库列的实体对象的属性     >> javaType : 完整java类名或别名     >> resultMap : 引用外部resultMap   》》 association子元素     >> id     >> result     >> property : 映射数据库列的实体对象的属性     >> column : 映射数据库列名或者别名 》》》 实例代码描述: 数据库表: tbl_client tbl_role

mybatis中resultMap配置细则

人走茶凉 提交于 2019-12-26 02:39:28
resultMap算是mybatis映射器中最复杂的一个节点了,能够配置的属性较多,我们在 mybatis映射器配置细则 这篇博客中已经简单介绍过resultMap的配置了,当时我们介绍了resultMap中的id和result节点,那么在resultMap中除了这两个之外,还有其他节点,今天我们就来详细说说resultMap中的这些节点。 如果小伙伴对mybatis尚不了解,建议先翻看博主前面几篇博客了解一下,否则本文你可能难以理解,老司机请略过。 概览 先来看看resultMap中都有那些属性: <resultMap> <constructor> <idArg/> <arg/> </constructor> <id/> <result/> <association property=""/> <collection property=""/> <discriminator javaType=""> <case value=""></case> </discriminator> </resultMap> 我们看到,resultMap中一共有六种不同的节点,除了id和result我们在 mybatis映射器配置细则 这篇博客中已经介绍过了之外,还剩三种,剩下的四个本文我们就来一个一个看一下。 constructor constructor主要是用来配置构造方法

MyBatis框架之关联查询

丶灬走出姿态 提交于 2019-12-25 19:11:21
概述: 关联查询主要在<resultMap>元素中,用<association>配置一对一、用<collection> 配置一对多 一、一对一查询 1.使用扩展类实现一对一查询 <select id="queryById" parameter="int" resultType="User"> select * from user where userid=#{userid} </select> 2.使用resulutMap实现一对一查询(association) 举例说明:将用户信息和用户权限放到不同的实体类中,每一个用户对应着相应的权限,如果要根据用户id查询他对应的属性,则需要在用户信息加入一个权限的属性,再通过SQL映 射文件中的resultMap属性,将查询的结果映射到用户类中的所有属性,包括权限信息 <select id="queryById" parameter="int" resultMap="User_privilige_map"> select *  from user inner join privilige on user.privilige=privilige.privilige where userid=#{userid} </select> <resultMap type="org.zy.pojo.user" id="User_privilige_map

Mybatis常见面试题总结

泄露秘密 提交于 2019-12-23 08:31:48
1、什么是Mybatis? (1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。 (2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 (3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。 2、Mybaits的优点: (1)基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。 (2)与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接; (3)很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。 (4

Mybatis学习--Mapper.xml映射文件

只谈情不闲聊 提交于 2019-12-23 08:23:03
本文转载自: https://www.cnblogs.com/lcngu/p/5470695.html 作者:lcngu 转载请注明该声明。 简介    Mapper.xml 映射文件中定义了操作数据库的 sql ,每个 sql 是一个 statement ,映射文件是 mybatis 的核心。   映射文件中有很多属性,常用的就是 parameterType( 输入类型 )、 resultType( 输出类型 )、resultMap()、rparameterMap()。 parameterType(输入类型)    1、 #{}与${}   #{} 实现的是向 prepareStatement 中的预处理语句中设置参数值, sql 语句中 #{} 表示一个占位符即 ? 。 1 <!-- 根据id查询用户信息 --> 2 < select id ="findUserById" parameterType ="int" resultType ="user" > 3 select * from user where id = #{id} 4 </ select >   使用占位符 #{} 可以有效防止 sql 注入 ,在使用时不需要关心参数值的类型, mybatis 会自动进行 java 类型和 jdbc 类型的转换。 #{} 可以接收简单类型值或 pojo 属性值,如果

如何区分resultMap,resultType和paramType?有何区别?

半世苍凉 提交于 2019-12-21 02:59:42
在spring+springMVC+mybatis架构的项目中,经常需要再mybatis的xml配置文件中书写各种增删改查的sql语句, 今天就让我们来探讨一下mybatis中的resultMap,resultType和paramType到底有什么区别把! 1.resultMap   适用于多表联结查询后返回的结果,需要在mapper.xml中的<resultMap>标签添加<association>或者<collection>标签来添加pojo字段,resultMap中填写对象的实体类名称 2.resultType   适用于单表查询后返回的结果,resultType中填写对象的实体类名称 3.paramType   这里填写的是传入的参数类型,根据sql语句的传参类型来确定,如果传入的参数不止一个,就需要填写对象的实体类名称 4.另外:   collection和 association的用法    association (一对一,多对一) 比如: 多个订单对应 一个用户 ,或者一个人对应 一个身份证号 ,都可以用到<association>标签      collection(一对多,多对多) 比如: 一个用户对应 多个订单 ,一个老师对应 多个学生 来源: https://www.cnblogs.com/liuje/p/11805940.html