一,延迟加载。
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&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 ());
}
}