搜档网
当前位置:搜档网 › mybatis入门教程(二)(超简单)

mybatis入门教程(二)(超简单)

mybatis第二天高级映射查询缓存和spring整合

课程复习:

mybatis是什么?

mybatis是一人持久层框架,mybatis是一个不完全的ORM框架。sql语句需要程序员自己去编写,但是mybatis也有映射(输入参数映射、输出结果映射)。

mybatis入门门槛不高,学习成本低,让程序员把精力放在sql语句上,对sql语句优化非常方便,适用与需求变化较多项目,比如互联网项目。

mybatis框架执行过程:

1、配置mybatis的配置文件,SqlMapConfig.xml(名称不固定)

2、通过配置文件,加载mybatis运行环境,创建SqlSessionFactory会话工厂

SqlSessionFactory在实际使用时按单例方式。

3、通过SqlSessionFactory创建SqlSession

SqlSession是一个面向用户接口(提供操作数据库方法),实现对象是线程不安全的,建议sqlSession应用场合在方法体内。

4、调用sqlSession的方法去操作数据。

如果需要提交事务,需要执行SqlSession的commit()方法。

5、释放资源,关闭SqlSession

mybatis开发dao的方法:

1、原始dao 的方法

需要程序员编写dao接口和实现类

需要在dao实现类中注入一个SqlSessionFactory工厂。

2、mapper代理开发方法(建议使用)

只需要程序员编写mapper接口(就是dao接口)

程序员在编写mapper.xml(映射文件)和mapper.java需要遵循一个开发规范:

1、mapper.xml中namespace就是mapper.java的类全路径。

2、mapper.xml中statement的id和mapper.java中方法名一致。

3、mapper.xml中statement的parameterType指定输入参数的类型和mapper.java的方法输入参数类型一致。

4、mapper.xml中statement的resultType指定输出结果的类型和mapper.java的方法返回值类型一致。SqlMapConfig.xml配置文件:可以配置properties属性、别名、mapper加载。。。

输入映射:

parameterType:指定输入参数类型可以简单类型、pojo、hashmap。。

对于综合查询,建议parameterType使用包装的pojo,有利于系统扩展。

输出映射:

resultType:

查询到的列名和resultType指定的pojo的属性名一致,才能映射成功。

reusltMap:

可以通过resultMap 完成一些高级映射。

如果查询到的列名和映射的pojo的属性名不一致时,通过resultMap设置列名和属性名之间的对应关系(映射关系)。可以完成映射。

高级映射:

将关联查询的列映射到一个pojo属性中。(一对一)

将关联查询的列映射到一个List中。(一对多)

动态sql:(重点)

if判断(掌握)

where

foreach

sql片段(掌握)

课程安排:

对订单商品数据模型进行分析。

高级映射:(了解)

实现一对一查询、一对多、多对多查询。

延迟加载

查询缓存

一级缓存

二级缓存(了解mybatis二级缓存使用场景)

mybatis和spirng整合(掌握)

逆向工程(会用)

1订单商品数据模型

1.1数据模型分析思路

1、每张表记录的数据内容

分模块对每张表记录的内容进行熟悉,相当于你学习系统需求(功能)的过程。

2、每张表重要的字段设置

非空字段、外键字段

3、数据库级别表与表之间的关系

外键关系

4、表与表之间的业务关系

在分析表与表之间的业务关系时一定要建立在某个业务意义基础上去分析。

1.2数据模型分析

用户表user:

记录了购买商品的用户信息

订单表:orders

记录了用户所创建的订单(购买商品的订单)

订单明细表:orderdetail:

记录了订单的详细信息即购买商品的信息

商品表:items

记录了商品信息

表与表之间的业务关系:

在分析表与表之间的业务关系时需要建立在某个业务意义基础上去分析。

先分析数据级别之间有关系的表之间的业务关系:

usre和orders:

user---->orders:一个用户可以创建多个订单,一对多

orders--->user:一个订单只由一个用户创建,一对一

orders和orderdetail:

orders---》orderdetail:一个订单可以包括多个订单明细,因为一个订单可以购买多个商品,每个商品的购买信息在orderdetail记录,一对多关系

orderdetail--> orders:一个订单明细只能包括在一个订单中,一对一

orderdetail和itesm:

orderdetail---》itesms:一个订单明细只对应一个商品信息,一对一

items--> orderdetail:一个商品可以包括在多个订单明细,一对多

再分析数据库级别没有关系的表之间是否有业务关系:

orders和items:

orders和items之间可以通过orderdetail表建立关系。

2一对一查询

2.1需求

查询订单信息,关联查询创建订单的用户信息

2.2resultType

2.2.1sql语句

确定查询的主表:订单表

确定查询的关联表:用户表

关联查询使用内链接?还是外链接?

由于orders表中有一个外键(user_id),通过外键关联查询用户表只能查询出一条记录,可以使用内链接。

SELECT

orders.*,

https://www.sodocs.net/doc/fd10527148.html,ername,

