MyBatis是一个优秀的基于java的持久层框架,它内部封装了JDBC,解决了sql语句不易维护的问题,使开发者只需要关注SQL语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
MyBatis通过XML或注解的方式将要执行的各种statement配置起来,并通过JAVA对象和statement中SQL的动态参数进行映射生成最终执行的SQL语句。
最后MyBatis框架执行SQL并将结果映射为Java对象并返回。采用ORM思想解决了实体和数据库映射的问题,对JDBC进行了封装,屏蔽了JDBC API底层访问细节,使我们不用与JDBC API打交道,就可以完成对数据库的持久化操作
简单说就是:有一种叫MyBatis的持久层技术,能够代替JDBC,简化JDBC开发。
具体技术:
- Hibernate
- MyBatis
项目搭建
2._ORM对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用“虚拟对象数据库”。
简单的说:就是把数据库表和实体类及实体类的属性对应起来,让我们可以操作实体类就实现操作数据库表。
| 数据库 | 实体类 |
|---|---|
| user表 | User类 |
| id列 | id属性 |
| username列 | userName属性 |
| age列 | age属性 |
出现该问题的原因是因为UserMapper.xml作为一个配置文件应该放在java目录下,如果不做特殊配置Maven不会对其进行编译,Maven只会编译java目录下的.java文件。针对这个问题,有两种解决方案:
- 在resources目录下新建目录com/qfedu/mapper,将UserMapper.xml剪切到该目录下;
- 在pom.xml配置java目录下的xml文件为资源文件,让Maven能够识别,从而进行编译。
我们一般在项目开发中,采用第二种方案进行处理,pom.xml中的新增配置如下:
10.2._二级缓存src/main/java ** @Test public void testLevel1() throws IOException { //加载配置文件 InputStream in = Resources.getResourceAsStream("mybatis_config.xml"); //创建Session工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //获取session SqlSession session = factory.openSession(); UsersMapper usersMapper = session.getMapper(UserMapper.class); Users u1 = usersMapper.queryById(1); System.out.println("---------------------------" + u1); Users u2 = usersMapper.queryById(1); System.out.println("+++++++++++++++++++++++++++" + u2); session.close(); }
10.2.1._开启全局缓存SqlSessionFactory级别的缓存,同一个SqlSessionFactory构建的SqlSession发起的多次同构查询,会将数据保存在二级缓存中。
注意:在sqlSession.commit()或者sqlSession.close()之后生效。
是MyBatis中极为重要的调整设置,他们会改变MyBatis的运行行为,其他详细配置可参考官方文档。
10.2.2._指定Mapper缓存
... ...
代码验证
@Test
public void testLevel2() throws IOException {
//加载配置文件
InputStream in = Resources.getResourceAsStream("mybatis_config.xml");
//创建Session工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//获取session
SqlSession session = factory.openSession();
UsersMapper usersMapper = session.getMapper(UserMapper.class);
Users u1 = usersMapper.queryById(1);
System.out.println("------------------" + u1);
//让二级缓存生效
session.close();
session = factory.openSession();
usersMapper = session.getMapper(UsersMapper.class);
Users u2 = usersMapper.queryById(1);
System.out.println("++++++++++++++++++++" + u2);
session.close();
}



