mybatis概述
- 什么是框架
软件开发中的一套解决方案,不同的框架解决不同的问题。框架封装了许多的细节,使开发者可以使用极简的方式实现功能,大大提高开发效率。简言之,框架就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。使用别人搭建好的舞台,你来作表演。 - 三层架构
架构 作用 表现层 用于展示数据 业务层 用于处理业务需求 持久层 和数据库交互的 - 持久层技术解决方案
Jdbc技术:Connection PreparedStatement ResultSet
Spring中的JdbcTemplate:对Jdbc的简单封装(工具类)
Apache的DBUtils:对Jdbc的简单封装(工具类) - mybatis是一个持久层框架,用Java编写的。它封装了jdbc操作的许多细节,使开发者只需关注sql语句本身,而无需关注注册驱动,创建链接等繁杂过程。它使用ORM思想实现对结果集的封装。
- ORM(object relation mapping):对象关系映射,即把数据库和实体类及实体类的属性对应起来,让我们可以操作实体类就实现操作数据库。
mybatis环境搭建
- 创建maven工程并导入坐标
- 创建实体类和dao的接口
- 创建mybatis的主配置文件(SqlMapConfig.xml)
- 创建映射配置文件(IUserDao.xml)
注意事项: - 包在创建com.itheima.dao时为三级结构,而目录在创建com.itheima.dao时为一级结构,用/分隔开才是三级结构
- mybatis的映射配置文件位置必须的dao接口的包结构相同
- 映射配置文件的mapper标签namespace属性的取值必须为dao接口的全限定类名
- 映射配置文件的操作配置,id属性的取值必须时dao接口的方法名
mybatis入门案列
- 读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
- 创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
- 使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
- 使用SqlSession创建Dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
- 使用代理对象执行方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
- 释放资源
session.close();
in.close();
注意事项:不要忘记在映射配置文件中告知mybatis要封装到哪个类中,配置时使用全限定类名。
Mybatis的CRUD操作
IUserDao.xml文件的配置:
<mapper namespace="com.itheima.dao.IUserDao">
<!--当实体类成员变量名和数据库列名不一致时需要如下配置-->
<!-- 配置 查询结果的列名和实体类的属性名的对应关系 -->
<!--在有返回值的查询中,resultType="com.itheima.domain.User"要替换为resultMap="userMap"-->
<resultMap id="userMap" type="uSeR">
<!-- 主键字段的对应 -->
<id property="userId" column="id"></id>
<!--非主键字段的对应-->
<result property="userName" column="username"></result>
<result property="userAddress" column="address"></result>
<result property="userSex" column="sex"></result>
<result property="userBirthday" column="birthday"></result>
</resultMap>
<select id="findAll" resultType="com.itheima.domain.User">
select * from user
</select>
<insert id="saveUser" parameterType="com.itheima.domain.User">
<selectKey resultType="Integer" keyProperty="id" keyColumn="id" order="AFTER">
select last_insert_id();
</selectKey>
insert into user(username, address, sex, birthday)values(#{username}, #{address}, #{sex}, #{birthday});
</insert>
<update id="updateUser" parameterType="com.itheima.domain.User">
update user set username=#{username}, address=#{address}, sex=#{sex}, birthday=#{birthday} where id=#{id}
</update>
<delete id="deleteUser" parameterType="Integer">
delete from user where id=#{user}
</delete>
<select id="findById" parameterType="Integer" resultType="com.itheima.domain.User">
select * from user where id = #{uid}
</select>
<select id="findByName" parameterType="String" resultType="com.itheima.domain.User">
select * from user where username like #{uname}
</select>
<select id="findTotal" resultType="Integer">
select count(id) from user
</select>
<!--根据QueryVo查询用户-->
<select id="findUserByVo" parameterType="com.itheima.domain.QueryVo" resultType="com.itheima.domain.User">
select * from user where username like #{user.username}
</select>
</mapper>
typeAliases和package
- typeAliases配置别名,只能配置domain中类的别名。
- typeAlias用于配置别名,type属性用于指定实体类全限定类名,alias属性用于指定别名,当指定了别名后就不区分大小写。
- package用于指定配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写。
- name属性用于指定配置别名的包。
<typeAliases>
<!-- <typeAlias type="com.itheima.domain.User" alias="user"></typeAlias> -->
<package name="com.itheima.domain"/>
</typeAliases>
连接池
连接池可以减少我们获取连接所消耗的时间。
mybatis中连接池的三种配置方式:
配置位置:主配置文件SqlMapConfig.xml中的dataSource标签,type属性表示采用何种连接池方式。
type的属性:
- POLLED:采用传统的javax.sql.DataSource规范中的连接池
- UNPOOLED:采用传统的获取连接的方式
- JNDI:采用服务器提供的JNDI技术实现
mybatis中的延迟加载
什么是延迟加载
在真正需要使用数据时才发起查询,不用的时候不查询。按需加载(懒加载)
什么是立即加载
不管用不用,只要一调用方法,马上发起查询。
一对多,多对多:延迟加载
多对一,一对一:立即加载
mybatis中的缓存
什么是缓存
存在内存中的临时数据
为什么使用缓存
减少和数据库的交互次数,提高执行效率
什么样的数据能使用缓存,什么样的数据不能使用缓存
适用于:经常查询且不经常改变的。数据的正确与否对最终结果影响不大。
不适用于:经常改变的数据。数据的正确与否对最终结果影响很大。
mybatis中的一级缓存和二级缓存
- 一级缓存:指mybatis中SqlSession对象的缓存。当我们执行查询后,查询的结果会同时存入到SqlSession为我们提供的一块区域中,该区域是一个map。当我们再次查询同样的数据时,mybatis会先去SqlSession中查询是否有。有的话直接拿出来用。当SqlSession对象消失后,mybatis一级缓存也就消失了。
- 二级缓存:指mybatis中SqlSessionFactory对象缓存。由同一个SqlSessionFactory对象创建的SqlSession共享缓存。
二级缓存使用步骤:- 让mybatis框架支持二级缓存(在SqlMapConfig.xml中配置)
- 让当前映射文件支持二级缓存(在IUserDao.xml中配置)
- 让当前操作支持二级缓存(在select标签中配置)