USER.sex,

USER.address

FROM

orders,

USER

WHERE https://www.sodocs.net/doc/fd10527148.html,er_id = user.id

2.2.2创建pojo

将上边sql查询的结果映射到pojo中,pojo中必须包括所有查询列名。

原始的Orders.java不能映射全部字段,需要新创建的pojo。

创建一个pojo继承包括查询字段较多的po类。

2.2.3mapper.xml

2.2.4mapper.java

2.3resultMap

2.3.1sql语句

同resultType实现的sql

2.3.2使用resultMap映射的思路

使用resultMap将查询结果中的订单信息映射到Orders对象中,在orders类中添加User属性,将关联查询出来的用户信息映射到orders对象中的user属性中。

2.3.3需要Orders类中添加user属性

2.3.4mapper.xml

2.3.4.1定义resultMap

2.3.4.2statement定义

2.3.5mapper.java

2.4resultType和resultMap实现一对一查询小结实现一对一查询:

resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。

如果没有查询结果的特殊要求建议使用resultType。

resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。

resultMap可以实现延迟加载,resultType无法实现延迟加载。

3一对多查询

3.1需求

查询订单及订单明细的信息。

3.2sql语句

确定主查询表:订单表

确定关联查询表:订单明细表

在一对一查询基础上添加订单明细表关联即可。

SELECT

orders.*,

https://www.sodocs.net/doc/fd10527148.html,ername,

USER.sex,

USER.address,

orderdetail.id orderdetail_id,

orderdetail.items_id,

orderdetail.items_num,

orderdetail.orders_id

FROM

orders,

USER,

orderdetail

WHERE https://www.sodocs.net/doc/fd10527148.html,er_id = user.id AND orderdetail.orders_id=orders.id

3.3分析

使用resultType将上边的查询结果映射到pojo中,订单信息的就是重复。

要求:

对orders映射不能出现重复记录。

在orders.java类中添加List orderDetails属性。

最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders中的orderDetails属性中。

映射成的orders记录数为两条(orders信息不重复)

每个orders中的orderDetails属性存储了该订单所对应的订单明细。

3.4在orders中添加list订单明细属性

3.5mapper.xml

3.6resultMap定义

id="OrdersAndOrderDetailResultMap"extends="OrdersUserResultMap">

ofType="cn.itcast.mybatis.po.Orderdetail">

3.7mapper.java

3.8小结

mybatis使用resultMap的collection对关联查询的多条记录映射到一个list集合属性中。

使用resultType实现:

将订单明细映射到orders中的orderdetails中,需要自己处理,使用双重循环遍历,去掉重复记录,将订单明细放在orderdetails中。

4多对多查询

4.1需求

查询用户及用户购买商品信息。

4.2sql语句

查询主表是:用户表

关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表:

orders、orderdetail、items

SELECT

orders.*,

https://www.sodocs.net/doc/fd10527148.html,ername,

USER.sex,

USER.address,

orderdetail.id orderdetail_id,

orderdetail.items_id,

orderdetail.items_num,

orderdetail.orders_id,

https://www.sodocs.net/doc/fd10527148.html, items_name,

items.detail items_detail,

items.price items_price

FROM

orders,

USER,

orderdetail,

items

WHERE https://www.sodocs.net/doc/fd10527148.html,er_id = user.id AND orderdetail.orders_id=orders.id AND orderdetail.items_id = items.id

4.3映射思路

将用户信息映射到user中。

在user类中添加订单列表属性List orderslist,将用户创建的订单映射到orderslist

在Orders中添加订单明细列表属性Listorderdetials,将订单的明细映射到orderdetials

在OrderDetail中添加Items属性,将订单明细所对应的商品映射到Items

4.4mapper.xml

4.5resultMap定义

ofType="cn.itcast.mybatis.po.Orderdetail">

javaType="cn.itcast.mybatis.po.Items">

4.6mapper.java

4.7多对多查询总结

将查询用户购买的商品信息明细清单,(用户名、用户地址、购买商品名称、购买商品时间、购买商品数量)

针对上边的需求就使用resultType将查询到的记录映射到一个扩展的pojo中,很简单实现明细清单的功能。

一对多是多对多的特例,如下需求:

查询用户购买的商品信息,用户和商品的关系是多对多关系。

需求1:

查询字段:用户账号、用户名称、用户性别、商品名称、商品价格(最常见)

企业开发中常见明细列表,用户购买商品明细列表,

使用resultType将上边查询列映射到pojo输出。

需求2:

查询字段:用户账号、用户名称、购买商品数量、商品明细(鼠标移上显示明细)

使用resultMap将用户购买的商品明细列表映射到user对象中。

总结:

使用resultMap是针对那些对查询结果映射有特殊要求的功能,,比如特殊要求映射成list中包括多个list。

5resultMap总结

resultType:

作用:

将查询结果按照sql列名pojo属性名一致性映射到pojo中。

场合:

常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。

resultMap:

