Chapter1Chapter1_第1页
Chapter1Chapter1_第2页
Chapter1Chapter1_第3页
Chapter1Chapter1_第4页
Chapter1Chapter1_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Chapter1 MyBatis入门*课程回顾*1 Struts2 Spring4 Hibernate5 整合开发 *教学导航*1 MyBatis介绍及工作原理2 MyBatis的优缺点3 入门示例版本说明 :系列讲解案例版本选用3.4.11、 Mybatis介绍MyBatis 源于 Apache 的一个开源项目 iBatis,而 iBatis 一词则来源于“internet”和“abatis”的组合,2010年这个项目由 Apache Software Foundation 迁移到了 Google Code,并且改名为MyBatis ,2013年11月其又迁移到 Github。MyBatis 是一个MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。原理详解:MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,配置来源于两个地 方,一处是配置文件,一处是Java代码的注解,获取一个SqlSession。SqlSession包含了执行sql所需要的所有方法,可以通过 SqlSession实例直接运行映射的sql语句,完成对数据的增删改查和事务提交等,用完之后关闭SqlSession。mybatis配置SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂,由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。为什么要选用MyBatis?可以解决什么问题通过上面的介绍,我们知道 MyBatis 是来和数据库打交道。那么在这之前,我们是使用 JDBC 来对数据库进行增删改查等一系列操作的,而我们之所以会放弃使用 JDBC,转而使用 MyBatis 框架,这是为什么呢?或者说使用MyBatis 对比 JDBC 有什么好处?回忆JDBC的实现过程(不用工具类的前提情况)1、 加载数据库驱动2、 创建并获取数据库链接3、 创建jdbc statement对象4、 设置sql语句5、 设置sql语句中的参数(使用preparedStatement)6、 通过statement执行sql并获取结果7、 对sql执行结果进行解析处理8、 释放资源(resultSet、preparedstatement、connection)这样使用会造成的问题:问题一:数据库连接,使用时就创建,使用完毕就关闭,这样会对数据库进行频繁的获取连接和关闭连接,造成数据库资源浪费,影响数据库性能。设想解决:使用数据库连接池管理数据库连接问题二:将 sql 语句硬编码到程序中,如果sql语句修改了,那么需要重新编译 Java 代码,不利于系统维护设想解决:将 sql 语句配置到 xml 文件中,即使 sql 语句变化了,我们也不需要对 Java 代码进行修改,重新编译问题三:在PreparedStatement 中设置参数,对占位符设置值都是硬编码在Java代码中,不利于系统维护设想解决:将 sql 语句以及占位符和参数都配置到 xml 文件中问题四:从 resultset 中遍历结果集时,对表的字段存在硬编码,不利于系统维护设想解决:将查询的结果集自动映射为 Java 对象问题五:缓存做的很差,如果存在数据量很大的情况下,这种方式性能特别低设想解决:集成缓存框架去操作数据库# MyBatis优缺点 #优点:1、简单易学mybatis本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现2、灵活mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。3、解除sql与程序代码的耦合通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。4、提供映射标签,支持对象与数据库的orm字段关系映射5、提供对象关系映射标签,支持对象关系组建维护6、提供xml标签,支持编写动态sql。缺点:1、编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。2、SQL语句依赖于数据库,导致数据库移植性差,不方便更换数据库。3、框架还是相对简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。4、二级缓存机制不佳jdbc,mybatis,hibernate的区别1)从层次上看,JDBC是较底层的持久层操作方式,而Hibernate和MyBatis都是在JDBC的基础上进行了封装使其更加方便程序员对持久层的操作。2)从功能上看,JDBC就是简单的建立数据库连接,然后创建statement,将sql语句传给statement去执行,如果是有返回结果的查询语句,会将查询结果放到ResultSet对象中,通过对ResultSet对象的遍历操作来获取数据;Hibernate是将数据库中的数据表映射为持久层的Java对象,如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,对sql语句进行修改和优化较为困难;MyBatis是将sql语句中的输入参数和输出参数映射为java对象,sql修改和优化比较方便.3)从使用上看,如果进行底层编程,而且对性能要求极高的话,应该采用JDBC的方式;如果要对数据库进行完整性控制的话建议使用Hibernate;如果要灵活使用sql语句的话建议采用MyBatis框架。2、 MyBatis 快速入门程序1、 创建javaWeb工程项目MyBatisOne,加入mybatis核心包、依赖包、数据驱动mybatis-3.4.1.jar:核心jar mysql-connector-java-.jar:数据库访问asm-5.3.4.jar:增强类 cglib-3.2.2.jar:动态代理commons-logging-1.2.jar:通用日志 log4j-1.2.17.jar:日志slf4j-api-1.7.21.jar:日志 slf4j-log4j12-1.7.21.jar:日志javassist-3.20.0-GA.jar : java助手注意:log4j和Junit不是必须的,但是我们为了查看日志以及便于测试,加入了这两个jar包2、 创建数据库脚本DROP TABLE IF EXISTS user;CREATE TABLE user ( id int(11) NOT NULL AUTO_INCREMENT, username varchar(32) NOT NULL COMMENT 用户名称, birthday varchar(32) NOT NULL COMMENT 生日, sex char(1) DEFAULT NULL COMMENT 性别, address varchar(256) DEFAULT NULL COMMENT 地址, PRIMARY KEY (id) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;3、 创建perties 在类目录src下面mybatis默认使用log4j作为输出日志信息# Global logging configurationlog4j.rootLogger=DEBUG, stdout# Console output.log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p %t - %m%n4、 在类路径src下增加mybatis核心配置文件,创建SqlMapConfig.xml使用jdbc事务管理,mybatis控制事务; 另一个值是MANAGED,是交由容器管理,如weblogic等,在Mysql中,只有当表的类型是INNODB的时候,才支持事务5、 编写实体类 及 映射文件public class User private int id;private String username;/ 用户姓名private String sex;/ 性别private Date birthday;/ 生日private String address;/ 地址省略 get set 方法在类路径src下创建sql映射文件UserMapper.xml namespace名空间取个不重复名字select * from user where id = #id select * from user where username like %$value% parameterType:定义输入到sql中的映射类型,#id表示使用preparedstatement设置占位符号并将输入变量id传到sql,#可以有效防止sql注入。resultType:定义结果映射类型。 模糊查询:根据 user 表的username字段 下面两种写法都可以,但是要注意 1、$value里面必须要写value,不然会报错 2、$表示拼接 sql 字符串,将接收到的参数不加任何修饰拼接在sql语句中 3、使用$会造成 sql 注入6、 系统加载注册映射文件修改SqlMapConfig.xml 在environments节点下增加 7、 增加Dao数据访问层public interface UserDao /* * 根据id查询user表数据 */public void selectUserById();/* * 模糊查询:根据 user 表的username字段 */public void selectLikeUserName();/* * 增加用户 */public void addUser();/* * 根据id删除用户*/public void delete();/* * 更新用户信息*/public void update();public class UserDaoImp implements UserDao/会话工厂private SqlSessionFactory sqlSessionFactory;/* * junit测试中方法调用时,在执行之前初始化方法 */Beforepublic void init() throws IOException/定义mybatis全局配置文件String resource = SqlMapConfig.xml;/加载 mybatis 全局配置文件InputStream inputStream = Resources.getResourceAsStream(resource);/构建sqlSession的工厂sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);Testpublic void selectUserById()/*这个字符串由 userMapper.xml 文件中 两个部分构成 的 namespace 的值 id 值*/ 数据库会话实例SqlSession sqlSession = null;try / 创建数据库会话实例sqlSessionsqlSession = sqlSessionFactory.openSession();/ 查询单个记录,根据用户id查询用户信息User user = sqlSession.selectOne(UserMapper.findUserById, 10);/ 输出用户信息System.out.println(user.getUsername(); catch (Exception e) e.printStackTrace(); finally if (sqlSession != null) sqlSession.close();Testpublic void selectLikeUserName()SqlSession sqlSession = null;try / 创建数据库会话实例sqlSessionsqlSession = sqlSessionFactory.openSession();/ 查询单个记录,根据用户id查询用户信息List list = sqlSession.selectList(UserMapper.findUserByUsername, 张);System.out.println(list.get(0).getAddress(); catch (Exception e) e.printStackTrace(); finally if (sqlSession != null) sqlSession.close();java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing注意:junit用了自动导入的包没有问题如果是用了junit-4.8以上的版本会异常,需要增加hamcrest-core-1.3.jar包来解决,否则只能用4.8或以下的版本。8、 用junit分别测试类的两个方法,第一个结果为:SelectLikeUserName方法运行显示结果:现在要增加一个保存的功能怎么加?1、 修改UserMapper.xml 添加数据的语句配置注意多个值传参数 要用属性名 insert into user(id,username,sex,birthday,address) value(#id,#username,#sex,#birthday,#address) 2、 修改userDaoImp.java 增加添加数据的方法Testpublic void addUser() / 数据库会话实例SqlSession sqlSession = null;try / 创建数据库会话实例sqlSessionsqlSession = sqlSessionFactory.openSession();/ 添加用户信息User user = new User();user.setUsername(张小明);user.setAddress(河南郑州);user.setSex(1);user.setBirthday(1996-9-9);int size = sqlSession.insert(UserMapper.insertUser, user);/提交事务sqlSmit();System.out.println(size); catch (Exception e) sqlSession.rollback();e.printStackT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论