Mybatis简介
- 什么是框架
框架简单来说是对基本代码的一个封装,并提供相应的API,我们在写代码的时候就可以直接去调用,提高工作效率和加大速度 - 什么是ORM
ORM,Object-RelationMapping,对象关系映射,它的作用是在关系型数据库之间做映射出来。
JDBC缺点:需要手动完成java语言、面向关系的数据关系之间数据的转换,代码繁琐,影响开发效率。ORM 框架就是专门来解决这个问题的, 相当于在面向对象语言和关系数据库之间搭建一个桥梁。这样我们在具体的操作数据库的时 候,只要像平时操作对象一样操作它就可以了,ORM 框架会根据映射完成对数据库的操作, 就不需要再去和复杂的 SQL 语句打交道了。 - Mybatis简介
MyBatis 是一个半自动 ORM 框架,其本质是对 JDBC 的封装。使用 MyBatis 重点需要程序员编写 SQL 命令,不需要写一行 JDBC 代码。
MyBatis 可以使 用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java 对象)映射成数据库中的记录。
Mybatis的基本使用
需要下载jar包(11个)并导入idea,以及在idea需要添加mysqljar包
Mybatis的jar包下载
- 核心API
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 的作用是使用构建者模式创建 SqlSessionFactory 接口 对象。
SqlSessionFactory
SqlSessionFactory 可以被认为是一个数据库连接池,它的作用是创建 SqlSession 接口对象。
SqlSession
如果说 SqlSessionFactory 相当于数据库连接池,那么 SqlSession 就相当于一个数 据库连接(Connection 对象),你可以在一个事务里面执行多条 SQL,然后通过它的 commit、rollback 方法提交或者回滚事务。
Mapper
映射器。由一个 Java 接口和 XML 文件(或者注解构成),需要给出对应的 SQL 和映 射规则,负责发送 SQL 去执行并返回结果。 - 核心API工作流程
- 生命周期
SqlSessionFactoryBuilder,当SqlSessionFactory创建就会失去作用,不会长期纯在
SqlSessionFactory生命周期存在于Mybaits应用中,所一旦创建就在整个Mybatis中,一旦创建长期保存,直到MYBatis不再使用。由于 SqlSessionFactory 是一个对数据库的连接池,所以它占据着数据库的连接资源。如果创建多个SqlSessionFactory,那么就存在多个数据库连接池,这样不利于对数据库资源的控制,也 会导致数据库连接资源被消耗光,出现系统宕机等情况,所以尽量避免发生这样的情况。因此 SqlSessionFactory 是一个单例,让它在应用中被共享
SqlSession
SqlSession 应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接(手动关闭),让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以 用 try...catch...finally... 语句来保证其正确关闭。
所以 SqlSession 的最佳的作用域是请求或方法作用域。
Mapper
由于 SqlSession 的关闭,它的数据库连接资源也会消失,所以它的生命周期应该小于等于 SqlSession 的生命周期。Mapper 代表的是一个请求中的业务处理,所以它应该 在一个请求中,一旦处理完了相关的业务,就应该废弃它。
Mybatis配置文件
在Mybatis配种有两种配置文件
- 全局配置文件
全局配置文件名称可以自定义,在java项目中放到src目录下格式如:Mybatis-cfg.xml
作用框架设置,别名设置,环境设置,指定映射配置文件设置 - propertirs标签
Mybatis 配置文件中的属性定义。properties 标签中允许内部定义属性,也可以是外部的 properties 文件定义属性。无论是内部定义还是外部定义,都可以使用${name}获取值。 - envieonments标签
MyBatis 可以配置多个环境。这可以帮助你 SQL 映射对应多种数据库等。比如说,想为 开发、测试、发布产品配置不同的环境。 - transactionManager 节点
事务处理器。在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]")
JDBC :这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
MANAGED :不做事务处理。 - dataSource 标签
dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
UNPOOLED:使用直连。
POOLED:使用池连。
JNDI :使用 JNDI 方式连接 - mapper 标签 指定映射配置文件使用相对于类路径指定映射配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 引入properties文件-->
<properties resource="db.properties"/>
<!-- 环境配置 1个Sqlsession对象只能1个enviroment-->
<environments default="development">
<environment id="development">
<!-- 配置事务-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源 直连,池连,JNDI-->
<dataSource type="POOLED">
<!-- 当前连接数据库信息,name不能乱写 value要在EL表达式中-->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 引入映射配置文件-->
<mappers>
<!-- 使用相对路径方式引入映射配置-->
<mapper resource="com/hhxx/mapper/UserMapper.xml"/>
</mappers>
</configuration>
- 映射配置文件
映射配置文件主要是用来编写 sql 语句的,结果集的映射关系的指定,以及缓存的一些 配置等等。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace必须与映射配置文件位置和名对应-->
<mapper namespace="com.hhxx.mapper.UserMapper">
<!-- 查询所有用户 resultType映射到那个实体当中的全名 这里是映射到Users对象当中-->
<select id="selectUsersAll" resultType="com.hhxx.pojo.Users">
select * from users
</select>
<!-- 根据用户id查询用户 parameterType可选,这里userid是int类型可以写参数类型-->
<select id="selectUsersById" parameterType="int" resultType="com.hhxx.pojo.Users">
-- 一个参数名称随意写,但是多个需要指定
select * from users where userid=#{suibian}
</select>
<!-- 添加用户 resultType作用于查询-->
<insert id="insertUsers" >
insert into users values(default, #{username},#{usersex})
</insert>
<!-- 预更新用户查询 查询需要有映射结果姐的那个类-->
<select id="selectUserById2" resultType="com.hhxx.pojo.Users">
select * from users where userid=#{uerid}
</select>
<!-- 更新用户操作-->
<update id="updateUserById">
update users set username =#{username},usersex =#{usersex} where userid=#{userid}
</update>
<!-- 删除用户-->
<delete id="deleteUserById">
delete from users where userid=#{userid}
</delete>
</mapper>
select查询的时候需要将查询结果映射到resultType,期望从这条语句中返回觉过的类全名或别名
- Mapper对应的子元素