Mybatis总结

204 阅读4分钟

MyBatis 总结

mybatis是apache旗下的开源项目,原名ibatis后面改为Mybatis。Mybatis是一个优秀的持久层映射框架,对于jdbc繁琐的操作进行了封装,使程序员只需要专注于Sql代码的编写。

jdbc

步骤
  • 加载驱动
  • 获取连接
  • 创建statement
  • 设置Sql语句
  • 参数填充,(对于prepareStatement)
  • 查询,结果集遍历
  • 关闭连接。
问题
  • 频繁建立连接,关闭连接,加重数据库系统负担。
  • SQL语句硬编码,实际可能的情况是SQL语句需要经常变更。
  • SQL语句里面的占位符硬编码,不能适应变化的查询参数个数,比如where条件可能是一个,也可能是多个。
  • 对于结果集的解析存在硬编码的问题,如果解析成pojo对象比较好。

Mybatis架构

无标题.png

  • splMapConfig.xml 全局配置文件
  • Mapper.xml存放spl语句,需要在全局配置中加载。
  • 通过mybatis环境等配置信息,构造sqlSessionFactory
  • mapped statement 封装了mybatis的配置信息,mapper.xml文件中一个sql对应一个mapped statement
  • Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。

mybatis 的配置

sqlMaoConfig,xml
<environments default="development">
		<environment id="development">
			<!-- 使用jdbc事务管理 -->
			<transactionManager type="JDBC" />
			<!-- 数据库连接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url"
					value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
				<property name="username" value="root" />
				<property name="password" value="root" />
			</dataSource>
		</environment>
	</environments>

splMapConfig.xml 主要配置数据源,事务管理器。

#{} 和${}的区别

#{} 属性占位符,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换。#{}可以有效防止sql注入。接受简单类型,pojo属性(#{属性名}),当为简单类型时可以写#{任意值}或者#{value};

¥{} SQL拼接符,接受简单类型,pojo属性({属性值}),当为简单类型是必须写{value},不进行Java类型到jdbc类型的转化。

parameterType和resultType

parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。

resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象**。如果有多条数据,则分别进行映射,并把对象放到容器List中**

mysql自增主键返回

<!-- selectKey 标签实现主键返回 -->
	<!-- keyColumn:主键对应的表中的哪一列 -->
	<!-- keyProperty:主键对应的pojo中的哪一个属性 -->
	<!-- order:设置在执行insert语句前执行查询id的sql,孩纸在执行insert语句之后执行查询id的sql -->
	<!-- resultType:设置返回的id的类型 -->
	<selectKey keyColumn="id" keyProperty="id" order="AFTER"
		resultType="int">
		SELECT 1675168
	</selectKey>

mybatis 与hibernate 对比

  • Mybatis需要手写SQL,不能做到数据库无关性,非常适合对关系数据模型要求不高的软件开发。但是Mybatis入门简单,上手快。

动态代理方式

开发规范

​ Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

Mapper接口开发需要遵循以下规范:

1、Mapper.xml文件中的namespace与mapper接口的类路径相同。

2、Mapper接口方法名和Mapper.xml中定义的每个statement的id相同

3、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同

4、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。

SqlMapConfig.xml配置文件

properties
<properties resource="db.properties">
		<!-- 在properties内部用property定义属性 -->
		<!-- 如果外部配置文件有该属性,则内部定义属性被外部属性覆盖 -->
		<property name="jdbc.username" value="root123" />
		<property name="jdbc.password" value="root123" />
	</properties>
typeAliases
别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
map Map
自定义别名,别名大小写不敏感
<typeAliases>
		<!-- 单个别名定义 -->
		<typeAlias alias="user" type="cn.itcast.mybatis.pojo.User" />
		<!-- 批量别名定义,扫描整个包下的类,别名为类名(大小写不敏感) -->
		<package name="cn.itcast.mybatis.pojo" />
		<package name="其它包" />
</typeAliases>
mappers(映射器)
  • 此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。

  • 此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。