GVKun编程网logo

Mybatis配置中的#{}和${}有什么区别(mybatis里#和$的区别)

11

在本文中,我们将为您详细介绍Mybatis配置中的#{}和${}有什么区别的相关知识,并且为您解答关于mybatis里#和$的区别的疑问,此外,我们还会提供一些关于##在Mybatis框架中#{}与$

在本文中,我们将为您详细介绍Mybatis配置中的#{}和${}有什么区别的相关知识,并且为您解答关于mybatis里#和$的区别的疑问,此外,我们还会提供一些关于##在Mybatis框架中#{}与${}有什么区别?你知道么?、ibatis和mybatis有什么区别、ibatis配置类似mybatis的plugins来配置拦截器的问题、JavaEE SpringMyBatis是什么? 它和Hibernate的区别及如何配置MyBatis的有用信息。

本文目录一览:

Mybatis配置中的#{}和${}有什么区别(mybatis里#和$的区别)

Mybatis配置中的#{}和${}有什么区别(mybatis里#和$的区别)

两者区别

#号和$号,都是实现动态sql的一种方式,通过这两种方式可以把参数传到XML之后,再执行之前,MyBatis才会对这两种占位符进行一个动态解析。

#号等同于JDBC里面的?占位符,它相当于向PreparedStatement预处理语句中去设置一个参数,PreparedStatement语句是预编译的,如果在设置的参数中包含有特殊字符,就会进行自动转义,所以#号占位符可以防止sql注入。

例子:

解析前:select * from user order by #(age) desc;

解析后:select * from user order by ?desc;

$号相当于是直接把参数,拼接到了原始的sql里面,而myBatis不会对它进行任何特殊的处理。

解析前:select * from user order by ${age} desc;

解析后:select * from user order by age desc;

所以它们最大的区别就是在于

$是动态参数,#是占位符,

动态参数无法防止sql注入。而在实际应用中,应该尽可能去使用#占位符,另外$符号动态传参可以应用于一些动态sql场景中,比如说动态传递表名,动态设置排序字段等等。

 

##在Mybatis框架中#{}与${}有什么区别?你知道么?

##在Mybatis框架中#{}与${}有什么区别?你知道么?

在Mybatis框架中#{}与${}有什么区别?你知道么?

  #{}表示一个占位符号
    通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换, #{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类 型值,#{}括号中可以是 value 或其它名称。
  ${}表示拼接 sql 串
   通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换, ${}可以接收简 单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}括号中只能是 value。

 

ibatis和mybatis有什么区别

ibatis和mybatis有什么区别

ibatis和mybatis的区别:1、基本信息不同;2、开发时间不同;3、功能与易用性;4、配置文件;5、入参类型与出参类型;6、返回结果集接受方式;7、语法差异;8、数据库方言支持;9、插件支持;10、社区活跃度;11、全球化支持。详细介绍:1、基本信息不同,ibatis提供持久层框架,包括sql maps和data access objects等等。

ibatis和mybatis有什么区别

本教程操作系统:windows10系统、DELL G3电脑。

iBatis和MyBatis都是持久层框架,用于简化数据库访问操作,但它们之间存在一些差异。以下是关于iBatis和MyBatis区别的详细解答:

1、基本信息不同:

  • iBatis提供持久层框架,包括SQL Maps和Data Access Objects(DAO),并有一个JPetStore实例作为其实现。
  • MyBatis则是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOs(Plain Ordinary Java Object,普通的Java对象)映射成数据库中的记录。

2、开发时间不同:

  • iBatis一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。
  • MyBatis原本是iBatis的一个分支,由Apache Software Foundation在2010年迁移到了Google Code,并在2013年迁移到了Github。

3、功能与易用性:

  • MyBatis提供了更为强大的功能,同时并没有损失其易用性。相反,在很多地方都借助于JDK的泛型和注解特性进行了简化。

4、配置文件:

  • iBatis的配置文件通常命名为sqlMapConfig.xml。
  • MyBatis的配置文件则命名为Configuration.xml。

5、入参类型与出参类型:

  • iBatis中元素的入参类型为parameterClass。
  • MyBatis中元素的入参类型为parameterType。
  • iBatis中元素的出参类型(返回结果类型)为resultClasss。
  • MyBatis中元素的出参(返回结果类型)类型为resultType。

6、返回结果集接受方式:在iBatis中,结果集返回到class;而在MyBatis中,返回结果集的方式有所不同。

7、语法差异:iBatis和MyBatis在编写SQL语句时也有细微的语法差别。例如,iBatis中需要使用标签来包含其他SQL语句,而在MyBatis中则不需要。另外,MyBatis还提供了更为丰富的动态SQL功能,例如等标签,使得在构建动态SQL查询时更加灵活和方便。

8、数据库方言支持:MyBatis支持更多的数据库方言,可以更好地适应不同的数据库系统,而iBatis则相对较为有限。

9、插件支持:MyBatis有更为丰富的插件支持,可以方便地扩展其功能。

10、社区活跃度:由于MyBatis较晚出现,其社区的活跃度要高于iBatis。这使得MyBatis在更新和维护方面可能更有优势。

11、全球化支持:iBatis支持国际化和本地化,可以更好地适应多语言环境的需求。而MyBatis在这方面的支持则相对较少。

