一 环境准备
- IDEA 2020.2.3
- JKD14
- Maven工程
- Mysql数据库
mysql> CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` datetime default NULL COMMENT '生日',
`sex` char(1) default NULL COMMENT '性别',
`address` varchar(256) default NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (23,'波波','2020-02-27 17:47:08','男','北京'),(42,'小波','2018-03-02 15:09:37','女','北京海淀'),(43,'大波','2018-03-04 11:34:34','女','北京中关村');
二 MyBatis 框架概述
mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,
而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。
mybatis通过 xml 或注解的方式将要执行的各种statement配置起来,并通过java对象和statement 中
sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并
返回。
采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc进行了封装,屏蔽了 jdbc api 底层访问细节,使我
们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。
三 环境搭建(基于映射)
- 第一步:创建maven工程并导入坐标
- 第二步:创建实体类和dao的接口
- 第三步:创建Mybatis的主配置文件 SqlMapConifg.xml(主要用来配置数据库 和映射配置文件找到我们的dao接口)
- 第四步:创建映射配置文件 IUserDao.xml (主要用来实现关于User这个实现类的SQL语句)
注意事项
- mybatis的映射配置文件位置必须和dao接口的包结构相同
- 映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
- 映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名
- 创建的实体类User中的成员变量名应与数据库中的表头一致。
测试
public static void main(String[] args) throws Exception {
/**
* 入门案例
* @param args
*/
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession创建Dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
//6.释放资源
session.close();
in.close();
}
结果
四 环境搭建(基于注解)
删除IUsreDao.xml 并且在dao层接口的方法上面加注解
/*
* @author bobo
* @date 2020/11/7 8:59
* @Email:1498244906@qq.com
*/
public interface IUserDao {
@Select("select * from user")
List<User> findAll();
}
为什么可以这么写:
<mapper namespace="bobo.mybatis.dao.IUserDao">
<!--查询user表中的所有信息 -->
<select id="findAll" resultType="bobo.mybatis.pojo.User">
select * from user
</select>
</mapper>
namespce 、id 这两个属性是为了找到是哪个dao层中哪个接口的哪个方法。我们的注解就写在方法上面,所以就不用在写了。
resultType:确定返回值类型 List findAll() 中已经声明 了返回值是一个Uers类的集合所以不用再声明了;
所以只需要注解写入SQL语句就可以了。
五 补充
连接池:
我们在实际开发中都会使用连接池。
因为它可以减少我们获取连接所消耗的时间。
mybatis连接池3种方式的配置:
-
配置的位置:
主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是表示采用何种连接池方式。
-
type属性的取值:
POOLED 采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现 UNPOOLED 采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用池的思想。 JNDI 采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样。 注意:如果不是web或者maven的war工程,是不能使用的。
Mybatis中的延迟加载
-
什么是延迟加载
在真正使用数据时才发起查询,不用的时候不查询。按需加载(懒加载)
-
什么是立即加载
不管用不用,只要一调用方法,马上发起查询。
在对应的四种表关系中:一对多,多对一,一对一,多对多
一对多,多对多:通常情况下我们都是采用延迟加载。
多对一,一对一:通常情况下我们都是采用立即加载。
Mybatis中的缓存
-
什么是缓存
存在于内存中的临时数据。
-
为什么使用缓存
减少和数据库的交互次数,提高执行效率。
-
什么样的数据能使用缓存,什么样的数据不能使用
适用于缓存: 经常查询并且不经常改变的。 数据的正确与否对最终结果影响不大的。 不适用于缓存: 经常改变的数据 数据的正确与否对最终结果影响很大的。 例如:商品的库存,银行的汇率,股市的牌价。
-
一级缓存:
它指的是Mybatis中SqlSession对象的缓存。 当我们执行查询之后,查询的结果会同时存入到SqlSession为我们提供一块区域中。 该区域的结构是一个Map。当我们再次查询同样的数据,mybatis会先去sqlsession中 查询是否有,有的话直接拿出来用。 当SqlSession对象消失时,mybatis的一级缓存也就消失了。
-
二级缓存:
它指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。 二级缓存的使用步骤: 第一步:让Mybatis框架支持二级缓存(在SqlMapConfig.xml中配置) 第二步:让当前的映射文件支持二级缓存(在IUserDao.xml中配置) 第三步:让当前的操作支持二级缓存(在select标签中配置)