初次学习Mybatis框架总结
来源:互联网 发布:ubuntu怎么改成中文 编辑:程序博客网 时间:2024/05/16 07:58
一、基础知识:重点内容
1. 首先为什么要使用持久层框架:
原生态的jdbc开发存在许多弊端,频繁的连接关闭数据库,性能低;还有许多重复的代码模块,开发效率低下;把sql语句,参数,和输出结果集等硬编码在程序中,不利于后期维护扩展。
2. Mybatis是什么: Mybatis是一个不完全的持久层框架(ORM框架,对象关系映射),因为它与hibernate不同,mybatis的核心就是编写sql语句,这样可以很方便的进行sql优化,sql的判断等。 Mybatis,可以用数据库连接池来管理数据库连接,就不需要频繁的对数据库进行连接、关闭等操作了。还可以完成输入映射、输出映射、这就可以让程序员把精力放在sql语句的编写上。使用Mybatis就需要导入Mybatis的jar包,包括核心jar包以及其依赖jar包。log4j,ognl,代理jar包等
二、Mybatis的两个配置文件(SqlMapConfig.xml、mapper.xml)重点内容
1. SqlMapConfig.xml:这是一个全局的配置文件:可以配置一下内容
properties: 该元素用来加载属性文件,配置属性。
settings:该元素用来配置mybatis的全局设置,例如缓存等。
typeAliases:该元素用来配置别名,可以单独对某个类配置,也可以扫描整个包下面的类,(默认扫描的别名为类首字母小写)
tyepHandlers:该元素用来配置类型转换器,mybatis提供了常用的类型转换(包括基本类型和常用的对象类型)
objectFactory:没什么用
plugins:插件,不用
enviroments:用来配置环境
—environment:环境变量,里面包括数据源和事务
—transactionManager:配置事务管理器
—dataSource:配置数据源,数据源对应一个数据库,在数据源中可以配置连接池属性,连接池相当于一个代理:如果有人索要数据库连接,连接池会给客户数据库连接。
databaseIdProvider:数据库厂商标识
mappers:该元素是最重要的元素,用来配置映射器,可以单独配置某个映射器,也可以使用包扫描:
重点内容注意 :在使用包扫描时,需要遵循如下规范:(mapper.xml和mapper.java名称相同且在同一目录)`
<resultMap type="orders" id="findOrdersUserOrderdetailMap"> <!-- 映射商品、用户信息,同一对一多表查询 --> <!-- 对order中的字段进行映射 --> <id column="id" property="id"/> <result column="user_id" property="userId"/> <result column="number" property="number"/> <result column="createtime" property="createtime"/> <result column="note" property="note"/> <!-- 对orders中的user进行关联映射,一对一 property:将查询出的信息映射到orders的哪个属性,在此为user属性 javaType:指定该属性的类型,在此为user类型,使用了别名 --> <association property="user" javaType="user"> <!-- 唯一标识的映射,将查询出的user_id与user的主键id进行映射 user_id是sql语句查询的别名,如果不一致则为空--> <id column="user_id" property="id"/> <result column="username" property="username"/> <result column="sex" property="sex"/> <result column="address" property="address"/> </association> <!-- 进行集合映射 --> <collection property="orderdetails" ofType="orderdetail"> <!-- 映射主键,colunm指定的是数据库表中字段的名称,property指定pojo类的属性名 --> <id column="d_id" property="id"/> <result column="orders_id" property="ordersId"/> <result column="items_id" property="itemsId"/> </collection> </resultMap>
输出映射总结:
如果查询出的列名和属性不一致,无法完成映射,需要使用sql别名,或者在resultMap中进行表字段与po属性的映射
记住如下规则:colunm指明的是sql中查出来的字段名,property指明的是po的属性名,
在不适用延迟加载的情况下进行关联映射是,需要指明两个属性,一个是property:指明的是将查询的结果映射到该po的哪个属性中;一个是类型一对一为javaType,一对多是ofType。
当使用延迟加载时,还需要指明其他两个属性,一个是colunm:指明的是在延迟加载的时候根据哪个属性去查询,还有一个是select:指明的是statement的id,如果该statement不在本mapper.xml中,需要在前面指明namespace。
还有一个重点是动态sql,sql片段:
1。sql片段,指明一个id的sql片段,为了提高效率,防止太多重复的sql语句,
在使用时,使用该元素引入即可,
2。动态sql:常用元素:where,if,choose(when,otherwise),foreach
where元素,可以自动省去第一个and,
if:用来判断,test属性用来判断表达式是否为真
choose:选择标签,子标签when用来选择,otherwise用来指其他情况
foreach:用来遍历,属性比较多,具体用的是时候查资料:
二、高级知识:
1。数据模型分析思路
# 分析每个模块中每张表记录的大概内容,主要是用来存什么数据
# 详细分析每章表的字段,重要字段(非空字段,外键字段)
# 数据库级别的表与表之间的关系,通过主键外键关联关系
# 表与表之间的业务关系,一定要建立在某种业务基础上分析,一对多,还是一对一,多对多等。
2。延迟加载:使用延迟加载可以提高数据库性能,原理,先从单表查询,当需要关联表的时候在去进行关联查询,将参数传入到statement中去,因此sql语句应改为单表查询,而不是同时查询许多表字段。
注意:参数应该是查询数据库的表的字段名,而不是po属性名!!!!
理解延迟加载:先查单表,当需要关联表的时候去执行statement查询数据库,需要的时候指的是,调用了该代理对象的get,set,toString,clone等方法是,这就算需要了,会在执行这些方法之前,去查询数据库,这种技术可以用代理来实现,所以在需要之前返回的是一个代理对象。Mybatis如何开启延迟加载:默认情况下没有开启延迟加载 在SqlMapConfig.xml中的settings元素中指明延迟加载配置:
<settings> <!--打开延迟加载开关 --> <setting name="lazyLoadingEnable" value="true"/> <setting name="aggressiveLazyLoading" value="false"/> </settings>
3。Mybatis的查询缓存:一级缓存(sqlSession级别的,不能跨sqlSession),二级缓存(mapper级别的,对应一个mapper.xml,可以跨sqlSession,多个sqlSession可以共享缓存数据,每个sqlSession都可以影响二级缓存)
对缓存的理解:缓存,顾名思义就是把数据缓存在内存中,或硬盘等介质上,方便下次使用,提高系统性能,减少数据库压力。
1。一级缓存:sqlSession级别的缓存,mybatis默认支持一级缓存,所以不需要设置 # 每一个sqlSession对象在创建后,都会有一块内存区域,存放一个HashMap的数据结构,用于存储缓存数据,(在数据库查询出来的数据,会有一个key作为唯一标识),不同的sqlSession不会相互影响, # 一级缓存通常用在事务中,即service方法中,每个service方法会使用同一个sqlSession,service方法执行结束,sqlSession关闭,缓存清空, # 一级缓存原理: * 第一次:查询id为1的用户信息,首先会去一级缓存中查找,没有的话,就会去查数据库,然后放到一级缓存中。 * 第二次:查询id为1的用户信息,首先会去一级缓存中查找,找到了,直接使用。 * 注意:如果期间sqlSession执行了insert,update,delete等方法,且执行了commit(),那么就会清空缓存,这样可以保证数据及时更新,防止脏读。 2。二级缓存:mapper级别的缓存,对应一个mapper.xml,按照namespace区分,如果namespace相同,那么就是同一个二级缓存 # 二级缓存可以跨sqlSession,多个sqlSession可以共享数据,但也可以影响缓存, # 二级缓存原理: sqlSession1,执行一个mapper中的查询,然后会把数据存放到二级缓存中 sqlSession2,如果查询同样的数据,则会从缓存中获取,不会查询数据库, sqlSession3,如果执行了插入、删除、更新等操作,那么就会清空二级缓存,这样的话,老子辛辛苦苦缓存的东西就付之一炬了,所以还是慎用。 # 二级缓存的开启:因为是mapper级别的缓存,所以除了在SqlMapConfig中开启,还需要在mapper.xml中配置: * 在SqlMapConfig中加入: * <setting name="cacheEnabled" value="true"/> * 在mapper.xml中开启 * <cache/> 直接在mapper元素下加入这个元素即可 * 并且pojo类需要实现序列化接口:用来反序列化, * 可以在statement中设置 useCache=“false”来关闭二级缓存。
4。使用分布式管理缓存,mybatis整合ehcache,这是一个分布式缓存框架,
分布式顾名思义就是好多服务器的意思,因为实际中,需要提高性能,高并发等,就需要多台服务器,mybatis无法实现分布式缓存共享,所以就需要使用群集管理(初步了解,日后详谈),
所以mybatis提供了一个分布式管理缓存接口 Eache,开发者需要实现该接口,用来分布式管理
5。最后就是mybatis和spirng的整合了:将SqlSessionFactory,dataSource,mapper都交给spring来管理。
需要spring通过单例方式管理SqlSessionFactory:因为sqlSessionFactory依赖dataSource,和configuration,所以需要将这两个bean注入进来,
dataSource,数据源对应一个数据库,需要连接数据库的密码,驱动等信息,其中还包括了数据库连接池的信息,所以也需要将连接池参数注入到dataSource对象中,
1。整合环境:加入spring的jar包,mybatis的jar包,还需要加入spring-mybatis的整合包。
在applicationContext_dao.xml中配置sqlSessionFactory
<!-- 加载配置文件 --> <context:property-placeholder location="classpath:db.properties" /> <!-- 数据源,使用dbcp --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="maxActive" value="10" /> <property name="maxIdle" value="5" /> </bean> <!-- sqlSessinFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 加载mybatis的配置文件 --> <property name="configLocation" value="mybatis/SqlMapConfig.xml" /> <!-- 数据源 --> <property name="dataSource" ref="dataSource" /> </bean>
还需要配置扫描mapper的包,建议使用扫描包,而不是单独的对每个mapper进行配置。
这样就可以通过spring容器来获取mapper代理对象。
在普通项目中得到spring容器的方法:
ApplicationContext appContext = new ClassPathXmlApplicationContext(”beans.xml”);//在类路径下加载配置文件,
还可以在文件路径下加载配置文件
如果在web项目中,可以在web.xml中配置监听器:
contextConfigLocation
classpath:config/applicationContext.xml
org.springframework.web.context.ContextLoaderListener
用如下代码获取:
context=WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServletContext());
- 初次学习Mybatis框架总结
- springmvc+mybatis框架学习总结
- MyBatis学习1---初次接触
- 初次学习PHP总结
- linux初次学习总结
- Mybatis框架学习总结--1如何搭建
- 初次学习RUBY的总结
- 类似hibernate框架的mybatis框架学习总结
- 初次搭建ssm(springboot+springMvc+Mybatis)框架实践之路
- MyBatis框架总结
- MyBatis框架总结
- Mybatis框架个人总结
- MyBatis框架总结
- spring struts2 mybatis框架学习总结(mvc三层架构)
- spring+springMVC+mybatis三大框架整合学习总结
- Tomcat 初次学习的一些总结
- 初次学习HTML的基础总结
- Mybatis框架学习笔记
- 《flask web开发》第七章 大型程序架构
- Java web 表示层技术
- JS与OCX交互(续)
- 1015. 德才论
- Bootsrtap笔记14—工具提示框、弹出框
- 初次学习Mybatis框架总结
- nginx安装
- 遇到职场冷箭该怎么处理
- 颜色随机
- SAP STO业务
- 数据结构-排序算法集合(包含所有排序)
- 1019 pat 无法识别itoa,2008可以,但是做出来了,这个是int转string,和string转int
- Spring Cache扩展:注解失效时间+主动刷新缓存
- Nginx 安装和配置