使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求)。

association:

作用:

将关联查询信息映射到一个pojo对象中。

场合:

为了方便查询关联信息可以使用association将关联订单信息映射为用户对象的pojo属性中,比如:查询订单及关联用户信息。

使用resultType无法将查询结果映射到pojo对象的pojo属性中,根据对结果集查询遍历的需要选择使用resultType还是resultMap。

collection:

作用:

将关联查询信息映射到一个list集合中。

场合:

为了方便查询遍历关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块及模块下的菜单,可使用collection将模块映射到模块list中,将菜单列表映射到模块对象的菜单list属性中,这样的作的目的也是方便对查询结果集进行遍历查询。

如果使用resultType无法将查询结果映射到list集合中。

6延迟加载

6.1什么是延迟加载

resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。

需求:

如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。

延迟加载:先从单表查询、需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

6.2使用association实现延迟加载

6.2.1需求

查询订单并且关联查询用户信息

6.2.2mapper.xml

需要定义两个mapper的方法对应的statement。

1、只查询订单信息

SELECT * FROM orders

在查询订单的statement中使用association去延迟加载(执行)下边的satatement(关联查询用户信息)

2、关联查询用户信息

通过上边查询到的订单信息中user_id去关联查询用户信息

使用UserMapper.xml中的findUserById

上边先去执行findOrdersUserLazyLoading,当需要去查询用户的时候再去执行findUserById,通过resultMap的定义将延迟加载执行配置起来。

6.2.3延迟加载resultMap

使用association中的select指定延迟加载去执行的statement的id。

id="OrdersUserLazyLoadingResultMap">

