mybatis是一个优秀的持久层框架,它将jdbc进行了封装,使得开发者只需要关注sql本身,而不需要关注如何注册数据库驱动,建立连接等操作。mybatis通过xml和注解的方式,将statement或者prepareStatement进行了配置。并且只需要将statement中的sql语句进行映射,最终由mybatis来调用执行sql。
那么我们使用jdbc编程有哪些缺点呢?我们又是通过mybatis如何解决的呢?
1.数据库频繁创建和释放资源会使得系统的压力增大,使用连接池则可以解决这个问题
解决:sqlMapConfig配置数据库连接池解决
2.sql语句在代码中硬编码会造成维护不易。因为Sql的变动通常都会很大
解决:配置在mapper文件中进行sql和编码的分离
3.使用prepareStatement向sql中的占位符输送参数会造成硬编码,因为where语句通常不确定,条件的变更会造成不易维护
解决:将java对象映射到sql语句中,在paramterType中传参
4.对结果集的解析也会造成硬编码,不易改动,如果用pojo来接收就会好很多
解决:定义了resultType和resultMap来定义输出类型
mybatis的具体运行流程
如图所示
SqlSessionFactory:mybatis的会话工厂,专门用来创建会话。在和Spring集成时交给spring来管理,最佳使用范围是整个运行过程,单例存在
sqlSession:会话工具,其子类DefaultSqlSession用来操作Excutor
Excutor:数据库的操作执行器,它的两个子类BaseExcutor(基础执行器)以及CacheExcutor用来操作数据库(缓存执行器)。
MappedStatement:通常传入Excutor中,是根据我们配置的输入和输出映射来获得我们想要得到的配置。
mybatis会通过其配置文件sqlMapConfig创建其sessionFactory,而sqlSessionFactory是单例的。它会生成sqlSession,而在sqlSession中存在一个子类DefaultSqlSession有成员Excutor来执行,Excutor中有基本执行器和缓存执行器,而我们的defaultSqlSession中的方法又会调用Excutor和MapperdStatement来执行我们配置文件中的sql
mybatis配置文件方式
1.传统配置方式。直接在classPath下配置。直接配置statement和sql,nameSpace一般自定义,并且在调用statement时传入名称时都会加上nameSpace
parameterType:输入参数类型
resultType:映射关系类型
我们在传入条件时
{
<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.Use
r">
select * from user where id = #{id}
</select>
}
通常会用#{}来作为占位符使用,这里可以传基本数据类型以及pojo类字段
还有一个${value}是用来作为字符串拼接。
2.mapper配置开发
我们会定义一个xxxMapper接口,再配置一个同名的Mapper.xml来定义sql。
mapper在我们的sqlMapper中引入方式
{
1.<mapper resource="sqlmap/User.xml" />
类路径下的位置
2.<mapper class="cn.itcast.mybatis.mapper.UserMapper"/>
配置接口类
注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
3.<package name="cn.itcast.mybatis.mapper"/>
进行包扫描
注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
}
本人还用到了hibernate和mybatis,在这里说说其不同处
mybatis不同于hibernate,它不是一个完全的ORM框架,它具有了更多的灵活性。mybatis的入门门槛低,因为他在进行数据库操作时,需要我们程序员自己进行sql的开发,这样做的好处是,我们可以对数据库的操作进行sql的优化,我们能任意调用查询效率高的sql。并且mybatis支持那些短期时间就变更的项目,因为它的灵活性比Hibernate高,但是mybatis又无法做到与数据库无关性,如果与多种数据库进行交互时则需要定义多套sql。
hibernate的入门则较高,它需要我们熟知hibernate的许多api以及默认规则。对于关系模型要求较高的我们则需要使用Hibernate,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。
我们mybatis还有一个配置规则,如果我们不按照这个顺序来配置的话就会出现报错
properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
ResultMap:用来解决如果我们的表中的列名与我们的字段名对应不匹配时,无法进行完全映射时。我们就用resultMap来配置对应关系。其实际还是返回我们的pojo类型,只是我们把不匹配的双方强行匹配。
我们在定义配置文件时也有小方法,这就是动态sql
列如:条件我们用where标签进行拼接,以及如果我们该条件不存在我们就用if对其判断,是空就不进行凭借
也可以用sql片段来对我们常用的sql进行封装
进行关联查询有两种方式
1.自定义一个pojo类接收关联查询想要的字段
2.关联查询时我们一对一时用RsultMap中的assosiation来进行关联查询配置
我们将Mybtis进行整合的关键在于我们将数据库的连接以及sqlSessionFactory交给我们的spring管理,并且我们要执行时进行我们sqlSessionFactory的注入,我们也可以将包扫描交给我们的spring来管理,也可将Mapper配置进行管理
{
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.itcast.mybatis.mapper"></property>
</bean>
}