MyBatis笔记二
来源:互联网 发布:斯坦福商学院知乎 编辑:程序博客网 时间:2024/06/09 21:43
MyBatis第二天笔记
多对一(一对一)关联查询
java类关系配置
public class UserOrder extends Order {private Integer id;private String username;private String password;private String sex;
xml配置
<!-- 多对一 自动映射 --><select id="selectUserOrder" resultType="com.example.mybatis.domain.UserOrder"> select u.*, o.oid oid,o.goodsname,o.goodsprice from t_user u left join t_order o on u.id=o.uid;</select>
测试代码
//自动映射方式查询@Testpublic void testManyToOne2() { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<UserOrder> selectUserOrder = userMapper.selectUserOrder(); for (UserOrder user : selectUserOrder) { System.out.println(user.toString()); }}
Order bean类封装
public class Order {private Integer id;private String goodsname;private String goodsprice;private User user;
xml配置
<select id="getOrderInfo" resultMap="orderResultMap"> select t_order.*,t_user.username,t_user.sex from t_order,t_user where t_order.uid=t_user.id</select><resultMap type="order" id="orderResultMap"> <id property="id" column="id" /> <result column="goodsname" property="goodsname" /> <result column="goodsprice" property="goodsprice" /> <association property="user" javaType="com.example.mybatis.domain.User"> <id column="uid" property="id" /> <result column="username" property="username" /> <result column="sex" property="sex" /> </association></resultMap>
测试
@Testpublic void testManyToOne() { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<Order> userByIds = userMapper.getOrderInfo(); for (Order order : userByIds) { System.out.println(order); }}
一对多关联查询
bean配置
public class User {private Integer id;private String username;private String sex;private String password;//用户中要有orderListList<Order> orderList;
xml中配置
<select id="getUserOrderList" resultMap="userResultMap">select u.*, o.idoid,o.goodsname,o.goodsprice fromt_user u left join t_order o onu.id=o.uid ;</select><resultMap type="user" id="userResultMap"> <id column="id" property="id" /> <result column="username" property="username" /> <result column="password" property="password" /> <result column="sex" property="sex" /> <collection property="orderList" ofType="com.example.mybatis.domain.Order"> <!-- 这里需要格外注意 定义id时要进行区分,要么起个别名,要么定义表的时候,id名称不一样 --> <id column="oid" property="id" /> <result column="goodsname" property="goodsname" /> <result column="goodsprice" property="goodsprice" /> </collection></resultMap>
代码测试
@Testpublic void testOnetoMany() { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> userOrderList = userMapper.getUserOrderList(); for (User user : userOrderList) { List<Order> orderList = user.getOrderList(); System.out.println(user+"---"); }}
延迟加载
需要查询关联信息时,使用mybatis延迟加载特性可有效的减少数据库压力,首次查询只查询主要信息,关联信息等用户获取时再加载。
配置信息
lazyLoadingEnabled全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。aggressiveLazyLoading当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。
配置方式
<!-- 全局配置参数 --><settings> <!-- 延迟加载总开关 --> <setting name="lazyLoadingEnabled" value="true" /> <!-- 设置按需加载 --> <setting name="aggressiveLazyLoading" value="false" /></settings>
代码测试
<!-- 1延迟加载 先查询user 再查询user中的订单信息 --><select id="selectLazyUser" resultMap="lazyUserResultMap"> select * from t_user</select><!-- 2 resultMap --><resultMap type="User" id="lazyUserResultMap"> <id column="id" property="id" /> <result column="username" property="username" /> <result column="sex" property="sex" /> <result column="age" property="age" /> <!-- select 查询订单信息 column="id" 传递的id参数 --> <collection property="orderList" ofType="Order" select="selectLasyOrder" column="id"> <!-- 进行映射 --> <id column="oid" property="oid" /> <result column="goodsname" property="goodsname" /> <result column="goodsprice" property="goodsprice" /> </collection></resultMap><!-- 延迟查询 --><select id="selectLasyOrder" resultType="Order" parameterType="int"> select * from t_order where uid=#{id}</select>
查询缓存
一级缓存
一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,
第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了
测试:使用同一个sqlSession查询id相同的两个对象,比较对象地址是否一致 **注意:如果在sqlsession中执行了更新数据库的操作缓存会清空**
二级缓存
Mybatis二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同namesspace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。Mybatis默认没有开启二级缓存需要在setting全局参数中配置开启二级缓存。
应用场景
电商类网站,频繁查询操作网站
配置方式
1.SqlMapConfig.xml中配置全局缓存<setting name="cacheEnabled" value="true"/>2.在具体的mapping.xml中配置<cache />标签3.注意,需要将进行二级缓存的对象进行序列化操作4.如果要禁用缓存,具体的查询操作中使用useCache="false" 或者使用flushCache刷新二级缓存
了解ehcache 方式配置二级缓存
- 导入ehcache jar包
- 配置ehcache.xml
在标签中表明type
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
MyBatis整合Spring
整合思路
1、SqlSessionFactory对象应该放到spring容器中作为单例存在。 2、传统dao的开发方式中,应该从spring容器中获得sqlsession对象。 3、Mapper代理形式中,应该从spring容器中直接获得mapper的代理对象。 4、数据库的连接以及数据库连接池事务管理都交给spring容器来完成。
原生dao方式整合过程
导入jar包
配置MyBatis核心配置文件SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <typeAliases> <!-- 定义单个类的别名 --> <!-- <typeAlias type="com.example.batis.domain.User" alias="user" /> --> <package name="com.example.mybatis.domain" /> </typeAliases> <mappers> <mapper resource="com/example/mybatis/domain/User.xml" /> </mappers></configuration>
配置applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd "><context:property-placeholder location="classpath:db.properties" /><!-- 定义数据源的bean --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${db.driver}" /> <property name="jdbcUrl" value="${db.url}" /> <property name="user" value="${db.user}" /> <property name="password" value="${db.password}" /></bean><!-- 整合Sql会话工厂归spring管理 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 指定mybatis核心配置文件 --> <property name="configLocation" value="classpath:SqlMapConfig.xml"></property> <!-- 指定会话工厂使用的数据源 --> <property name="dataSource" ref="dataSource"></property></bean><bean id="userDao" class="com.example.mybatis.dao.impl.UserDaoImpl"> <property name="sqlSessionFactory" ref="sqlSessionFactory"></property></bean>
创建dao接口,编写实现类
public interface UserDao {public List<User> selectUserById(int id);}//集成public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao { @Override public List<User> selectUserById(int id) { SqlSession sqlSession = this.getSqlSession(); List<User> selectList = sqlSession .selectList("test.selectUserById", id); return selectList; }}
测试Spring整合dao方式是否成功
@Testpublic void testQueryList() { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext( "applicationContext.xml"); UserDao userDao = (UserDao) applicationContext.getBean("userDao"); List<User> selectUserById = userDao.selectUserById(1); for (User user : selectUserById) { System.out.println(user.toString()); }}
Dao代理方式整合过程
- 导入jar包
配置Spring核心配置文件applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd "><context:property-placeholder location="classpath:db.properties" /><!-- 定义数据源的bean --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${db.driver}" /> <property name="jdbcUrl" value="${db.url}" /> <property name="user" value="${db.user}" /> <property name="password" value="${db.password}" /></bean><!-- 整合Sql会话工厂归spring管理 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 指定mybatis核心配置文件 --> <property name="configLocation" value="classpath:SqlMapConfig.xml"></property> <!-- 指定会话工厂使用的数据源 --> <property name="dataSource" ref="dataSource"></property></bean><!--配置mapper类所在的包,通过spring自动扫描,就不需要再重新配置单个的mapper了 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mybatis.dao"></property></bean>
配置MyBatis核心配置文件
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <typeAliases> <!-- 定义所有bean的别名 类的大小写都可以 --> <package name="xxxx" /> </typeAliases></configuration>
整合测试
@Testpublic void testQueryList() { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext( "applicationContext.xml"); UserMapper userMapper = (UserMapper) applicationContext .getBean(UserMapper.class); List<User> selectUserById = userMapper.selectUser(); for (User user : selectUserById) { System.out.println(user.toString()); }}
逆向工程
- 使用逆向过程类 生成pojo和mapper
- 将pojo类和mapper放置到项目中
常用代码
示例查询mapper.selectByExample(example);根据主键进行查询selectByPrimaryKey(1);多条件查询TUserExample example = new TUserExample();Criteria createCriteria = example.createCriteria();createCriteria.andUsernameLike("%六%");
阅读全文
0 0
- MyBatis学习笔记二
- myBatis学习笔记(二)
- MyBatis学习笔记二
- Mybatis笔记二
- MyBatis笔记(二)
- MyBatis笔记二
- Mybatis学习笔记二(Mybatis 配置文件)
- Mybatis学习笔记(二)【mybatis概述】
- mybatis学习笔记(二)
- Mybatis学习笔记(二)
- Mybatis学习笔记(二)
- Mybatis复习笔记(二)
- spring mvc+mybatis笔记(二)
- MyBatis学习笔记(二)
- MyBatis学习笔记(二)
- MyBatis学习笔记(二)
- MyBatis学习笔记(二)
- spring MVC+mybatis+spring security笔记<二>
- POJ 1182 食物链
- i2ctools在android中的编译及使用
- LGV30的到来,是否能一雪前耻盖过三星呢?看到这个你就知道了!
- Cocos2dx-lua luabindings 示例
- Codeforces Round #430 (Div. 2)-搜索&STL-Ilya And The Tree
- MyBatis笔记二
- Android中svg动画框架PathView的使用
- AndroidStudio 自动导入内部类
- 分组取每组前几条记录(排名) 附group by与order by的研究
- 移动端网页纯原生js选项卡tab切换
- qt中用异或加密解密
- jQuery:多个AJAX/JSON并行请求对应一个回调函数处理方法$.when
- xml中嵌入Scala代码
- Winfrom跨线程调用控件