(SELECT username FROM USER WHERE https://www.sodocs.net/doc/fd10527148.html,er_id = user.id)username,

(SELECT sex FROM USER WHERE https://www.sodocs.net/doc/fd10527148.html,er_id = user.id)sex

FROM orders

-->

select="https://www.sodocs.net/doc/fd10527148.html,erMapper.findUserById"

column="user_id">

6.2.4mapper.java

6.2.5测试

6.2.5.1测试思路:

1、执行上边mapper方法(findOrdersUserLazyLoading),内部去调用cn.itcast.mybatis.mapper.OrdersMapperCustom 中的findOrdersUserLazyLoading只查询orders信息(单表)。

2、在程序中去遍历上一步骤查询出的List,当我们调用Orders中的getUser方法时,开始进行延迟加载。

3、延迟加载,去调用UserMapper.xml中findUserbyId这个方法获取用户信息。

6.2.5.2延迟加载配置

mybatis默认没有开启延迟加载,需要在SqlMapConfig.xml中setting配置。

在mybatis核心配置文件中配置:

在SqlMapConfig.xml中配置:

6.2.5.3测试代码

6.2.6延迟加载思考

不使用mybatis提供的association及collection中的延迟加载功能,如何实现延迟加载??

实现方法如下:

定义两个mapper方法:

1、查询订单列表

2、根据用户id查询用户信息

实现思路:

先去查询第一个mapper方法,获取订单信息列表

在程序中(service),按需去调用第二个mapper方法去查询用户信息。

总之:

使用延迟加载方法,先去查询简单的sql(最好单表,也可以关联查询),再去按需要加载关联查询的其它信息。7查询缓存

7.1什么是查询缓存

mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。

mybaits提供一级缓存,和二级缓存。

一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。

二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。

为什么要用缓存?

如果缓存中有数据就不用从数据库中获取,大大提高系统性能。

mybatis面试题

1、Mybatis基础: #{...} 和${...} 的区别 MyBatis将#{…} 解释为JDBC prepared statement 的一个参数标记。而将${…} 解释为字符串替换。理解这两者的区别是很有用的, 因为在某些SQL语句中并不能使用参数标记(parameter markers)。 比如,我们不能在表名(table name)的位置使用参数标记。 假设有下面的代码: 01.Mapparms = new HashMap(); 02.parms.put("table", "foo"); // 表名 03.parms.put("criteria", 37); // 查询过滤条件 04.List rows = mapper.generalSelect(parms); 01. MyBatis生成的SQL语句(prepared statement)如下所示: 01.select * from foo where col1 = ? 重要提示: 请注意,使用$ {…} (字符串替换)时可能会有SQL注入攻击的风险。另外,字符串替换在处理复杂类型也可能常常发生问题,如日期类型。由于这些因素,我们建议您尽可能地使用#{…} 这种方式。 要使用LIKE语句该怎么写? 2、有两种使用LIKE的方法。(推荐使用)第一种方法是,在Java代码中添加SQL通配符。 示例一: 01.StringwildcardName = "%Smi%"; 02.List names = mapper.selectLike(wildcardName); 01.

企业级JAVA高级开发技术实战

关于举办企业级JAVA高级开发技术实战 培训班的通知 一、培训收益 通过此次课程培训,可使学习者获得如下收益: 1.掌握JavaSE的异常处理方法; 2.掌握多线程基础知识; 3.掌握IO系统、网络编程、Java反射机制、JVM性能调优; 4.理解JavaEE,EJB、JMS,Java语言的高级特征; 5.了解GoF的设计模式、Spring AOP、WebService与CXF。 二、培训特色 1.理论与实践相结合、案例分析与行业应用穿插进行; 2.专家精彩内容解析、学员专题讨论、分组研究; 3.通过全面知识理解、专题技能和实践结合的授课方式。

四、授课专家 刘老师有15年JAVA开发经验,9年授课经验. 精通J2EE多层架构和多种设计模式,熟悉Struts、MyBatis、Hibernate、Spring、Spring MVC、Android、H5、Jquery Mobile、AngularJS、Bootstrap等多种开源框架, 对源码有一定的理解. 熟悉 WebLogic, JBoss 容器并发集群的使用, 熟悉WebService、CXF、RESFul、UML、SVN、EasyUI、Flex、Lucene 等技术。长期专注于J2EE系统的分析与设计,亲身参与多个J2EE项目研发和应用系统升级,并主导系统架构设计,有着丰富的系统分析设计工作经验 张老师天津大学软件工程硕士,10多年的IT领域相关技术研究和项目开发工作,在长期软件领域工作过程中,对软件企业运作模式有深入研究,熟悉软件质量保障标准ISO9003和软件过程改进模型CMM/CMMI,在具体项目实施过程中总结经验,有深刻认识。通晓多种软件设计和开发工具。对软件开发整个流程非常熟悉,能根据项目特点定制具体软件过程,并进行项目管理和监控,有很强的软件项目组织管理能力。对C/C++ 、HTML 5、Hadoop、java、java EE、android、IOS、大数据、云计算有比较深入的理解和应用,具有较强的移动互联网应用需求分析和系统设计能力,熟悉Android框架、IOS框架等技术,了解各种设计模式,能在具体项目中灵活运用。 龚老师企业级J2EE专家,博士,北京理工大学软件研究所计算机应用技术专业。在软件行业工作近二十年,近50多个大中型项目的主持、管理、开发经验。主要学术成果: 近年来先后在国内外重要刊物发表论文20多篇,多篇被EI收录,出版著作4部。参与完成自然科学基金项目2项,参与纵向课题5项,主持横向科研项目5项。

mybatis中文版教程

MyBatis Spring1.0.0-RC3 参考文档 MyBatis 社区(https://www.sodocs.net/doc/fd10527148.html,) Copyright ? 2010 本文档的拷贝仅允许您个人使用或分发给其他用户,但是不能收取任何费用,后期的发布无论是印刷版或电子版,也会进行版权声明。 本文档由南磊(nanlei1987@https://www.sodocs.net/doc/fd10527148.html,)翻译

目录 第一章介绍 (3) 1.1 整合动机 (3) 1.2 要求 (3) 1.3 感谢 (3) 第二章入门 (4) 2.1 安装 (4) 2.2 快速创建 (4) 第三章SqlSessionFactoryBean (6) 3.1 创建 (6) 3.2 属性 (6) 第四章事务 (8) 4.1 标准配置 (8) 4.2 容器管理事务 (8) 第五章使用SqlSession (9) 5.1 SqlSessionSupport (9) 5.2 SqlSessionTemplate (9) 第六章MapperFactoryBean (11) 6.1 创建 (11) 6.2 注入映射器 (11) 6.3 自动配置 (12) 第七章使用MyBatis API (13) 第八章示例代码 (14)

第一章介绍 1.1 整合动机 正如第二版,Spring仅支持iBatis2。那么我们就想将MyBatis3的支持加入到Spring3.0(参考Spring的Jira的问题)中。不幸的是,Spring 3.0的开发在MyBatis 3.0官方发布前就结束了。因为Spring开发团队不想发布一个基于非发行版的MyBatis的整合支持,那么Spring 官方的支持就不得不等到至少3.1版本了。要在Spring中支持MyBatis,MyBatis社区认为现在应该是自己团结贡献者和有兴趣的人一起来开始进行Spring和MyBatis整合的时候了。 这个小类库就来创建丢失的粘贴Spring和MyBtatis这两个流行框架的胶水。减少用户不得不来配置MyBatis和Spring 3.X上下文环境的样板和冗余代码。它还透明地增加了Spring 对MyBatis事务的支持。 1.2 要求 在开始阅读本手册之前,很重要的一点是你要熟悉Spring和MyBatis这两个框架还有和它们有关的术语,本手册不会提供二者的背景内容,基本安装和配置教程。 和MyBatis一样,MyBatis-Spring也需要Java 5或更高版本。 1.3 感谢 非常感谢那些使得本项目成为现实的人们(按字母顺序排序)。Eduardo Macarron,Hunter Presnall和Putthibong Boonbong的编码工作,测试和文档修改;Andrius Juozapaitis,Giovanni Cuccu,Raj Nagappan和Tomas Pinos的贡献;而Simone Tripodi发现了这些人并把他们带入项目之中。没有他们的努力,这个项目是不可能存在的。

mybatis教程从入门到精通

mybatis教程从入门到精通 什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个共同点: 1. 从配置文件(通常是XML配置文件中)得到sessionfactory. 2. 由sessionfactory 产生session 3. 在session 中完成对数据的增删改查和事务提交等. 4. 在用完之后关闭session 。 5. 在java 对象和数据库之间有做mapping 的配置文件,也通常是xml 文件。 mybatis实战教程(mybatis in action)之一:开发环境搭建 mybatis 的开发环境搭建,选择: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis3.2.0.jar包。这些软件工具均可以到各自的官方网站上下载。 首先建立一个名字为MyBaits 的dynamic web project 1. 现阶段,你可以直接建立java 工程,但一般都是开发web项目,这个系列教程最后也是web的,所以一开始就建立web工程。 2. 将mybatis- 3.2.0-SNAPSHOT.jar,mysql-connector-java-5.1.22-bin.jar 拷贝到web工程的lib 目录. 3. 创建mysql 测试数据库和用户表,注意,这里采用的是utf-8 编码 创建用户表,并插入一条测试数据 程序代码程序代码 Create TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(50) DEFAULT NULL, `userAge` int(11) DEFAULT NULL, `userAddress` varchar(200) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; Insert INTO `user` VALUES ('1', 'summer', '100', 'shanghai,pudong'); 到此为止,前期准备工作就完成了。下面开始真正配置mybatis项目了。 1. 在MyBatis 里面创建两个源码目录,分别为src_user,test_src, 用如下方式建立,鼠标右键点击JavaResource. 2. 设置mybatis 配置文件:Configuration.xml, 在src_user目录下建立此文件,内容如下:

MyBatis学习 之三动态SQL语句

MyBatis学习之三动态SQL语句 三、动态SQL语句 MyBatis学习之一、MyBatis简介与配置MyBatis+Spring+MySql MyBatis学习之二、SQL语句映射文件(1)resultMap MyBatis学习之二、SQL语句映射文件(2)增删改查、参数、缓存 MyBatis学习之三、动态SQL语句 MyBatis学习之四、MyBatis配置文件 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息。使用Oracle的序列、mysql的函数生成Id。这时我们可以使用动态sql。 下文均采用mysql语法和函数(例如字符串链接函数CONCAT)。 3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列、在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键。使用myBatis的selectKey标签可以实现这个效果。 下面例子,使用mysql数据库自定义函数nextval('student'),用来生成一个key,并把他设置到传入的实体类中的studentId属性上。所以在执行完此方法后,边可以通过这个实体类获取生成的key。 select nextval('student') INSERT INTO STUDENT_TBL(STUDENT_ID, STUDENT_NAME, STUDENT_SEX, STUDENT_BIRTHDAY, STUDENT_PHOTO, CLASS_ID, PLACE_ID) V ALUES (#{studentId}, #{studentName}, #{studentSex}, #{studentBirthday}, #{studentPhoto, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler}, #{classId}, #{placeId}) 调用接口方法,和获取自动生成key StudentEntity entity = new StudentEntity(); entity.setStudentName("黎明你好"); entity.setStudentSex(1); entity.setStudentBirthday(DateUtil.parse("1985-05-28")); entity.setClassId("20000001"); entity.setPlaceId("70000001"); this.dynamicSqlMapper.createStudentAutoKey(entity); System.out.println("新增学生ID: " + entity.getStudentId()); selectKey语句属性配置细节: 属性描述取值keyProper ty selectKey 语句生成结果需要设置的属性。 resultTyp e 生成结果类型,MyBatis 允许使用基本的数据类型,包括String 、int 类型。 order 1:BEFORE,会先选择主键,然后设置keyProperty,再执行insert 语句; 2:AFTER,就先运行insert 语句再运行selectKey 语句。 BEFORE AFTER

mybatis-3-mapper

>

黑马程序员mybatis教程第二天:延迟加载

延迟加载 什么是延迟加载 resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。 需求: 如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。 延迟加载:先从单表查询、需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。 使用association实现延迟加载 需求 查询订单并且关联查询用户信息 mapper.xml 需要定义两个mapper的方法对应的statement。 1、只查询订单信息 SELECT * FROM orders 在查询订单的statement中使用association去延迟加载(执行)下边的satatement(关联查询用户信息) 2、关联查询用户信息 通过上边查询到的订单信息中user_id去关联查询用户信息

使用UserMapper.xml中的findUserById 上边先去执行findOrdersUserLazyLoading,当需要去查询用户的时候再去执行findUserById,通过resultMap的定义将延迟加载执行配置起来。 延迟加载resultMap 使用association中的select指定延迟加载去执行的statement的id。

MyBatis基础知识

1、#{}和${}的区别是什么? #{}是预编译处理,${}是字符串替换。 #{}是sql的参数占位符,Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值; ${}是Properties文件中的变量占位符,Mybatis在处理${}时,就是把${}替换成变量的值。使用#{}可以有效的防止SQL注入,提高系统安全性。 2、MyBatis是如何进行分页的? Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。 分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。 举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10 3、在mapper中如何传递多个参数? 第一种:使用#{0},#{1}... mapper层: public selectUser(String username, String password); mapper.xml层: //对应的xml,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。 第二种:使用@param注解: mapper层: public selectUser(@param("username")String username,@param("password")String password); mapper.xml层: 4、Mybatis都有哪些Executor执行器?它们之间的区别是什么? Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor。 SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。

Mybatis3.1实战

Mybatis3.1实战 1、前言 (2) 2、什么是mybatis (2) 3、Mybatis入门实例 (2) 4、Mybatis中的增、删、改、查 (8) 5、Mybatis新特性介绍 (10) 6、mybatis-config.xml中的元素介绍 (11) 7、xml映射文件及用法 (18) 8、Mybatis参数传递 (20) 9、基于注解的sql语句 (21) 10、动态sql语句 (22) 11、mybatis中的一对多、一对一、多对多 (24) 12、自定义类型处理器 (28) 13、Spring3.1+springmvc+mybatis3.1集成 (31) 备注 (40) Like模糊查询 (40) 排序 (40) if元素中的条件语句 (40)

1、前言 随着开发团队转投Google Code旗下,ibatis3.x正式更名为Mybatis。相信很多朋友以前看过ibatis2.x,对ibatis2.x也比较熟悉,随着技术的发展,我们必须跟得上技术发展的步伐,不能永远停留在原来的技术上而不做进一步学习。由于在我的一个新项目中采用了mybatis,为此我发了几天来学习了mybatis,相对hibernate来说,本人感觉mybatis相对来说更加简单,特别是熟悉sql 语句的朋友们,你在采用mybatis时,你会觉得跟传统的jdbc方式来操作数据库没什么差别,只是mybatis帮你做了很多原来你在用jdbc来实现时的很多工作。我们来看看mybatis包含了哪些新特性。 Mybatis实现了接口绑定,使用更加方便 对象关系映射的改进,效率更高 MyBatis采用功能强大的基于OGNL的表达式来消除其他元素。 在本学习教程中,全方位介绍了mybatis中的各种特性,里面的实例都是采用比较简单的实例来实现,对于有些没有介绍到的特性,大家可以参考官方文档。本教程采用的是mybatis最新的版本mybatis3.1,并结合了maven来写这个教程,所以大家需要对maven有所了解。 2、什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs (Plan Old Java Objects,普通的Java对象)映射成数据库中的记录。 3、Mybatis入门实例 在maven中加入mybatis、mysql、junit的依赖包: junit junit 4.10 test org.mybatis mybatis 3.1.1

SpringMVC+Spring+Mybatis框架配置详细步骤(eclipse普通版)

SSI框架搭建 SpringMVC3.1.2+Spring3.1.2+Mybatis3.2.6 编号:SSI-SMVC3-S3-I3 版本:V1.0 级别:公开 编写时间:2016-02-17

目录 1导言 (1) 1.1目的 (1) 1.2范围 (1) 1.3说明 (1) 2搭建SpringMVC (2) 2.1搭建所需jar包 (2) 2.2其他依赖包 (3) 2.3搭建步骤 (4) 2.3.1创建项目 (4) 2.3.2导入jar包 (6) 2.3.3配置web.xml (7) 2.3.4配置spring-servlet.xml (9) 2.3.5配置applicationContext.xml (10) 2.3.6配置log4j.properties (10) 3整合mybatis (10) 3.1整合所需jar包 (10) 3.2其他依赖包 (11) 3.3整合步骤 (11) 3.3.1导入jar包 (11) 3.3.2配置config.properties (11) 3.3.3配置spring-dataSource.xml (12) 3.3.4 配置applicationContext.xml (15) 3.3.5配置mybatis-config.xml (16) 3.3.6创建实体model (17) 3.3.7创建实例化dao (19) 3.3.8 创建业务服务service (21) 3.3.9创建控制层controller (23)

3.3.10页面代码 (28) 3.3.11启动项目 (37)

1导言 1.1 目的 本文档是根据个人的工作经验搭建的轻量级SSI框架,也是实际应用中比较全面的基础框架,用于指导SSI框架初学者学习搭建SSI框架,希望能给各位使用者提供帮助,同时也希望朋友们尽量去帮助其他人。 1.2 范围 本次框架搭建的版本是SpringMVC3.1.2+Spring3.1.2+Mybatis3.2.6,数据库采用的是mysql,在eclipse开发工具下搭建直接搭建的web项目,页面采用的是h5,ajax实现数据访问,如果页面为jsp等,则修改controller的返回类型即可。 1.3 说明 本文档是个人总结的经验,仅供参考学习,同时欢迎朋友们一起沟通学习,文档中会对使用的jar做详细解说,对配置的过程使用图文说明,因为SSI博大精深,很多知识在搭建过程中没有使用到,只是一个基础框架的搭建,能测试通过就可以,所以对于高要求的开发,需要自己添加jar、增加方法和配置,同时文档中出现的纰漏希望朋友们等指正。 开发环境eclipse-jee-indigo-SR1-win32-dic,Tomcat7.0,JDK1.7,mysql。

mybatis实战教程之四:实现关联数据的查询

mybatis实战教程(mybatis in action)之四:实现关联数据的查询 有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等。这些查询是如何处理的呢,这一讲就讲这个问题。我们首先创建一个Article 这个表,并初始化数据. 程序代码 Drop TABLE IF EXISTS `article`; Create TABLE `article` ( `id` int(11) NOT NULL auto_increment, `userid` int(11) NOT NULL, `title` varchar(100) NOT NULL, `content` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; -- ---------------------------- -- 添加几条测试数据 -- ---------------------------- Insert INTO `article` VALUES ('1', '1', 'test_title', 'test_content'); Insert INTO `article` VALUES ('2', '1', 'test_title_2', 'test_content_2'); Insert INTO `article` VALUES ('3', '1', 'test_title_3', 'test_content_3'); Insert INTO `article` VALUES ('4', '1', 'test_title_4', 'test_content_4'); 你应该发现了,这几个文章对应的userid都是1,所以需要用户表user里面有id=1的数据。可以修改成满足自己条件的数据.按照orm的规则,表已经创建了,那么肯定需要一个对象与之对应,所以我们增加一个Article 的class 程序代码 package com.yihaomen.mybatis.model;

SSM基础框架搭建(SpringMVC+Spring+Mybatis)

SSM基础框架搭建(SpringMVC+Spring+Mybatis) SSM框架简述 到现在用了SSM框架也有一段时间了,对于基础的使用已经基本习惯,这段时间也多多少少搭了很多遍基础框架,当然每一次的搭建都会比原先搭建的东西更多些,也会更加完善,我相信大家也会从搭建的过程中成长去学到很多东西,SSM框架网上也有很多教程,不过我相信每个编写以及阅读的人总会从相似的文章中学到不同的东西. SSM框架基础概念 Spring 这里不得不说Spring非常强大,Spring拥有这IOC(控制反转,依赖注入)和AOP(面向切面编程)这两个强大的功能,这两个功能使框架足够的解耦,通过工厂模式和bean的配置完成对象的注入并且由bean生成的对象是单例的 SpringMVC SpringMVC分离了控制器,验证器,Servlet分发器,模型对象等 Mybatis Mybatis解除了程序与代码的耦合度,在一定程度上简化了sql的管理,只需要在XML中进行相应SQL的编写即可,Mybatis提供了相应的映射,配置起来更加容易 SSM基础框架搭建 这里就直接介绍SSM框架如何搭建了,至于环境配置和MAVEN项目的创建可以参考我的博客,也可以参考环境搭建,MAVEN项目搭建,下面开始搭建的教程,可能是对于上文链接博客的整合的完善与一些细微错误的纠正吧。 引入相关的JRA包 4.0.2.RELEASE 3.2.6 1.7.7 1.2.17 junit junit 4.11

Mybatis-3.3.0官方文档-中文.pdf

来获取。

Copyright ? 2010–2015 https://www.sodocs.net/doc/fd10527148.html,. All rights reserved.

XML 配置文件(configuration XML)中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务范围和控制方式的事务管理器(TransactionManager)。XML 配置文件的详细内容后面再探讨,这里先给出一个简单的示例: 当然,还有很多可以在XML 文件中进行配置,上面的示例指出的则是最关键的部分。要注意 XML 头部的声明,用来验证 XML 文档正确性。environment 元素体中包含了事务管理和连接池的配置。mappers 元素则是包含一组 mapper 映射器(这些 mapper 的XML 文件包含了 SQL 代码和映射定义信息)。 不使用 XML 构建 SqlSessionFactory 如果你更愿意直接从 Java 程序而不是 XML 文件中创建 configuration,或者创建你自己的 configuration 构建器,MyBatis 也提供了完整的配置类,提供所有和 XML 文件相同功能的配置项。

注意该例中,configuration 添加了一个映射器类(mapper class)。映射器类是 Java 类,它们包含 SQL 映射语句的注解从而避免了 XML 文件的依赖。不过,由于 Java 注解的一些限制加之某些 MyBatis 映射的复杂性,XML 映射对于大多数高级映射(比如:嵌套Join 映射)来说仍然是必须的。有鉴于此,如果存在一个对等的 XML 配置文件的话,MyBatis 会自动查找并加载它(这种情况下,BlogMapper.xml 将会基于类路径和 BlogMapper.class 的类名被加载进来)。具体细节稍后讨论。 从 SqlSessionFactory 中获取 SqlSession 既然有了 SqlSessionFactory ,顾名思义,我们就可以从中获得 SqlSession 的实例了。SqlSession 完全包含了面向数据库执行SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。例如: 诚然这种方式能够正常工作,并且对于使用旧版本 MyBatis 的用户来说也比较熟悉,不过现在有了一种更直白的方式。使用对于给定语句能够合理描述参数和返回值的接口(比如说BlogMapper.class),你现在不但可以执行更清晰和类型安全的代码,而且还不用担心易错的字符串字面值以及强制类型转换。 例如: 现在我们来探究一下这里到底是怎么执行的。

javaweb开发要学习的所有技术和框架总结:

学习javaweb开发要学习的技术和框架总结: 前言:当初想学习javaweb开发的时候,希望能够全方面地学习(这样找工作时就胸有成足了)。但是对这个根本不理解,又不认识从事这方面的熟人,所以学习起来无从下手。经过了一年的‘死’学习,从网上,从书本,从视频里面深入了解了java。想从事java的朋友,只要把这些技术全学会了,哪就业肯定没有问题了。 前端技术: HTML, CSS, JA V ASCRIPT, JQUERY, AJAX HTML “超文本”就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。 超文本标记语言的结构包括“头”部分(外语:Head)、和“主体”部分(外语:Body),其中“头”部提供关于网页的信息,“主体”部分提供网页的具体内容。 CSS 级联样式表是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。 JavaScript JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。 jQuery jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more(写得更少,做得更多)。jQuery在2006年1月由美国人John Resig在纽约的barcamp发布,吸引了来自世界各地的众多JavaScript高手加入,由Dave Methvin率领团队进行开发。如今,jQuery已经成为最流行的javascript库,在世界前10000个访问最多的网站中,有超过55%在使用jQuery。

mybatis入门教程(一)(超简单)

mybatis 第一天mybatis的基础知识 课程安排: mybatis和springmvc通过订单商品案例驱动 第一天:基础知识(重点,内容量多) 对原生态jdbc程序(单独使用jdbc开发)问题总结 mybatis框架原理(掌握) mybatis入门程序 用户的增、删、改、查 mybatis开发dao两种方法: 原始dao开发方法(程序需要编写dao接口和dao实现类)(掌握) mybaits的mapper接口(相当于dao接口)代理开发方法(掌握)mybatis配置文件SqlMapConfig.xml mybatis核心: mybatis输入映射(掌握) mybatis输出映射(掌握) mybatis的动态sql(掌握) 第二天:高级知识 订单商品数据模型分析 高级结果集映射(一对一、一对多、多对多) mybatis延迟加载 mybatis查询缓存(一级缓存、二级缓存) mybaits和spring进行整合(掌握) mybatis逆向工程 1对原生态jdbc程序中问题总结 1.1环境 java环境:jdk1.7.0_72 eclipse:indigo mysql:5.1 1.2创建mysql数据

sql_table.sql:记录表结构 sql_data.sql:记录测试数据,在实际企业开发中,最后提供一个初始化数据脚本 1.3jdbc程序 使用jdbc查询mysql数据库中用户表的记录。 创建java工程,加入jar包: 数据库驱动包(mysql5.1) 上边的是mysql驱动。 下边的是oracle的驱动。 程序代码: 1.4问题总结 1、数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能。 设想:使用数据库连接池管理数据库连接。 2、将sql语句硬编码到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。 设想:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。 3、向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。设想:将sql语句及占位符号和参数全部配置在xml中。

JavaEE测试题带答案教学提纲

1.在Java中的变量命名规范中,下面命名正确两项的是( ) (选择两项) a)¥money b)$int c)int d)*i 2.绘制流程图时,下面()代表判断和分支。(选择一项) a)矩形 b)椭圆 c)菱形 d)圆形 3.在Java环境中给出如下代码,编译运行的输出结果是()。 public class Test{ intx=1; inty=2; public int cal(intx,inty){ int z=x+y; return z; } public static void main(String args[]){ Test d = newTest(); z=d.cal(d.x,d.y); System.out.println(z); } }(选择一项) A) 3 B) 0

C) 编译错误 D) 编译通过,但运行时出错 4.下列选项中关于枚举说法错误的是()。(选择一项) a)枚举类型是从JavaSE5.0开始引入的一种新类型 b)枚举类型使用关键字enum定义 c)枚举是指由一组固定的常量组成的类型 d)在枚举中,除了可以定义枚举常量以外不能出现其他成员 5. 在Java中,以下关于多态说法错误的是()。(选择一项) a)实现多态的一个前提是要有继承关系 b)将一个父类的引用指向一个子类对象,要进行强制类型转换 c)父类引用变量指向其子类对象是实现多态的一个条件 d)使用多态可以提高代码的可扩展性和可维护性 6. 在Java中,如下代码段的输出结果为()。 Strings="hello"; s.substring(2,4); System.out.println(s.length());(选择一项) a) 5 b) 2 c) 4 d) 3 7. 在Java中,如下代码的输出结果是()。 public static void main(String[]args){ char c[]={'1','2','3','4'};