关联查询
案例:用户和定单
user和orders:
User 与orders:一个用户可以创建多个订单,一对多
Orders 与 user:多个订单只由一个用户创建,多对一
orders和orderdetail:
Orders 与 orderdetail:一个订单可以包括 多个订单明细,因为一个订单可以购买多个商品,每个商品的购买信息在orderdetail记录,一对多关系
orderdetail 与orders:多个订单明细包括在一个订单中, 多对一
orderdetail和items:
Orderdetail 与 items:多个订单明细只对应一个商品信息,多对一
Items 与 orderdetail:一个商品可以包括在多个订单明细 ,一对多
一对一
根据商品ID查找定单信息,包括用户名和地址
SELECT o.*,u.username,u.address FROM orders o,user u WHERE o.user_id = u.id AND o.id = 3
resultType实现
写个定单的扩展类
声明定单接口
声明定单配置文件
加载映射文件
测试
resultMap实现
OrdersMapper.java添加一个方法
OrdersMapper.xml
测试
一对多
根据定单ID查找定单信息、用户信息和定单明细信息
在Orders中添加定单明细
Mapper接口
OrderMapper.xml
测试
多对多
查询用户信息及用户购买的商品信息,要求将关联信息映射到主pojo的pojo属性中
SELECT
u.id,
u.username,
u.address,
o.id order_id,
o.number,
o.createtime,
o.note,
od.id detail_id,
od.items_id,
od.items_num,
it.name,
it.price,
it.detail
FROM
user u,
orders o,
orderdetail od,
items it
WHERE
o.user_id = u.id
AND o.id = od.orders_id
AND od.items_id = it.id;
UserMapper.java
User/Orders/Orderdetail.java
UserMapper.xml
测试
延时加载
Mapper
UserMappler.xml
OrdersMapper.xml
测试
配置懒加载(用到user时才执行语句)
查询缓存
Mybatis的缓存,一级缓存是默认使用的。二级缓存需要手动开启。
一级缓存(当保存删除更新时才消除一级缓存)
二级缓存(关闭session才写入二级缓存,session提交会清空二级缓存)
开启二级缓存总开关
UserMapper中配置二级缓存
User系列化
测试
禁用指定方法二级缓存
刷新缓存
ehcache
Ehcache是一个分布式的缓存框架。
添加jar包
设置映射文件中cache标签
在src下添加ehcache的配置文件
mybaties整合spring
moto-faith/learnJavagithub.com逆向工程
通过数据库中的单表,自动生成java代码。
导入mysql的驱动包和mybatis的逆向工程包
mybatis-generator-core-1.3.2 mysql-connector-java-5.1.7-bin
创建generator配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="mysqlTable" targetRuntime="MyBatis3">
<!-- 1.数据连接参数 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis"
userId="root"
password="123456">
</jdbcConnection>
<!-- 2.默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL
和 NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 3.生成模型的位置 -->
<javaModelGenerator targetPackage="com.gyf.backoffice.domain" targetProject=".src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 4.targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="com.gyf.backoffice.mapper" targetProject=".src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- 5. targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.gyf.backoffice.mapper"
targetProject=".src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 6.要生成的表 -->
<table tableName="items"/>
<table tableName="orderdetail"/>
<table tableName="orders"/>
<table tableName="user"/>
</context>
</generatorConfiguration>
使用java类来执行逆向工程(生成model和mapper)
public class Generator {
public static void main(String[] args) throws Exception{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("config/generator.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
callback, warnings);
myBatisGenerator.generate(null);
}
}
用生成好的mapper就可以直接使用方法了