MyBatis 总结
mybatis是apache旗下的开源项目,原名ibatis后面改为Mybatis。Mybatis是一个优秀的持久层映射框架,对于jdbc繁琐的操作进行了封装,使程序员只需要专注于Sql代码的编写。
jdbc
步骤
- 加载驱动
- 获取连接
- 创建statement
- 设置Sql语句
- 参数填充,(对于prepareStatement)
- 查询,结果集遍历
- 关闭连接。
问题
- 频繁建立连接,关闭连接,加重数据库系统负担。
- SQL语句硬编码,实际可能的情况是SQL语句需要经常变更。
- SQL语句里面的占位符硬编码,不能适应变化的查询参数个数,比如where条件可能是一个,也可能是多个。
- 对于结果集的解析存在硬编码的问题,如果解析成pojo对象比较好。
Mybatis架构
- 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映射文件名称相同,且放在同一个目录中。