目录
Mybatis
搭建MyBatis开发环境
1、创建Maven工程,导入MyBatis依赖的组件
2、编写MyBatis核心配置文件(mybatis-config.xml)
3、创建实体类-POJO
4、创建SQL映射文件(mapper.xml)
5、创建测试类
Mybatis
MyBatis是一款优秀的持久层框架,用于简化JDBC开发
MyBatis 本是 Apache的一个开源项目iBatis, 2010年这个项目由apache softwarefoundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github
官网:mybatis – MyBatis 3 | 入门
持久层
负责将数据到保存到数据库的那一层代码
JavaEE三层架构:表现层、业务层、持久层
框架
框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
在框架的基础之上构建软件编写更加高效、规范、通用、可扩展
JDBC缺点
1.硬编码:注册驱动,获取连接,SQL语句
2.操作繁琐:手动设置参数,手动封装结果集
Mybatis特点
1、基于SQL语法,简单易学
2、能了解底层封装过程,内部通过JDBC访问数据库的操作
3、SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度
4、方便程序代码调试
ORM(Object Relational Mapping)
即对象/关系映射,是一种数据持久化技术。它在对象模型和关系型数据库之间建立起对应关系,
并且提供了一种机制,通过JavaBean对象去操作数据库表中的数据。
编写程序的时候,以面向对象的方式处理数据。
保存数据的时候,却以关系型数据库的方式存储。
ORM解决方案包含下面四个部分:
1、在持久化对象上执行基本的增、删、改、查操作
2、对持久化对象提供一种查询语言或者API
3、对象关系映射工具
4、提供与事务对象交互、执行检查、延迟加载以及其他优化功能
搭建MyBatis开发环境
1、创建Maven工程,导入MyBatis依赖的组件
找到pom.xml在dependencies中添加依赖
2、编写MyBatis核心配置文件(mybatis-config.xml)
configuration | 配置 |
properties | 可以配置在Java 属性配置文件中 |
settings | 修改 MyBatis 在运行时的行为方式 |
typeAliases | 为 Java 类型命名一个别名(简称) |
typeHandlers | 类型处理器 |
objectFactory | 对象工厂 |
plugins | 插件 |
environments | 环境 |
environment | 环境变量 |
transactionManager | 事务管理器 |
dataSource | 数据源 |
mappers | 映射器 |
配置properties元素的两种方式
1、通过外部指定的方式,即配置在典型的Java属性文件中(如:database.properties),实现动态配置
2、直接配置为xml,并使用这些属性对配置项实现动态配置
通过外部指定的方式(database.properties),实现动态配置
配置properties的resource属性
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms"/>
<property name="user" value="root"/>
<property name="password" value=“aptech"/>
</properties>
......
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
若两种方式同时都用了,那么哪种方式优先?
配置properties的resource指定
配置property的name和value
<properties resource="database.properties">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
</properties>
resource属性值的优先级高于property子节点配置的值
settings元素
作用:是设置一些非常重要的设置选项,用来设置和改变MyBatis运行时的行为方式
设置项 | 描述 | 允许值 | 默认值 |
cacheEnabled | 对在此配置文件下的所有cache 进行全局性开/关设置 | true | false | true |
lazyLoadingEnabled | 全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载 | true | false | true |
autoMappingBehavior | MyBatis对于resultMap自动映射匹配级别 | NONE | PARTIAL | FULL | PARTIAL |
typeAliases元素
作用:配置类型别名,通过与MyBatis的SQL映射文件相关联,减少输入 多余的完整类名,以简化操作。
<typeAliases>
<package name ="cn.smbms.pojo" />
</typeAliases>
environments元素
表示配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上
子元素节点:environment,但是必须指定其中一个为默认运行环境(通过default指定)
注意:每个SqlSessionFactory实例只能选择一个运行环境
dataSource
dataSource元素使用基本的JDBC数据源接口来配置JDBC连接对象的资源
有三种内建的数据源类型
<dataSource type=" [UNPOOLED | POOLED | JNDI]" />
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
mappers元素
作用:映射器,定义SQL映射语句
须在配置中引用mapper映射文件
方式一:使用类资源路径获取资源
<!-- 将mapper映射文件加入到系统核心配置文件中 -->
<mappers>
<mapper resource="cn/smbms/dao/user/UserMapper.xml"/>
</mappers>
方式二:使用URL获取资源
<mappers>
<mapper url="file:///E:/sqlmappers/UserMapper.xml"/>
<mapper url="file:///E:/sqlmappers/ProviderMapper.xml"/>
</mappers>
3、创建实体类-POJO
4、创建SQL映射文件(mapper.xml)
SQL映射文件的几个顶级元素(按照定义的顺序)
mapper | namespace |
cache | 配置给定命名空间的缓存 |
cache-ref | 从其他命名空间引用缓存配置 |
resultMap | 用来描述数据库结果集和对象的对应关系 |
sql | 可以重用的SQL块,也可以被其他语句引用 |
insert | 映射插入语句 |
update | 映射更新语句 |
delete | 映射删除语句 |
select | 映射查询语句 |
mapper
namespace:命名空间
namespace和子元素的id联合保证唯一,区别不同的mapper
绑定DAO接口
namespace的命名必须跟某个接口同名
接口中的方法与映射文件中SQL语句id一一对应
示例:
<mapper namespace="cn.cvs.dao.sysuser.SysUserMapper">
<select id="getUserList" …
……
</select>
</mapper>
select语句有很多属性可以详细配置每一条语句
id:命名空间中唯一的标识符
接口中的方法与映射文件中的SQL语句id一一对应
parameterType:
表示查询语句传入参数的类型的完全限定名和别名
支持基础数据类型和复杂数据类型
resultType
SQL语句返回值类型的完整限定名或别名
示例:仅传入一个简单数据类型的查询条件,如一个基本类型或其包装类型,或一个String类型等,MyBatis框架的处理方式也非常简单。需求:根据真实姓名模糊查询用户信息
1.在SysUserMapper接口中添加查询方法
List<SysUser> getUserListByRealName(String realName);
2在SysUserMapper.xml中添加SQL语句映射
select * from t_sys_user where realName like CONCAT ('%', #{param}, '%')
3、在单元测试类中添加测试方法
List<SysUser> userList =sqlSession.getMapper(SysUserMapper.class) .getUsersByRealName("李");
别名与Java类型映射
别名 | 映射的类型 |
string | String |
byte | Byte |
long | Long |
short | Short |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
int | Integer |
integer | Integer |
arraylist | ArrayList |
map | Map |
list | List |
collection | Collection |
iterator | Iterator |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
…… | …… |
parameterType
基础数据类型
int、String、Date等,一个参数传递单一数值
用@Param注解为参数命名,通过 #{参数名} 获取传入的值
复杂数据类型
Java实体类,Map
通过#{属性名}或者#{map的keyName}即可获取传入值
resultType :直接表示返回类型
基本数据类型
复杂数据类型
resultMap :对外部resultMap的引用
应用场景:
数据库字段信息与对象属性不一致
复杂的联合查询,自由控制映射结果
二者不能同时存在,本质上都是Map数据结构
resultMap自动映射匹配前提:字段名与属性名一致
resultMap的自动映射级别-autoMappingBehavior
PARTIAL(默认):自动匹配所有
NONE:进制自动匹配
<settings>
<setting name="autoMappingBehavior" value="NONE"/>
</settings>
insert属性:id、parameterType
<insert id="add" parameterType="User" >
insert into smbms_user (userCode,userName,userPassword)
values ( #{userCode},#{userName},#{userPassword})
</insert>
注意:insert、update、delete元素均没有resultType属性
update属性:id、parameterType
<update id ="modify" parameterType="User">
update smbms_user set userCode = #{userCode},
userName = #{userName},
userPassword = #{userPassword} where id = #{id}
</update>
delete属性:id、parameterType
<delete id ="deleteUserById" parameterType="int">
delete from smbms_user where id = #{id}
</delete>
resultMap属性
id:resultMap的唯一标识
type:Java实体类
resultMap子元素
id:一般对应数据库中该行的主键id,设置此项可提高MyBatis性能
result:映射到JavaBean的某个“简单类型”属性
association:映射到JavaBean的某个“复杂类型”属性,比如JavaBean类
collection:映射到JavaBean的某个“复杂类型”属性,比如集合
association
复杂的类型关联,一对一
内部嵌套:映射一个嵌套JavaBean属性
属性
property:映射数据库列的实体对象的属性
javaType:完整Java类名或者别名
resultMap:引用外部resultMap
子元素:id、result
property:映射数据库列的实体对象的属性
column:数据库列名或者别名
collection
复杂类型集合,一对多
内部嵌套、映射一个嵌套结果集到一个列表
属性
property:映射数据库列的实体对象的属性
ofType:完整Java类名或者别名(集合所包括的类型)
resultMap:引用外部resultMap
子元素:id、result
property:映射数据库列的实体对象的属性
column:数据库列名或者别名
5、创建测试类
1、读取核心配置文件mybatis-config.xml
2、创建SqlSessionFactory对象,读取配置文件
3、创建SqlSession对象
4、调用mapper文件进行数据操作
SqlSessionFactory
SqlSessionFactory是每个MyBatis应用的核心
作用:创建SqlSession实例
SqlSessionFactory工具类
public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
String mybatisPath = "mybatis/mybatis-config.xml";
//1、加载mybatis配置文件
InputStream is = null;
try {
is = Resources.getResourceAsStream(mybatisPath);
} catch (IOException e) {
e.printStackTrace();
}
//2、根据mybatis配置文件,创建生成SqlSession的factory工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
}
public static SqlSession createSqlSession(){
if (sqlSessionFactory != null){
return sqlSessionFactory.openSession();
}
return null;
}
public static void closeSqlSession(SqlSession sqlSession){
if (sqlSession != null){
sqlSession.close();
}
}
}