今日内容
- 自定义数据库连接池
- mybatis
自定义数据库连接池
- 实现DataSource 接口(这是JDBC定义的规范)
- 用什么来存储连接(Connection) ,list
- 什么时候创建链接存放到DataSource集合里面
- 如何从自定义连接池中获取链接,getConnection
- 关闭链接不是真正断开链接,而是归还到结合中去
装饰者模式
-
作用:在不改变原有类的情况下增强原有类的功能
- 原有类:A
- LoggingA:装饰着类
-
KTV: 唱歌
-
HeimaKTV:实现了KTV的基础功能,有唱歌功能
-
需求:除了基本的唱歌功能,还需要灯光效果(不改变原有类代码)
- 继承
- 装饰
-
装饰:
- 本地不变还是KTV(实现KTV规范)
- 需要基础KTV属性字段
- 添加灯光效果
-
总结:
- 装饰着以及被装饰着类型不变
适配器模式
-
作用:使两个没有关系的类可以协同工作
例如:
package com.itheima.test3; //定义一个运动接口 public interface Sports { //一个运动方法 void sport(); }
package com.itheima.test3; //定义了一个锻炼类,但是没有实现运动类 public class SportsExercise { //定义了一个锻炼方法 public void sportExercise(){ System.out.println("多人运动"); } }
以上两者之间没有任何联系,可以使用适配器模式将两个类联系在一起。
实现方法
package com.itheima.test3; //定义一个中间类,继承锻炼类,同时也继承运动类 public class Adapter extends SportsExercise implements Sports { //重写运动方法 @Override public void sport() { sportExercise(); } }
package com.itheima.test2; //定义一个时间管理大师类 public class TimeManagerMaster { //定义一个运动变量 private Sports sports; //通过构造方法赋值 public TimeManagerMaster(Sports sports) { this.sports = sports; } public void sport(){ //调用运动方法 sports.sport(); } }
-
结果:
package com.itheima.test3; public class Test { public static void main(String[] args) { TimeManageMaster master = new TimeManageMaster(new Adapter()); master.sport(); //输出内容: 多人运动 } }
-
动态代理模式
- 代理出来的对象和原本被代理对象没有任何关系, 只不过他们都有相同接口
- 如果遇到不想增强的方法那么我们可以利用反射调用被代理对象的方法(这才是产生关联的原因)
package com.itheima.test4;
//定义一个学生类的接口
public interface StudentInterface {
//吃的方法
void eat(String food);
//学习方法
void study();
}
package com.itheima.test4;
//学生类实现学生接口
public class Student implements StudentInterface {
//重写方法
public void eat(String food){
System.out.println("学生吃:"+food);
}
//重写方法
public void study(){
System.out.println("在家学习");
}
}
package com.itheima.test4;
import com.sun.xml.internal.ws.transport.http.WSHTTPConnection;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.eat("米饭"); //学生吃:米饭
student.study();//在家学习
/*
参数1:sLoader:传入要代理对象的类加载器 xxxx.getClass.getClassLoader()
参数2:Class数组:将代理对象的接口传入到Class数组中
参数3:是一个接口固定 new InvocationHandler()被代理对象的每一个方法都会经过这个接口重写接口中的invoke方法
参数1 Object proxy对象
参数2 Method method 执行的每个方法
参数3 Object[] args 是一个数组,也就是被代理对象中的方法参数
*/
StudentInterface studentInterface= (StudentInterface) Proxy.newProxyInstance(student.getClass().getClassLoader(), new Class[]{StudentInterface.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/*
对方法进行判断,如果是学习方法,就换成在学校学习,其它的不变
*/
if(method.getName().equals("study")){
System.out.println("在学校学习");
return null;
}else {
Object invoke = method.invoke(student, args);
return invoke;
}
}
});
studentInterface.eat("米饭");
studentInterface.study();
}
}
Mybaits
- 作用:就是JDBC代码进行封装
orm
- 数据库表结构== 实体类
- 表字段 == 成员变量(属性)
- 表的一行记录 == 创建的一个对象
Mybatis Hello word
- 导包
- 定义全局配置文件
- 定义数据库连接信息(定义数据库连接池)
- 加载SQL映射文件
- SQL映射文件
- 编写Java代码
- 加载配置文件
- Resources.getResourceAsStream(“核心配置文件”)
- 创建工厂类SqlSessionFactoryBuilder().Builder()—>得到会话工厂类SqlSessionFactory
- 通过工厂类获取会话对象 SqlSeeionFactory.openSession()->SqlSeesion
- 加载配置文件
- mybatis当中所有的信息基本上都和Configuration对象关联
ResourceAPI
-
作用:就是加载配置文件为InputStream,底层实现实际上就是利用ClassLoader.getResourceAsStream()
//读取配置文件 InputStream is = Resources.getResourceAsStream("Mybatis.xml");
SqlSessionFactoryBuilder
- 作用:主要解析配置文件,然后构建SQLSessionFactory
//创建工厂类 is就是上面读取的核心配置文件信息
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
SessionFactory
- openSession():创建SQLSession并且默认不会自动提交事务
- openSession(true):如果bool为true事务自动提交
//获得SqlSession 执行增删改的操作需要手动提交事务
SqlSession sqlSession = sessionFactory.openSession();
//获得SqlSession 如果是true就自动提交事务
SqlSession sqlSession = sessionFactory.openSession(true);
SQLSession
- 增删改
- 查询
- selectList —>查询的结果返回的是一个List集合,每个元素就是一个记录,也就是一个对象
- SelectOne —>查询的是一条记录,返回的就是一条记录,也就是一个对象
Mapper标签(映射配置文件)
- 属性:namespace ,理解为包名
Select 标签
属性:
- id -->可以理解为名字
- resultType —>查询后的结果的类型(如结果是一个List(Object),内容还是写List中元素的类型)
- parameterType—>参数的类型
- 标签体---->执行的SQL语句
Insert 标签
- 注意:
- 返回值类型可以胜率,默认整型
- 如果参数类型为引用数据类型,直接写属性名称即可
- 事务默认不是自动提交
- 手动提交SQLSession.commit()
- 创建SqlSession如果true就不用手动提交
<!-- 新增一个对象 -->
<insert id="addStudent" parameterType="com.itheima.domain.Student">
<!-- Mybatis中占位符是#{name} -->
insert into student values (null,#{name},#{age})
</insert>