动态代理以及主要类的介绍

1
2
3
4
5
6
7
8
9
10
11
12
//获取配置文件
InputStream in= Resources.class.getResourceAsStream(config);
//创建sqlsessionFactory对象
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//创建sqlsessionfactory对象,重量级对象,程序创建一个对象耗时比较长,使用资源比较多
SqlSessionFactory factory=builder.build(in);
//获取sqlsession对象,从中获取sqlsession,SqlSession session= factory.openSession(true);表示事务可以自动提交
SqlSession session= factory.openSession();
//指定执行语句的表示,sql映射文件的namespace+.+id
String sqlId="com.zss.dao.StudentDAO"+"."+"selectStudents";
//执行sql语句,同时还拥有许多的数据库接口方法,不是线程安全的,在方法内部使用,在执行语句之前,需要进行关闭,这样保证是线程安全的
List<Student> studentList=session.selectList(sqlId);

工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package utils;

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.InputStream;

/**
* @author zss
*/
public class MyBaitsUtils {
//获取sqlsession,静态代码块只执行一次,所以我们重量级的类放入到静态代码块中即可
private static SqlSessionFactory sqlSessionFactory;
static {
String config= "/mybaits.xml";
InputStream in= Resources.class.getResourceAsStream(config);
sqlSessionFactory=new SqlSessionFactoryBuilder().build(in);
}

public static SqlSession getSqlSession(){
SqlSession sqlSession=null;
if (sqlSessionFactory!=null){
sqlSession=sqlSessionFactory.openSession();
}
return sqlSession;
}
}

动态代理

条件分析

我们可以发现有了工具类,但是整个过程还是拥有许多的重复代码,而真正改变的只是,即我们的执行的sqlId与执行的方法

1
2
String sqlId="com.zss.dao.StudentDAO"+"."+"selectStudents";
List<Student> studentList=session.selectList(sqlId);

而且同时我们查看xml文件,这些值均可以在xml文件获取得到,而并非是我们手写

1
2
3
4
5
6
7
8
<mapper namespace="com.zss.dao.StudentDAO">
<select id="selectStudents" resultType="com.zss.pojo.Student">
select * from student order by id;
</select>
<insert id="insertStudent" >
insert into student values (#{id},#{name},#{email},#{age})
</insert>
</mapper>

同时我们也可以通过dao方法的返回值,判断是哪一种方法

mybaits动态代理

mubaits根据dao的方法调用,执行获取sql语句的信息,mybaits根据你dao接口,创建一个dao接口的实现类,并创建这个类的对象,完成sqlSession的调用,访问数据库

也就是说,dao的实现方法并不需要我们进行完成了,而是mybaits进行完成

1
2
3
4
5
6
public static void main( String[] args ) throws IOException {
SqlSession sqlSession= MyBaitsUtils.getSqlSession();
StudentDAO dao=sqlSession.getMapper(StudentDAO.class);
List<Student> studentList=dao.selectStudents();
System.out.println(studentList);
}

动态代理会帮助我们创建一个实现类,而不需要我们手动创建

插眼,动态代理懂