mybatis高级

一,延迟加载。

resultMap 中的 association 和 collection 标签具有延迟加载的功能。
延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息。需要关联信息
时再去按需加载关联信息。这样会大大提高数据库性能,因为查询单表要比关联查询多张
表速度要快。
Mybatis 默认是不开启延迟加载功能的,我们需要手动开启。
需要在 SqlMapConfig.xml 文件中,在 标签中开启延迟加载功能。
lazyLoadingEnabled、aggressiveLazyLoading。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<!-- 通过这个配置文件完成mybatis与数据库的连接 -->
<configuration>
    <!--引入配置文件-->
   <properties resource="database.properties"></properties>
    <settings>
    <setting name="logImpl" value="LOG4J" />
       <!-- <setting name="cacheEnabled" value="true"/>-->
        <!--开启延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--关闭积极加载-->
       <setting name="aggressiveLazyLoading" value="false"/>
<!--当你调用对象的toString方法的时候有时会无效,无效的时候加载这个方法,你就用此方法-->
        <setting name="lazyLoadTriggerMethods" value=""/>

    </settings>

    <!--配置别名(省略前缀)-->
    <typeAliases>
        <!--当给你当前包下的所有类取别名,别名的名字就是你的类名-->
       <package name="com.offcn.pojo"></package>
        <!--给具体的类加上别名,type类型就是你要加完整包名加载类名,alias就是你要的别名 -->
       <!-- <typeAlias type="com.offcn.pojo.User" alias="user"></typeAlias>-->
    </typeAliases>
    <!--开始配置环境,可以配置多个环境包括mysql,oracle-->
    <!--default里面任意取,官网是development-->
    <environments default="development">
        <environment id="development">
            <!--事务,用jdbc的事务来进行管理-->
            <transactionManager type="JDBC"></transactionManager>
            <!--设置数据源(jndi{tomcat容器分配的数据源}jdbc,c3p0都是数据源,pooled{是mybaitis自带的数据源})-->
            <dataSource type="POOLED">
                <property name="url" value="${url}"></property>
                <property name="driver" value="${driver}"></property>
                <property name="username"    value="${username}"  ></property>
                <property name="password" value="${password}"></property>
            </dataSource>
        </environment>

    </environments>
    <!--与你的userMapper进行关联,resource,这个可以配置多个,resourse代表其多个,这里的.都换成/-->
	<mappers>
      <!--  //第一版-->
     <mapper resource="com/offcn/dao/UserMapper.xml"></mapper>
        <mapper resource="com/offcn/dao/AddressMapper.xml"></mapper>
        <mapper resource="com/offcn/dao/RoleMapper.xml"></mapper>
        <!--这里直接点 不需要斜杠、-->
      <!--  <mapper class="com.offcn.dao.UserMapper"></mapper>-->
       <!-- <mapper class="com.offcn.dao.AddressMapper"></mapper>-->
    </mappers>


</configuration>

配置UserMapper.xml文件。

<resultMap id="selectByIdResult" type="User">
        <id property="id" column="id"></id>
        <result property="userName" column="userName"></result>
        <result property="userRole" column="userRole"></result>
        <!--配置一对一的关系,select就是一个子查询,colum两张表关联列-->
        <association property="role" javaType="Role" select="com.offcn.dao.RoleMapper.selectByRoleId" column="userRole">

        </association>
    </resultMap>
    <!--userCache=false” 代表禁用缓存,默认为true-->
    <select id="selectByid1" parameterType="int" resultMap="selectByIdResult" useCache="false">
        select  * from  smbms_user where id=#{id}
    </select>

延迟加载(懒加载)::也就是什么时候用什么时候加载。
resultMap(一对一,一对多的关系,自带延迟加载,开发里面最常用的)
就相当于一个子查询

二,缓存。

缓存(分为一级缓存。二级缓存。自定义缓存)
提高加载速度,同样的数据,不用一直查询数据库
查询出来的可能不是最新数据,可能是脏数据

