- 1.本文仅用作自己在学习路上遇到问题、解决问题方面的记录。如被提供给同样在此方面遇到问题的同学参考,不胜荣幸。若文中有出现纰漏不够严谨之处,望海涵。意见之处,不吝赐教。
- 2.原始JDBC存在着频繁的连接、创建、释放导致系统资源浪费,从而影响性能,解决方法可以通过创建数据库连接池进行数据库性能的优化。
- 3.sql语句的变化较多,并且使用preparedstatement存在较多的硬编码,以及对结果集的解析也存在较多硬编码,耦合度比较高,因而想要用框架进行封装进而优化数据库,所以出现了Mybatis框架。
- 4.MyBatis是一款优秀的持久性框架,几乎免除了所有的JDBC代码以及设置参数和获取结果集的工作,MyBatis可以通过简单xml和注解来配置和映射原始类型、接口、和JavaPOJO**(Plain Old Java Objects,普通老式Java对象**)为数据库中的记录。
- 5.ORM框架(对象关系映射的缩写),MyBatis是一款基于ORM框架实现的半自动轻量级持久层框架。
- 6.开发流程:
- 6.1.添加MyBatis的jar包
- 6.2.创建数据库实体表
- 6.3.编写User实体类(成员变量的类型要与数据库的数据的类型要一一对应)
- 6.4.编写映射实体类的xml文件
(通过配置类访问到对应实体类的映射文件xml,映射文件xml的定义:<mapper namespace="com.awu.mapper.UserMapper">
根据namespace找到对应的实体类id 1
2
3
4
5
6
7
8select * from user</select>
</mapper>)```
(*其中id 是对应的方法名,可以在执行时找到对应的实体类的代理对象的方法,resultType这是返回结果集的类型,此处表示是User类类型的*)
- 6.5.编写核心配置文件mybatis-config.xml
- 6.6.编写测试方法
- 7.测试
(*编写加载配置文件的路径,然后用*
```Inputstream inutstream=Resource.getResourceAsStresm(resource )1
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputstream)//获得sqlsession工厂对象
1
SqlSession sqlSession =sqlSessionFactory.openSession();//设置sqlsession对象
1
List<User> users=sqlSession.selectList("com.awu.UserMapper.findAll") //执行sql语句
)1
2
3for(User user : users){
System.our.println(user.toString())}//打印结果
sqlSession.close();
- 8.除了用这种sqlSession方式,还可以用MyBatis代理开发的方式,Mapper接口的开发方法需要程序员编写Mapper接口(相当于dao接口),由MyBatis框架根据接口定义创建接口的动态代理对象。
- 9.开发流程:
创建UserMapper接口,同时测试类中出现如下改动,在获取sqlSession对象后,不直接执行方法,而通过增加获取其代理对象,进而调用userMapper的方法。1
UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
- 10.Mapper.xml的namespace的全限定名和Mapper接口的全限定名一样。xml的id和Mapper接口的方法名要一致,并且Mapper接口方法的参数类型要和xml的resultType的类型要相同。
- 11.Mybatis常用的API
- sqlSession
- sqlSessionFactory 工厂对象
- Resource 资源类
- sqlSession.opneSession()
- sqlSession 会话对象
(包含执行语句,提交或者回滚以及获取映射器实例的方法)
- 12.(16:05)environment标签和mapper标签
(配置文件找到映射文件,映射文件再根据命名空间和id找到具体的类的具体的方法) - 13.MyBatis的增删改查-映射文件内标签内容的书写
- 13.1.--根据用户编号查找用户信息
1
select * from user where id=#{id}(使用这条语句的同时还需要在标签头添加参数标签,用以封装传过来的参数,其中#{id}就是传进来封装的参数值
- 13.2.--根据用户名模糊查询用户信息
1
select * from user where username like '%${value}%'
- 13.3.--添加客户信息
1
2<insert>
insert into user{username,jobs,phone}values {#{username},#{jobs,#{phone}}}
- 13.1.--根据用户编号查找用户信息
{内容}表示由用户传进来的参数的封装
- 13.4.--更新用户信息
1
2<update>
update user set username=#{username},jobs=#{jobs},phone=#{phone} where id=#{id} - 13.5.--删除用户信息
1
2<delete>
delete from user where id=#{id} - 14.*MyBatis原理:**
实现方式两种:sqlsession和基于sqlsession的mapper代理对象
功能架构分为三层:
接口层、数据处理层、框架支撑层
(增加数据接口<--参数映射,SQL解析,SQL执行,结果处理和映射<--xml配置,基于注解的配置)
- 15.MyBatis的一级缓存和二级缓存:
一级缓存是默认开启的,二级缓存是需要手动进行配置的,开启后的二级缓存还需要将实体类pojo实现serializable接口。数据的查询首先是查缓存,如果缓存中没有则再向数据库中找。所以在一二级缓存都存在的情况下,查询的流程是,首先在二级缓存中找同一个namespace下的多个sqlSession对象,然后通过一级缓存在每个sqlSession内查找数据,可以说二级缓存是基于命名空间查找的(基于mapper映射文件的namspace实现的),一级缓存是基于sqlSession查找的(基于sqlSession实现的),如果都找不到再查询数据库。 - 16.二级缓存什么时候失效什么时候生效?
答:当执行的sqlSession对象是位于同一个命名空间的不同sqlSession对象时,sql语句执行commit或close,一级缓存失效二级缓存生效,sql语句执行增删改操作时二级缓存失效一级缓存生效。