第一节 复习
Mybatis框架
(1)单表查询
select标签中的resultType属性 ,取值为 a)如果是List集合,取值为信合中泛型的数据类型,
b)如果是单个对象,取值为对象的数据类型
(2)多表查询
a)业务方式, 两个单表的查询,通过java代码的方式进行"组装"
b)N+1方式, 两个表单的查询,通过 mapper.xml文件的配置来实现 ,标签为resultMap
c)表连接方式, 两表连查 , 通过mapper.xml文件的配置来实现的,标签为 resultMap
(3)resultMap标签的作用?
a)用于手动映射
b) N+1方式的查询的xml配置
c)表连接方式,xml的配置
(4)分页查询
a)传统方式 ,自己编写sql语句 select * from 表名 limit 索引,每页条数;
b)使用插件 ,通过xml文件的配置来实现的
第二节 mybatis中的缓存问题
一级缓存sqlsession ,默认开启
缺点:数据的脏读 (用户读取的数据和数据库的数据不致)
只可以实现一个用户的请求中实现缓存数据的共享
注意 :使用SqlSession对象操作数据库资源时,SqlSession对象会先去其缓存区查找找是否有现成的符合要求的数据,如果有则返回,没有则按照需求进行数据库操作,获取符合要求的资源,并将资源返回给用户的同时在其缓存中缓存(存储),当我们使用同一个sqlsession对象操作同一个sql(语句)资源时,就可以从缓存中直接获取数据库资源数据了
package com.bjsxt.test;
import com.bjsxt.entity.Dept;
import com.bjsxt.mapper.DeptMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class Test {
public static void main(String[] args) throws IOException {
//(1)解析xml
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
//(2)获得工厂对象
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
//(3)获取session对象
SqlSession sqlSession = build.openSession();
//(4)查询单个对象
DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
Dept dept = mapper.queryOne(10);
System.out.println(dept);
System.out.println("----------------------------");
Dept dept1 = mapper.queryOne(20);
System.out.println(dept1);
System.out.println("-----------------------------");
Dept dept2 = mapper.queryOne(10);
System.out.println(dept2);
//(5)关闭
sqlSession.close();
System.out.println("==============================================");
SqlSession sqlSession1 = build.openSession();//重新获取session对象
DeptMapper mapper1 = sqlSession1.getMapper(DeptMapper.class);
Dept dept3 = mapper1.queryOne(10);
System.out.println(dept3);
System.out.println("---------------------------------");
Dept dept4 = mapper1.queryOne(20);
System.out.println(dept4);
System.out.println("-----------------------------");
Dept dept5 = mapper1.queryOne(10);
System.out.println(dept5);
sqlSession1.close();
}
}
二级缓存 ,需要手动开启,通过xml文件的配置
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjsxt.mapper.DeptMapper">
<!--开启了二级缓存 factory-->
<cache readOnly="true"></cache>
<select id="queryOne" resultType="dept">
select * from dept where deptno=#{0}
</select>
</mapper>
二级缓存的执行:
每个sqlSession对象,都对应一个一级缓存,当sqlsession关闭时,将一级缓存的数据推送到二级缓存,
获取数据的顺序 ,一级缓存没有数据,到二级缓存,二级缓存没有数据,到数据库执行
第三节 mybatis中的注解
在mybatis中使用注解,实现增,删,改,查
package com.bjsxt.mapper;
import com.bjsxt.entity.Dept;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.List;
public interface DeptMapper2 {
@Select("select * from dept")
public List<Dept> queryAll();
@Insert("insert into dept values (#{deptNo},#{dname},#{loc})")
public int addDept(Dept dept);
@Delete("delete from dept where deptno=#{0}")
public int deleteDept(int deptNo);
@Update("update dept set dname=#{dname},loc=#{loc} where deptno=#{deptNo}")
public int updateDept(Dept dept);
}
实际中是不会使用注解的
注解的使用缺点:
A:多表的操作比较麻烦
B:没有办法实现sql语句的java代码的解耦
C:没有办法实现sql语句的拼接和resultMap的使用
注解使用的场景
对于单表的简单操作的时候使用注解比较方便
第四节 mybatis 中的运行原理
MyBatis的运行原理
1.运行过程中涉及到的类
1.1Resources ,MyBatis中的IO流的工具类
1.1加载配置文件
1.2SqlSessionFactoryBuilder()构造器
1.2.1作用:创建SqlSessionFactory接口的实现类
1.3XMLConfigBuilder MyBatis全局配置文件内容构建器类
1.3.1作用:负责读取流内容并转换成Java代码
1.4Configuration 封装了全局配置文件所有配置信息
1.4.1全局配置文件内容存放在Configuration中
1.5DefaultSqlSessionFactory是SqlSessionFactory接口的实现类
1.6Transaction事务类
1.6.1每一个SqlSession会带有一个Transaction对象
1.7TransactionFactory事务工厂
1.7.1负责生产Transaction
1.8Executor MyBatis执行器
1.8.1作用:负责执行SQL命令
1.8.2相当于JDBC中的statement对象(PreparedStatement或CallableStatement)
1.8.3默认的执行器SimpleExecutor
1.8.4批量操作BatchExcutor
1.8.5通过openSession(参数控制)
1.9DefaultSqlSession是SqlSession接口的实现类
XMLConfigBuilder :作用,用于解析xml文件
Ctrl+atl+B进入接口的实现类
ctrl+alt+U看清类的组织结构
package com.bjsxt.test;
import com.bjsxt.entity.Dept;
import com.bjsxt.mapper.DeptMapper;
import com.bjsxt.mapper.DeptMapper2;
import org.apache.ibatis.builder.xml.XMLConfigBuilder;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class Test2 {
public static void main(String[] args) throws IOException {
//(1)获取mybatis.xml的输入流(与磁盘文件建立联系,并将文件“转”成对应的输入流)
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
//(2)
//
//以上三句代码相当于SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
//XMLConfigBuilderMyBatis全局配置文件内容构建器类,负责读取流内容并转换成Java代码
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, null, null);
//Configuration 封装了全局配置文件所有配置信息
Configuration con=parser.parse();//new Configuration();
//接口new 实现类
SqlSessionFactory build=new DefaultSqlSessionFactory(con);
/**********以上代码,xml文件解析完毕******/
//(3)获取session对象 (底层得到事务对象,得到Executor执行器对象(获取连接,创建Statement对象,) ,执行sql语句)
SqlSession sqlSession = build.openSession(true); //设置事务的自动提交
//(4)增,删,改,查
DeptMapper2 mapper = sqlSession.getMapper(DeptMapper2.class);
List<Dept> list = mapper.queryAll();
System.out.println(list);
System.out.println("----------------------------------------");
int i = mapper.addDept(new Dept(50, "开发部", "上海"));
System.out.println(i);
// int i1 = mapper.updateDept(new Dept(50, "测试部", "深圳"));
// System.out.println(i1);
//int i = mapper.deleteDept(50);
// System.out.println(i);
//sqlSession.commit();
sqlSession.close();
}
}
第五节 Mybatis的总结
Mybatis的总结
第1天
a)mybatis的基本配置
b)sqlSession的三个方法 selectList() ,selectOne(), selectMap()
c)引入的动态代理 (接口)
第2天
a)单表的查询 resultType
b)多表查询 resultMap
第3天
a)mybatis动态拼接
if,where,set ,trim ,foreach, bind ,choose, sql,include
b)分页查询(传统方式,使用插件)
c)mybatis中的缓存问题
d)在mybatis中使用注解
e)mybatis的运行原理
第六节 powerDesigner 的使用
6.1 数据库建模
6.2 类与类之间的六种关系
(1)继承关系,使用的关键字为extends 【类与类,接口与子接口】
(2)实现关系 ,使用的关键字为implements [类与接口之间的关系]
(3)依赖关系,一个类(接口)作为另外一个类方法中参数来使用
(4)关联关系,一个类(接口)作为外一个类的属性使用
package com.bjsxt.entity;
import java.util.List;
public class TestOrder {
public static void main(String[] args) {
//客户想购买商品
Customer customer=new Customer();//创建客户类的对象
//创建订单类的对象
Order order=new Order();
//创建商口类的对象
Product product=new Product();
product.setProName("娃哈哈");
//下订单
order.setPro(product);//把商品放到订单的中
//客户下订单
customer.setOrder(order);
//客户查看了下订单的详细信息
System.out.println(customer.toString());
}
}
class Product{//商品类
private String proName;
public String getProName() {
return proName;
}
public void setProName(String proName) {
this.proName = proName;
}
@Override
public String toString() { //显示商品的详细信息
return "Product{" +
"proName='" + proName + '\'' +
'}';
}
}
class Order { //订单类
private Product pro; //商品类作为订单类中的属性使用(成员变量)
public Product getPro() {
return pro;
}
public void setPro(Product pro) {
this.pro = pro;
}
@Override
public String toString() { //显示订单的详细信息
return "Order{" +
"pro=" +pro.getProName() +
'}';
}
}
class Customer{ //客户类
private Order order;//订单类作为客户类的属性使用 (成员变量)
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
@Override
public String toString() { //显示订单的详细信息
return "Customer{" +
"order=" + order +
'}';
}
}
(5)聚合关系 (是关联关系的一种特例,在语法同关联关系)
部分与整体的关系,部分与整体的生命周期不同
一个类(接口)作为另外一个类成员变量(属性)
(6)组合关系 (是关联关系的一种特例,在语法同关联关系)
部门与整体的关系,部门与整体的生周生周相同
一个类(接口)作为另外一个类成员变量(属性)
六种关系在语法上有四种体现
(1)extends
(2)implements
(3)作参数
(4)作属性