一级缓存的作用域:针对我们的sqlsession(出了sqlsession一级缓存就不存在),只在当前的sqlsession有效
关闭一级缓存哟调用commit()方法

二级缓存(针对于mapper,) 配置二级缓存要注意:关闭一级缓存,

自定义缓存:
每一个公司缓存的框架不同

  String path="mybatis-config.xml";
            InputStream is=Resources.getResourceAsStream (path);

            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder ().build (is);
            SqlSession sqlSession=sqlSessionFactory.openSession ();
              Role role =   sqlSession.getMapper (RoleMapper.class).selectByRoleId (2);
            System.out.println (role.getRoleName ());
            //加载缓存,关闭一级缓存
            sqlSession.commit ();
   System.out.println ("----------分割线");
            Role role2 =   sqlSession.getMapper(RoleMapper.class).selectByRoleId (2);
            System.out.println (role2.getRoleName ());
            System.out.println (role2.getRoleName ())

第一输出会加载数据库,第二次的加载就在缓存中拿。而不会进入数据库。

三,spring的声明式事务

事务:避免脏数据或者错误的数据提交到数据库,一般读取缓存里面的数据,容易产生脏数据。
事务的四大原则:一致性,隔离性,持久性,原子性 声明式事务也支持这四大原则。

四。spring与mybatis的整合

集成思路
●需要 spring 来管理数据源信息。
●需要 spring 通过单例方式管理 SqlSessionFactory。
●使用 SqlSessionFactory 创建 SqlSession。(spring 和 mybatis 整合自动完成)
●持久层的 mapper 都需要由 spring 进行管理,spring 和 mybatis 整合生成 mapper
代理对象。
集成步骤
1、jar 包集成;
2、配置文件集成(数据源);
3、SqlSessionFactory 集成;
4、Mapper 接口集成;

第一步:导入jar包;
导入核心的jar包(mybatis-spring)
在这里插入图片描述

第二步:所有的都是由spring来进行管理的,写spring的核心配置文件applicationContext。xml;

<!--获取数据源-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
        <property name="url" value="jdbc:mysql://localhost:3306/smbms?useUnicode=true&amp;characterEncoding=utf-8"></property>
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="username"    value="root"  ></property>
        <property name="password" value="root"></property>
    </bean>
   <!--得到sqlsessionfactrtoy-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--引入数据库资源-->

        <property name="dataSource" ref="dataSource"></property>
        <!--加载mybatis的核心配置文件;classpath代表你的类的路径-->
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>
    </bean>

<!--引入bean-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--扫描所有mapper-->
        <property name="basePackage" value="com.offcn.mapper"></property>
    </bean>
</beans>

第一个bean是获取连接数据源
第二个bean是获取sqlSessionFactory(引入数据库资源(dataSource),第二个是引入mybatis核心配置文件)

第三个bean配置dao层,第一个是通过对象.MapperFactoryBean;(引入接口的类)第二个sqlSessionFactory
(第二种方式是MapperScession)

ublic interface UserMapper {
    //分页,第一个参数是当前页,第二个是参数是每页的信息条数
    List<User> selectAllPage(@Param ("currentPageNo") Integer currentPageNo,@Param ("pageSize") Integer pageSize);
}

<!--namespace 相当于包,包管理器-->
<mapper namespace="com.offcn.mapper.UserMapper">
<!--    <cache></cache>-->
    <!--id都是唯一的,是你访问的一个标识符,查询总记录数-->
    <!--resultType 代表返回值类型,后面不要加分号-->
 <select id="selectAllPage" resultType="User">
     select  * from smbms_user limit #{currentPageNo},#{pageSize}

 </select>
</mapper>

text类:

 @Test
    public void test(){
        ApplicationContext app=new ClassPathXmlApplicationContext ("applicationContext.xml");
      UserMapper userMapper= (UserMapper) app.getBean ("userMapper");
     List<User> list= userMapper.selectAllPage (1,5);
        for (User u:list
             ) {
            System.out.println (u.getUserName ()+"\t"+u.getUserPassword ());
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值