Mybatis总结
这几周由于课程有点多,一直没来的及总结最近学习完的mybatis框架,今天抽个时间得总结了:
mybatis框架是对应的是持久层框架,能够简化数据库相关的java代码,它支持自定义SQL、存储过程以及高级映射。
mybatis框架配置支持两个方式:
1.xml (值得注意的一点是,使用xml进行映射配置的时候,需要和IUserDao接口类具有相同的目录结构)
2.注解(使用注解也得在著配置文件中指定带有注解的dao接口所在位置)
在mybatis的查询过程中,通过在SqlMapConfig.xml中配置连接条件,进行数据库的连接,可以将数据库相关的连接信息,写到jdbcconfig.properties中,然后在SqlMapConfig中引入该文件进行连接。
<!--mybatis的主配置文件-->
<configuration>
<!--配置环境-->
<environments default="mysql">
<!--配置mysql的环境-->
<environment id="mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源(连接池)-->
<dataSource type="POOLED">
<!--配置连接数据库的4个基本信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
这是最基本的数据库连接配置,若是用xml方式进行配置还需要指定映射文件的位置。
都配置好之后,只需要在IUserDao接口类中定义数据库相关方法,就可以进行简单的数据库代码测试了。
//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();
相较于传统dao层的开发减少了我们开发人员的工作量。在数据库查询过程中我们可以将查询条件包装成类传入参数(一般在综合查询中使用)。
以上就是最简单的mybatis框架配置。(忽然想起来一个坑:就是在配置SqlMapConfig文件的时候,标签的位置要求是根据引用的dtd文件中的标签顺序进行使用,之前我学习的时候就是将typeAliases标签放到了environments标签之后,就一直报错)
然后就是基本的CRUD操作,网上去搜博客能够搜到老多了,这就不展示代码了(主要还是我菜。。。)
当然也可以通过工厂模式,写具体的实现类达到同样的效果,那么问题来了,我们不是要简化操作吗。(所以你可以写具体实现类,来锻炼你的代码能力,然而使用框架的时候,这些代码可能是用不到的)
当我们在进行数据库操作时,不可能永远都是进行单表操作,更多的时候就是进行多表操作,此时就涉及到了:
1.一对一关系操作;
2.一对多关系操作,在一对多关系中:从表实体应该包含一个主表实体的对象引用
主表实体应该包含从表实体的集合引用
3.多对多关系操作
在对应的映射配置文件中配置相应的接收结果类型(resultMap中association(一对一)标签和collection(一对多)标签)
继续学习mybatis时,会接触到mybatis的延迟加载
什么是延迟加载呢?
这里只是简单的解释一下,就是查询多表的时候,如果只是查询其中的一个表就能够满足用户要求,那么就只查询该单表,用户有需要的时候才去查询相关联的表信息,这样便会极大的提高数据库性能,因为单表查询比多表查询快。
<!--配置参数-->
<settings>
<!-- 开启mybatis支持延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"></setting>
</settings>
这里给出了SqlMapConfig文件中的开启延迟加载信息的配置,由于我也是初学mybatis,对这部分内容无论是运用还是理解上可能都还有很多欠缺的地方,等以后用的多了,理解也更深了,倒回来再说一说这方面的内容。
紧接着就是mybatis的缓存机制:
(当时学习的时候这一块我学的相对不是很明白,所以找了一些博客来帮助我理解,这里我选了一篇对我理解帮助较大的博客放到这里,希望也能帮助你们理解mybatis一级和二级缓存机制)
https://blog.csdn.net/u012373815/article/details/47069223
里边有非常详细的解释,还聊到了其他分布式缓存框架,拓展了其他知识。
这里给出最简单的开启二级缓存的配置
//SqlMapConfig.xml中的配置
<settings>
<setting name="cacheEnabled" value="trues"/>
</settings>
//对应映射文件的配置
<!--开启user支持二级缓存-->
<cache/>
这里有一个坑点,也是我前面提过的就是注意标签的配置顺序,我之前写的时候就是不清楚,然后将setting的配置放到了typeAliases标签的后面,xml里边并不会提示,但是程序就是会报错,后来找了很多博客都不知道原因,才想起去,重新写了一遍,发现又不报错了,才注意到是标签位置的原因,这时候才想起去看dtd文件的约束,所以刚学习的小伙伴可以注意一下。
学习mybatis的坑点并不多,如果只是想简单的使用,而不去了解原理其实学起来会很快的,但是还是建议学习的小伙伴呢能够去深层次的学习一下原理,比如SqlSession的一些具体实现,这样会有助于我们的理解,同时有助于我们写更深层次的代码。
以上基本就是我学习mybatis中了解到的知识,希望和大家共同进步,fighting!