一、形参和实参
- 形参与实参 参数传递的是值,和名称无关
- 当mybatis传的是单值,一个对象,不是集合,mybatis就利用下标取值
二、代理模式
代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.
这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法
1.为啥会有代理对象?
自己想要一个玩意,没有,想要搞别人的
2.代理对象是干啥的?
用户调用的是接口,程序实现的接口的实现类,但是如果 接口中没有/私密实现类,导致我自己没法用,那咋整,就是靠代理对象,自己搞一个实现类
2.1那自己咋搞一个实现类????
继承或者实现
3.常见动态代理方式
3.1JDK动态代理
特点:
- 要求被代理者必须有接口,代理对象是目标对象的实现类或者兄弟类
- JDK动态代理自身提供的
3.2 CGLIB动态代理
特点:
- 不管被代理者是否有接口,都可以为其创建代理对象,代理对象是目标对象的子类
- cglib需要手动导入jar包
- spring为了创建代理对象方便,自身自动添加jar包–自动添加依赖
4.代理对象创建
接口无法直接创建对象,一旦可以直接调用方法—实例化对象,那就是自动动态生成了代理对象(至于用啥方法方式创建,具体看不同的场景)
DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
1.DeptMapper是一个接口. 接口不能直接实例化对象!!!
2.获取的DeptMapper是JDK在内部动态为接口生成的代理对象.
3.调用代理对象功能上与接口一致.
private SqlSessionFactory sqlsessionfactory;
@BeforeEach
public void sessionTest() throws Exception{
String resource = "mybatis/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlsessionfactory = new SqlSessionFactoryBuilder(). build(inputStream);
}
@Test
public void deptShowAll(){
SqlSession sqlSession = sqlsessionfactory.openSession(true);
DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
List<Dept> deptlist = deptMapper.DshowAll();
System.out.println(deptlist);
sqlSession.close();
}
4.1 如何查询他是个啥东西
.getClass()利用这个方法,获取它的…
getClass()返回Class类型的对象