当前位置: 首页 > news >正文

互联网轻量级框架SSM-查缺补漏第四天

  简言:昨天第四章没看完,今天接着记吧。

 

  4.5 typeHandler 类型转换器

  顾名思义呀,就是将数据库中数据类型与Java数据类型做相互转换的处理器。在typeHandler中,分为jdbcType和javaType,其中jdbcType用于定义数据库类型,而javaType用于定义Java类型,那么typeHandler的作用是承担二者之间的转换。

  它也分称系统定义的,也有自定义的。系统的没事可记的,看看就懂了,自定义typeHandler必须实现接口typerHandler或者继承BaseTypeHandler。

  我觉得用法很重要。有两种用法,一种是制定了自定义typeHandler一致的jdbcType和javaType,另一种是直接使用typeHandler指定具体的实现类。

首先都要在配置中配置

<typeHandlers>
        <typeHandler jdbcType="VARCHAR" javaType="string" handler="com.learn.ssm.chapter4.typehandler.MyTYpeHandler"/>
</typeHandlers>
<!--第一种:用配置中一样的jdbcType和javaType-->
<select id="fintRoles" parameterType="String" resultType="role">
        select id,role_name as roleName,note from t_role
        where role_name like concat('%',#{roleName, jdbcType=VARCHAR,javaType=string},'%')
</select>

<!--第二种:直接用具体的实现类-->
<select id="fintRoles2" parameterType="String" resultType="role">
        select id,role_name as roleName,note from t_role
        where role_name like concat('%',#{note, typeHandler=com.learn.ssm.chapter4.typehandler.MyTypeHandler},'%')
</select>

  在绝大多数情况下,typeHandler因为枚举而使用,MyBatis已经定义了两个类作为枚举类型的支持

  • EnumOrdinalTypeHandler
  • EnumTypeHandler

  EnumOrdinalTypeHandler是按MyBatis根据枚举数组下标索引的方式进行匹配的,要求数据库返回一个整数作为其下标。

我就简单记一下例子把,如果有枚举SexEnum,中有MALE(1,"男"),FEMALE(2,"女")两条,在POJO中sex的类型定义为SexEnum类型。再在resultMap中添加

<result property="sex" column="sex" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler">

数据库中的sex字段的值若是1或2,执行查询返回值就是男或女。

  EnumTypeHandler还会发使用名称转换成对应的枚举,比如它会根据数据库返回的字符串“MALE”,进行Enum。valueOf(SexEnum.class,"MALE");转换。

  4.6ObjectFactory对象工厂

   是用来创建结果集实例的。我觉得重要是结果集实例创建的过程:先创建了一个List对象然后创建一个其他对象(在Mapper中设置的返回值类型),最后生成同一个对象,是Mapper中设置的返回值类型。

  4.8environments运行环境

  运行环境的主要作用是配置数据库信息,可以配置多个数据库,一般只需要配置一个就可以。它下面又分为两个可配置的元素:事务管理器(transactionManager)、数据源(dataSource)

  transactionManager:主要工作是提交、回滚、和关闭数据库事务。

<transactionManager type="JDBC">

  JDBC送JdbcTransactionFactory生成的JdbcTransaction对象实现。它是以JDBC的方式对数据库的提交和回滚进行操作。

  MANAGED使用ManagedTransactionFactory生成ManagedTransaction对象实现。它的提交和回滚方法不用任何操作,而是把事务交给容器处理 (比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。

<transactionManager type="MANAGED">
  <property name="closeConnection" value="false"/>
</transactionManager>

  datasource:使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。数据库通过PooledDataSourceFactory、UnpooledDataSourceFactory和JndiDataSourceFactory三个工厂类来提供,前两者对应生成PooledDataSource、UnpooledDataSource类对象,而JndiDataSourceFactory则会根据JNDI的信息拿到外部容器实现的数据库连接对象。无论如何这三个工厂类最后的产品都会死一个实现了DataSource接口的数据库连接对象。

<dataSource type="UNPOOLED">
<dataSource type="POOLED">
<dataSource type="JNDI">

  UNPOOLED:采用非数据库连接池的管理方式,每次请求都会打开一个新的数据库连接,所以创建会比较慢。

  POOLED;数据源POOLED利用“池”的概念将JDBC的Connection对象组织起来,它开始会有一些空置,并且已经连接好的数据库连接,所以请求时,无须再建立和验证,省去了创建新的连接实例时所必须的初始化和认证时间。

  JNDI:数据源JNDI的实现是为了能在如EJB或应用服务器这类容器中使用,容器可以几种或在外部配置数据源,然后放置一个JNDI上下文的引用

  注:MyBatis也支持自定义数据工厂来支持第三方数据源。

  

  4.9databaseIdProvider

  databaseIdProvider元素主要是支持多种不同厂商的数据库,例如在公司中默认是MySQL数据库,但是客户要求使用Oracle,

使用方法:

  先配置一下:

<databaseIdProvider type="DB_VENDOR">
    <property name="Oracle" value="oracle" />
    <property name="MySQL" value="mysql" />
    <property name="DB2" value="db2" />
</databaseIdProvider>

然后再Mapper映射文件中修改成:

<select id="getRole" parameterType="Long" resultType="role" databaseId="oracle">
        select id,role_name as roleName,note from t_role where id = #{id}
</select>

这样这个查询方法只有在配置成oracle数据库的时候去调用了。

转载于:https://www.cnblogs.com/shiboinfo/p/10173108.html

相关文章:

  • 无需Java代码通过JHipster生成有安全验证的微服务应用
  • BZOJ5341[Ctsc2018]暴力写挂——边分治+虚树+树形DP
  • JS变量作用域
  • android环境搭建
  • Windows10 VS2017 C++多线程传参和等待线程结束
  • ZooKeeper的安装与部署
  • Vue.js常用指令:v-on
  • 如何设计一个比特币钱包服务
  • JS 编译器都做了啥?
  • 如何判断/获取屏幕的状态(亮屏已解锁,亮屏未解锁,黑屏)
  • CSS3 animation 练习
  • 腾讯从百度挖来的AI Lab负责人张潼离职,要去阿里?
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • TOP 13大最热开源微服务Java框架
  • Zk集群部署
  • ES6指北【2】—— 箭头函数
  • 10个确保微服务与容器安全的最佳实践
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • MobX
  • mysql_config not found
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • python_bomb----数据类型总结
  • Python中eval与exec的使用及区别
  • Selenium实战教程系列(二)---元素定位
  • spring学习第二天
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • vuex 学习笔记 01
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 复杂数据处理
  • 看域名解析域名安全对SEO的影响
  • 你不可错过的前端面试题(一)
  • 前端设计模式
  • 数据科学 第 3 章 11 字符串处理
  • 数组的操作
  • 用element的upload组件实现多图片上传和压缩
  • 鱼骨图 - 如何绘制?
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • zabbix3.2监控linux磁盘IO
  • 容器镜像
  • ​MySQL主从复制一致性检测
  • #Z0458. 树的中心2
  • (C++)八皇后问题
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (笔试题)合法字符串
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (十一)手动添加用户和文件的特殊权限
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • ./configure、make、make install 命令
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .cfg\.dat\.mak(持续补充)
  • .NET 5种线程安全集合
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET gRPC 和RESTful简单对比
  • .net Signalr 使用笔记
  • .Net6使用WebSocket与前端进行通信