初次学习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());

0 0