Mybatis
文章后半部分内容来自:https://www.cnblogs.com/wang-meng/p/5701990.html
目录
1.1.9- Mybatis如何解决使用jdbc数据库连接接数据库释放频繁造成系统资源浪费从而影响系统性能
1.1.10-sql与java语句写在一起不易于维护,Mybatis如何解决的
1.1.11-Mybatis怎么保证向sql语句传参数,占位符需要和参数一一对应
1.1.12-Mybatis怎么把数据库结果封装成pojo对象
1.1.1-什么是orm
ORM模式是一种为了解决面向对象与关系数据存在的互不匹配现象的技术,ORM提供了实现持久化的另一种模式,可以简单的方案是采用硬编码方式(jdbc,操作,sql的方式)为每一种可能的数据库访问操作提供单独的方法,这种方法存在很多缺陷,所以使用ORM框架来解决,常用的有Hibernate,ibatis(Mybatis)。
1.1.2-ORM基于三个核心原则
-
简单:以最基本的形式建模数据
-
传达性:数据库结构被任何人都能理解的语言文档化
-
精确性:基于数据模型创建正确标准化的结构
1.1.3-Mybatis是什么
MyBatis 是一个可以自定义SQL、存储过程和高级映射的持久层框架,是一个半orm框架,只需要注重sql语句的编写即可,不需要像传统的jdbc一样去处理加载驱动,连接,创建,释放的工作。
1.1.4-Mybatis的优点
-
相对灵活,sql语句可以写在xml文件中,和程序代码可以实现分离解耦,易于维护,提供 XML 标签, 支持编写动态 SQL 语句, 并可重用。
-
没有jdbc一样繁琐的步骤,只需要关注sql语句本身即可。
-
和Spring可以很好的整合。
-
提供映射标签, 支持对象与数据库的 ORM 字段关系映射
1.1.5-Mybatis的缺点
- sql语句会比较多
- 对数据库的依赖性强,不可以随意更改数据库
1.1.6-#{}和${}的区别
#{}是预编译处理,${}是字符串替换
-
#{}:Mybatis在处理#{}时,会将sql中的#{}替换为?号,对sql语句预编译后调用 PreparedStatement 的set 方法来赋值。
-
${}:字符串替换, 告诉 mybatis 使用$包含的“字符串”替换所在位置。使用的是 Statement 对象,有SQL注入的风险。
1.1.7-MyBatis编程步骤
- 创建SqlSessionFactory
- 通过SqlSessionFactory创建SqlSession
- 通过sqlsession执行数据库操作
- 调用session.commit()提交事务
- 调用session.close()关闭会话
1.1.8-模糊查询使用
<select id="findByName" resultType="com.pojo.Person">
select * from person where name like "%" #{name} "%"
</select>
1.1.9- Mybatis如何解决使用jdbc数据库连接接数据库释放频繁造成系统资源浪费从而影响系统性能
在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接
1.1.10-sql与java语句写在一起不易于维护,Mybatis如何解决的
将Sql语句配置在实体类对应的xml文件中实现与java代码分离
1.1.11-Mybatis怎么保证向sql语句传参数,占位符需要和参数一一对应
Mybatis自动将java对象映射至sql语句
1.1.12-Mybatis怎么把数据库结果封装成pojo对象
Mybatis自动将sql执行结果映射至java对象
1.1.13-MyBatis的mapper接口调用时的要求
- Mapper接口方法名和对应的mapper.xml中定义的sql的Id要一致
- Mapper接口方法参数类型对应的mapper.xml中定义的sql 的parameterType/resultType的类型相同
- Mapper.xml文件中的namespace即是mapper接口的类路径
1.1.14-SqlMapConfig.xml中配置的内容
-
properties(属性)
-
settings(配置)
-
typeAliases(类型别名)
-
typeHandlers(类型处理器)
-
objectFactory(对象工厂)
-
plugins(插件)
-
environments(环境集合属性对象)
-
environment(环境子属性对象)
-
transactionManager(事务管理)
-
dataSource(数据源)
-
mappers(映射器)
1.1.15-MyBatis的一级缓存和二级缓存
Mybatis首先去缓存中查询结果集,如果没有则查询数据库,如果有则从缓存取出返回结果集就不走数据库。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象
Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql可以从缓存中获取数据。二级缓存是可以跨SqlSession的。
1.1.16-Mapper编写方式
一:接口实现类继承SqlSessionDaoSupport
使用此种方法需要编写mapper接口,mapper接口实现类、mapper.xml文件
1、在sqlMapConfig.xml中配置mapper.xml的位置
<mappers>
<mapper resource="mapper.xml文件的地址" />
<mapper resource="mapper.xml文件的地址" />
</mappers>
2、定义mapper接口
3、实现类集成SqlSessionDaoSupport
mapper方法中可以this.getSqlSession()进行数据增删改查。
4、spring 配置
<bean id=" " class="mapper接口的实现">
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
二:使用org.mybatis.spring.mapper.MapperFactoryBean
1、在sqlMapConfig.xml中配置mapper.xml的位置
如果mapper.xml和mappre接口的名称相同且在同一个目录,这里可以不用配置
<mappers>
<mapper resource="mapper.xml文件的地址" />
<mapper resource="mapper.xml文件的地址" />
</mappers>
2、定义mapper接口
- 注意
- 1、mapper.xml中的namespace为mapper接口的地址
- 2、mapper接口中的方法名和mapper.xml中的定义的statement的id保持一致
3、 Spring中定义
<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="mapper接口地址" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
三 :使用mapper扫描器
1、mapper.xml文件编写
注意:
mapper.xml中的namespace为mapper接口的地址
mapper接口中的方法名和mapper.xml中的定义的statement的id保持一致
如果将mapper.xml和mapper接口的名称保持一致则不用在sqlMapConfig.xml中进行配置
2、定义mapper接口
注意mapper.xml的文件名和mapper的接口名称保持一致,且放在同一个目录
3、配置mapper扫描器
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="mapper接口包地址"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
扫描器将接口通过代理方法生成实现对象,要spring容器中自动注册,名称为mapper 接口的名称。