初始mybatis Posted 2022-12-06 wnwn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初始mybatis相关的知识,希望对你有一定的参考价值。
框架的概念:
应用程序的半成品;
提供可用的公用结构;
按一定规则组织的一组组件;
主流框架的介绍:
Struts 2框架:
Struts 2以WebWork优秀的设计思想核心,吸收了Struts框架的部分优点,提供了一个更加整洁的MVC设计模式实现的Web应用程序框架。它引入了几个新的框架特性:从逻辑中分离出横切关注点的拦截器,减少或者消除额配置文 件,贯穿整个框架的强大表达式语言,支持可变更和可重用MVC模式的标签API等。Struts 2充分利用了其他MVC框架学到的经验和教训,使整个框架更加清晰,更加灵活。
Hibernate框架:
Hibernate是一个优秀的持久化框架,负责简化将对象数据库保存到数据库中,或从数据库中读取数据并封装到对象的工作。Hibernat通过简单配置和编程即可替代JDBC烦琐的程序代码。Hibernate已经成为当前主流的数据库持久化框 架,被广泛应用。
Spring框架:
Spring也是一个开源框架。它的目标是使现有的javaEE技术更容易使用和促进的编程习惯。它是一个轻量级的框架,渗透了javaEE技术的方方面面。它主要作为依赖注入容器和AOP实现存在,还是提供了声明式事务,对DAO层的支 持等简化开发的功能。Spring还可以很方便地与SpringMVC,Struts2,mybatis,Hibernate等框架集成,其中大名鼎鼎的SSM集成框架指的就是基于SpringMVC+Spring+mybatis的技术框架,使用这个集成框架将使我们的应用程序更 加健壮,稳固,轻巧和优雅,这也是当前最流行的java技术框架。
SpringMVC框架:
SpringMVC是Spring框架提供的构建Web应用程序的全功能MVCC模块,属于SpringFramework的后续产品,已经融合在Spring Web Flow里面,是结构最清晰的MVC Model2的实现。并且拥有高度的可配置性,支持多种视图的技术。 还可以进行定制开发,相当灵活。此外,Spring整合SpringMVC可以说是天缝集成,是一个高性能的架构模式。现在越来越广泛地应用于在互联网的开发中。
MyBatis框架:
MyBatis是一个优秀的数据库持久化层框架,在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM实现。其封装性要低于Hibernate,性能优秀,并且小巧,简单易学,现在应用也越来越广泛。
mybatis和Hibernate框架的区别
1.Hibernate是全自动化,而mybatis是半自动;
Hibernate 完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成SQL。而mybatis仅有基本的字段映射,对象数据库以及对象实际关系仍然需要通过手写SQL来实现和管理;
2.Hibernate数据库移植性远大于mybatis;
Hibernate通过强大的映射结构和SQL语言,大大降低了对象与数据库(Oracle,mysql 等)的耦合性,而mybatis由于需要写sql,因此与数据库的耦合性直接取决于程序员 写sql的方法,如果sql不具通用性而用了很多某数据库特性的sql 语句的话,移植性也会随之降低很多,成本很高;
3.Hibernate拥有完整的日志系统,mybatis则欠缺一些;
Hibernate日志系统非常健全,涉及广泛,包括:sql记录,关系异常,优化警告,缓存提示,脏数据警告等;而mybatis则除了基本记录功能外,功能薄弱很多;
4.mybatis相比Hibernate需要关心很多细节;
Hibernate胚子要比mybatis复杂的很多,学习成本也比mybatis高,但也正因为mybatis使用简单,才导致它要比Hibernate关心很多技术细节。mybatis由于不用考虑很对细节,开发模式上于传统JDBC区别很小,因此很容易上手开发项· 目,但忽略细节会导致项目前期bug较多,因而开发出相对稳定的软件很慢,而开发软件却很快。Hibernate则正好与之相反。但是如果使用Hibernate很熟练的话,实际上开发效率丝毫不差于甚至超越mybatis。
5.sql直接优化上,mybatis要比Hibernate方便很多;
由于mybatis的sql都是写在xml里,因此优化sql比Hibernate方柏霓很多。而Hibernate的sql很多都是自动生成的,无法支架维护sql;虽有sql,但功能还是不急sql强大,见到报表等变态需求时,hql也歇菜,也就是说hql是由局限的; Hibernate虽然也支持原生sql,但开发模式上却与orm不同,需要转换思维,因此使用上不是非常方便。总之写sql的灵活度上Hibernate不急mybatis。
总结:
mybatis:小巧,方便,高效,简单,直接,半自动;
hibernate:强大,方便,高效,负载,绕圈子,全自动;
Struts 2 框架和SpringMVC框架的区别
1.拦截机制不同
Struts2是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype,然后通过setter,getter把request数据注入到属性。Struts2中,一个Action对应一个request,response上 下文,在接受参数时,可以通过属性接收,这说明属性参数是让对个方法共享的。Struts2中Action的一个方法可以对应一个url,而其他类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了,只能设计多例。
SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又和一个url对应,参数的传递是直接注入到方法中,是方法所独有的。处理结果通过 ModeMaop返回给框架。在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,又因为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加 @Scope注解修改。
Struts2有自己拦截Interceptor机制,SpringMVC这是用的是独立Aop方式,这样导致Struts2配置文件量还是比SpringMVC大。
2.底层框架的不同
Strurs2采用Filter(StrutsPrepareAndExecuteFilter)实现,SpringMVC(DispatcherServlet)则采用Servlet实现。Filter在容器启动之后即初始化;服务器停止以后坠毁,晚于Servlet。Servlet在是在调用时初始化,先于Fileter调用, 服务器停止后销毁。
3.性能方面
Struts2类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,有加载一次单例模式bea注入。所以SpringMVC开发效率和性能高Struts2。
4.配置方面
SpringMVC和Spring是无缝的。从这个项目的管理和安全上也比Struts高。
MyBatis三大基本要素
? 核心接口和类 ? MyBatis 核心配置文件(mybatis-config.xml) ? SQL 映射文件(mapper.xml)
MyBatis核心接口和类
1、每个 MyBatis 的应用程序都以一个 SqlSessionFactory 对象的实例为核心,SqlSessionFactory 对象实例可以通过 SqlSessionFactoryBuilder 对象来获得。首先获取 SqlSessionFactoryBuilder 对象,可以根据 XML 配置文件或 Configuration 类的实例构建该对象。然后获取 SqlSessionFactory 对象,有了 SqlSessionFactory 对象之后,就可以进而获取 Sqlsession 实例, Sqlsession 对象中完全包含以数据库为背景的所有执行 SQL 操作的方法。可以用该实例来 直接执行已映射的 SQL 语句。
2、根据 XML 配置文件构建 SqlSessionFactory 的实例非常简单,建议使用。
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //获取 SqlSessionFactory 对象实例
SqlSession session = sqlSessionFactory.openSession(); //获取 SqlSession 对象实例
try
//业务逻辑代码:如通过调用 session 对象的一系列 SQL 操作方法,对数据库表执行 CRUD 操作
int count=session.selectOne("com.mybatis.dao.UserMapper.count", 2); //方式 1
int count= session.getMapper(UserMapper.class).count(2); //方式 2:更简单,代码更安全,减少类型转换错误(推荐使用)
finally
session.close(); //关闭 SqlSession
说明:
1、UserMapper mapper = session.getMapper(UserMapper.class); //获取映射器实例 mapper
2、映射器是你创建绑定映射语句的接口,映射器接口的实例可以从 SqlSession 中获得,映射器实例的最佳范围是方法范围。即它们应该在使用它们的方法中被请求,然后就抛弃掉。它们不需要明确地关闭。
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder作用
SqlSessionFactoryBuilder 负责构建 SqlSessionFactory,并且提供了多个 build() 方法的重载,由于方法参数 environment 和 Properties 都可以为 null,那么去除重复的,真正的重载方法其实只有如下三种:
MyBatis的基本要素——核心配置文件
MyBatis 核心配置文件( mybatis-config.xml),该文件配置了 MyBatis 的一些全局信息,包含数据库连接信息和 MyBatis 运行时所需的各种特性,以及设置和影响 MyBatis 行为的一些属性。
mybatis-config.xml文件结构
mybatis-config.xml 文件需配置一些基本元素,需要注意的是,该配置文件的元素节点是有先后顺序的,其层次结构如下图:
说明:
1、从上图中可以看出,configuration 元素是整个 XML 配置文件的根节点,其角色就相当于是 MyBatis 的总管, MyBatis 所有的配置信息都会存放在它里面。 MyBatis 还提供了设置这些配置信息的方法。 Configuration 可从配置 文件里获取属性值,也可以通过程序直接设置。Configuration 可供配置的内容如下。
2、mybatis-config.xml 文件的元素节点是有一定顺序的,节点位置若不按顺序排位,那么 XML 文件会报错
jdbc.properties 文件
driver=com.mysql.jdbc.Driver url=jdbc:mysql:///smbms user=root password=123
mybatis-config.xml文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="jdbc.properties"></properties> <!-- 环境配置 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <!-- 数据库连接相关配置 ,这里动态获取config.properties文件中的内容--> <dataSource type="POOLED"> <property name="driver" value="$driver" /> <property name="url" value="$url" /> <property name="username" value="$user" /> <property name="password" value="$password" /> </dataSource> </environment> </environments> <!-- mapping文件路径配置 --> <mappers> <mapper resource="com/mybatis/Dao/UserMapper.xml"/> <!-- 如果没有UserMapper.xml文件 就需要以下操作 要在对应的接口中写注释方法 --> <!--<mapper class="com.mybatis.Dao.UserMapper"></mapper>--> </mappers> </configuration>
小配置文件(名称必须与Dao接口名相同)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- mapper为映射的根节点,namespace指定Dao接口的完整类名 mybatis会依据这个接口动态创建一个实现类去实现这个接口, 而这个实现类是一个 Mapper对象--> <mapper namespace="com.mybatis.Dao.UserMapper"> <!-- parameterType:参数类型 resultType:返回的结果类型 id:对应Dao接口的方法--> <select id="getOne" resultType="com.mybatis.entity.User"> SELECT * FROM smbms_user </select> <delete id="del" parameterType="int" > DELETE FROM smbms_user WHERE id=#id </delete> <insert id="add" parameterType="com.mybatis.entity.User" > INSERT INTO smbms_user(userCode,userName,userPassword,gender,birthday,phone,address,userRole,createdBy,creationDate) VALUES (#userCode,#userName,#userPassword,#gender,#birthday,#phone,#address,#userRole,#createdBy,#creationDate) </insert> <update id="update" parameterType="com.mybatis.entity.User"> UPDATE smbms_user SET userCode=#userCode WHERE id=#id </update> </mapper>
接口中实现注解方式编写SQL
如果不想编写小配置文件需编写注释
使用注解测试SQL
以上是关于初始mybatis的主要内容,如果未能解决你的问题,请参考以下文章
mybatisMyBatis Generator
MybatisMyBatis 注解方式的基本 用法
MybatisMyBatis之缓存
MyBatisMyBatis的增删改查
Mybatismybatis登录实例
MybatisMybatis基础(中)