综上所述,iBatis和MyBatis在功能、语法、配置和使用上都有一些差异。选择使用哪一个框架取决于具体的项目需求和个人偏好。不过从整体上看,由于MyBatis的社区活跃度和功能的不断增强,越来越多的人选择使用MyBatis作为持久层框架。

以上就是ibatis和mybatis有什么区别的详细内容,更多请关注php中文网其它相关文章!

ibatis配置类似mybatis的plugins来配置拦截器的问题

ibatis配置类似mybatis的plugins来配置拦截器的问题

ibatis拦截器怎么配置?

JavaEE SpringMyBatis是什么? 它和Hibernate的区别及如何配置MyBatis

JavaEE SpringMyBatis是什么? 它和Hibernate的区别及如何配置MyBatis

这篇文章主要介绍了JavaEE Spring MyBatis是什么? 它和Hibernate的区别有哪些?如何配置MyBatis?本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

MyBatis

MyBatis 是一个基于 Java 的持久层框架。MyBatis 提供的持久层框架包括 sql Maps 和 Data Access Objects(DAO),它消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。

MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

目前,Java 的持久层框架产品有许多,常见的有 Hibernate 和 MyBatis。

MyBatis和hibernate的区别有哪些

首先要知道ORM框架, 简单来说就是通过实例对象的语法, 完成关系型数据库的操作的一种框架, 是 对象-关系 映射, 也就是把数据库映射成对象

开发方面

MyBatis 是一个半自动映射的框架,因为 MyBatis 需要手动匹配 POJO、sql 和映射关系。(半自动ORM, 需要写sql并 配置对象之间的关系)

Hibernate 是一个全表映射的框架,只需提供 POJO 和映射关系即可。(全自动ORM 不需要写sql以java对象表示数据库关系, 自动完成sql的包装 还可以跨数据库 )

sql 优化方面

Hibernate 不需要编写大量的 sql,就可以完全映射,提供了日志、缓存、级联(级联比 MyBatis 强大)等特性,此外还提供 HQL(Hibernate Query Language)对 POJO 进行操作。但会多消耗性能。

MyBatis 手动编写 sql,支持动态 sql、处理列表、动态生成表名、支持存储过程。工作量相对大些。 (优化工作比较方便)

不同优势

在技术选型时需考虑, 如果数据库的设计上会有较大的, 频繁的调整, 就是有MyBatis

如果需要做很多优化工作 MyBatis也是更胜一筹

实现过程

1)读取 MyBatis 配置文件:mybatis-config.xml 为 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在Spring Boot中的配置

创建一个SpringBoot项目配置pom.xml文件org.mybatis.spring.bootmybatis-spring-boot-starter2.1.1org.mybatis.generatormybatis-generator-core1.3.5MysqLmysql-connector-java5.1.47runtimecom.alibabadruid-spring-boot-starter1.1.21在源代码路径下创建Generatorimport org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.mybatis.generator.internal.DefaultShellCallback; import java.io.File; import java.io.InputStream; import java.util.ArrayList; import java.util.List; public class Generator { private static final boolean OVERWRITE = true; private static final String CONfig_PATH = "generator/config.xml"; public static void main(String[] args) throws Exception { System.out.println("--------------------start generator-------------------"); System.out.println(new File("").getAbsolutePath()); List warnings = new ArrayList(); ClassLoader classloader = Thread.currentThread().getContextClassLoader(); InputStream is = classloader.getResourceAsstream(CONfig_PATH); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(is); DefaultShellCallback callback = new DefaultShellCallback(OVERWRITE); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); warnings.forEach(System.err::println); System.out.println("--------------------end generator-------------------"); } }在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-dd HH: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-dd HH: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 时,pageNumpages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。 #pageHelper.reasonable=true ##为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 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文件如果不知道路径可以自己打印一下当前项目的绝对路径import java.io.File; /** * Created with IntelliJ IDEA. * Description: If you don't work hard, you will a loser. * User: Listen-Y. * Date: 2020-08-21 * Time: 17:41 */ public class test { public static void main(String[] args) { //打印当前项目的绝对路径 System.out.println(new File("").getAbsolutePath()); } }在test目录下创建resources包

将application.properties和config.xml自己配置完毕就可以在Generator中运行最后把test目录下生成的model和mapper复制到源文件的启动目录的包下 把resources目录下生成的mapper复制到源文件的resources目录下在启动文件中加@MapperScan(basePackages = "启动类的根包名.mapper")给mapper的每个文件增加注解@Mapper总结到此这篇关于JavaEE SpringMyBatis是什么? 它和Hibernate的区别及如何配置MyBatis的文章就介绍到这了,更多相关JavaEE Spring MyBatis是什么它和Hibernate的区别内容请搜索小编以前的文章或继续浏览下面的相关文章希望大家以后多多支持小编!

今天的关于Mybatis配置中的#{}和${}有什么区别mybatis里#和$的区别的分享已经结束,谢谢您的关注,如果想了解更多关于##在Mybatis框架中#{}与${}有什么区别?你知道么?、ibatis和mybatis有什么区别、ibatis配置类似mybatis的plugins来配置拦截器的问题、JavaEE SpringMyBatis是什么? 它和Hibernate的区别及如何配置MyBatis的相关知识,请在本站进行查询。

本文标签: