JavaEE SpringMyBatis是什么? 它和Hibernate的区别及如何配置MyBatis
MyBatis
- MyBatis是一个基于Java的持久层框架。MyBatis提供的持久层框架包括SQLMaps和DataAccessObjects(DAO),它消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。
- MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(PlainOldJavaObjects,普通的Java对象)映射成数据库中的记录。
- 目前,Java的持久层框架产品有许多,常见的有Hibernate和MyBatis。
MyBatis和hibernate的区别有哪些
首先要知道ORM框架,简单来说就是通过实例对象的语法,完成关系型数据库的操作的一种框架,是对象-关系映射,也就是把数据库映射成对象
开发方面
- MyBatis是一个半自动映射的框架,因为MyBatis需要手动匹配POJO、SQL和映射关系。(半自动ORM,需要写sql并配置对象之间的关系)
- Hibernate是一个全表映射的框架,只需提供POJO和映射关系即可。(全自动ORM不需要写sql以java对象表示数据库关系,自动完成sql的包装还可以跨数据库)
sql优化方面
- Hibernate不需要编写大量的SQL,就可以完全映射,提供了日志、缓存、级联(级联比MyBatis强大)等特性,此外还提供HQL(HibernateQueryLanguage)对POJO进行操作。但会多消耗性能。
- MyBatis手动编写SQL,支持动态SQL、处理列表、动态生成表名、支持存储过程。工作量相对大些。(优化工作比较方便)
不同优势
- 在技术选型时需考虑,如果数据库的设计上会有较大的,频繁的调整,就是有MyBatis
- 如果需要做很多优化工作MyBatis也是更胜一筹
实现过程
2)加载映射文件。映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在MyBatis配置文件mybatis-config.xml中加载。mybatis-config.xml文件可以加载多个映射文件,每个文件对应数据库中的一张表。
3)构造会话工厂:通过MyBatis的环境等配置信息构建会话工厂SqlSessionFactory。
4)创建会话对象:由会话工厂创建SqlSession对象,该对象中包含了执行SQL语句的所有方法。
5)Executor执行器:MyBatis底层定义了一个Executor接口来操作数据库,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。
6)MappedStatement对象:在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息。
7)输入参数映射:输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输入参数映射过程类似于JDBC对preparedStatement对象设置参数的过程。
8)输出结果映射:输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于JDBC对结果集的解析过程。
MyBatis在SpringBoot中的配置
- 创建一个SpringBoot项目
- 配置pom.xml文件
org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.1 org.mybatis.generator mybatis-generator-core 1.3.5 mysql mysql-connector-java 5.1.47 runtime com.alibaba druid-spring-boot-starter 1.1.21
在源代码路径下创建Generator
importorg.mybatis.generator.api.MyBatisGenerator; importorg.mybatis.generator.config.Configuration; importorg.mybatis.generator.config.xml.ConfigurationParser; importorg.mybatis.generator.internal.DefaultShellCallback; importjava.io.File; importjava.io.InputStream; importjava.util.ArrayList; importjava.util.List; publicclassGenerator{ privatestaticfinalbooleanOVERWRITE=true; privatestaticfinalStringCONFIG_PATH="generator/config.xml"; publicstaticvoidmain(String[]args)throwsException{ System.out.println("--------------------startgenerator-------------------"); System.out.println(newFile("").getAbsolutePath()); Listwarnings=newArrayList<>(); ClassLoaderclassloader=Thread.currentThread().getContextClassLoader(); InputStreamis=classloader.getResourceAsStream(CONFIG_PATH); ConfigurationParsercp=newConfigurationParser(warnings); Configurationconfig=cp.parseConfiguration(is); DefaultShellCallbackcallback=newDefaultShellCallback(OVERWRITE); MyBatisGeneratormyBatisGenerator=newMyBatisGenerator(config,callback,warnings); myBatisGenerator.generate(null); warnings.forEach(System.err::println); System.out.println("--------------------endgenerator-------------------"); } }
在resources目录下配置application.properties
#debug=true #设置打印日志的级别,及打印sql语句 logging.level.root=ERROR logging.level.druid.sql.Statement=ERROR logging.level.frank=DEBUG #美化JSON数据格式 spring.jackson.serialization.indent-output=true #设置JSON数据的日期格式 spring.jackson.date-format=yyyy-MM-ddHH:mm:ss spring.jackson.time-zone=GMT+8 #JSON数据属性为null时不返回 spring.jackson.default-property-inclusion=non_null #找不到资源404时抛出异常 spring.mvc.throw-exception-if-no-handler-found=true #禁用静态资源的自动映射,如不禁用,不存在的url将被映射到/**,servlet不有机会抛出异常 #spring.resources.add-mappings=false #get请求参数及表单提交数据的日期格式 spring.mvc.date-format=yyyy-MM-ddHH:mm:ss #应用/项目的部署路径,默认为/ #server.servlet.context-path=/lucky-draw #SpringMVC中,DispatcherServlet的映射路径,默认为/** #spring.mvc.servlet.path=/** #静态资源映射:将路径映射为/,即/static/xxx,映射为/xxx,支持多个字符串,逗号间隔 #默认为/META-INF/resources/,/resources/,/static/,/public/ #spring.resources.static-locations=/static/,/public/ #====================要根据具体数据库配置......的部分开始==================== #druid数据库连接池配置 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/......?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false spring.datasource.username=root spring.datasource.password=...... spring.datasource.druid.initial-size=1 spring.datasource.druid.min-idle=1 spring.datasource.druid.max-active=20 spring.datasource.druid.test-on-borrow=true #Mybatis配置 mybatis.mapper-locations=classpath:mapper/**Mapper.xml #mybatis.type-aliases-package=frank.mapper mybatis.configuration.map-underscore-to-camel-case=true #mybatis.config-location=classpath:mybatis/mybatis-config.xml #====================要根据具体数据库配置......的部分结束==================== ##mapper ##mappers多个接口时逗号隔开 ##mapper.mappers=tk.mybatis.mapper.common.Mapper,tk.mybatis.mapper.common.MySqlMapper,tk.mybatis.mapper.common.IdsMapper ##mapper.notEmpty=true ##mapper.identity=MYSQL # ##pagehelper ##数据库方言:oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby #pagehelper.helperDialect=mysql ##默认值为false,该参数对使用RowBounds作为分页参数时有效。当该参数设置为true时,会将RowBounds中的offset参数当成pageNum使用,可以用页码和页面大小两个参数进行分页。 ##pagehelper.offset-as-page-num=falses ##默认值为false,该参数对使用RowBounds作为分页参数时有效。当该参数设置为true时,使用RowBounds分页会进行count查询。 #pagehelper.row-bounds-with-count=true ##默认值为false,当该参数设置为true时,如果pageSize=0或者RowBounds.limit=0就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是Page类型)。 ##pagehelper.page-size-zero=false ##分页合理化参数,默认值为false。当该参数设置为true时,pageNum<=0时会查询第一页,pageNum>pages(超过总数时),会查询最后一页。默认false时,直接根据参数进行查询。 #pagehelper.reasonable=true ##为了支持startPage(Objectparams)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值,可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值,默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。 #pagehelper.params=pageNum=pageNumber;pageSize=pageSize;count=countSql;reasonable=reasonable; ##支持通过Mapper接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面params配置的字段中取值,查找到合适的值时就会自动分页。使用方法可以参考测试代码中的com.github.pagehelper.test.basic包下的ArgumentsMapTest和ArgumentsObjTest。 ##pagehelper.supportMethodsArguments=true ##用于控制默认不带count查询的方法中,是否执行count查询,默认true会执行count查询,这是一个全局生效的参数,多数据源时也是统一的行为。 #pagehelper.default-count=false
在resources目录下创建Generator包并且配置config.xml文件
-->
如果不知道路径可以自己打印一下当前项目的绝对路径
importjava.io.File; /** *CreatedwithIntelliJIDEA. *Description:Ifyoudon'tworkhard,youwillaloser. *User:Listen-Y. *Date:2020-08-21 *Time:17:41 */ publicclasstest{ publicstaticvoidmain(String[]args){ //打印当前项目的绝对路径 System.out.println(newFile("").getAbsolutePath()); } }
在test目录下创建resources包
- 将application.properties和config.xml自己配置完毕就可以在Generator中运行
- 最后把test目录下生成的model和mapper复制到源文件的启动目录的包下把resources目录下生成的mapper复制到源文件的resources目录下
- 在启动文件中加
@MapperScan(basePackages="启动类的根包名.mapper")
给mapper的每个文件增加注解
@Mapper
总结
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。