public class MybatisTest {
public static void main(String[] args) throws Exception{
//读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactory工厂
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession session = ssf.openSession();
//创建Dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//执行sql语句
List<User> userLsit = userDao.findAll();
for (User user:userLsit) {
System.out.println(user);
}
//关闭流
in.close();
session.close();
}
}
这是一个Mybatis的一个入门Demo,下面将不使用mybatis的包,自定义实现上面的小案例。
分析
<configuration>
<!--mybatis的主配置文件 -->
<environments default="mysql">
<environment id="mysql">
<!-- 配置事务类型-->
<transactionManager type="JDBC" />
<!-- 配置数据源(连接池)-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/eesy"/>
<property name="username" value="root"/>
<property name="password" value="csy123"/>
</dataSource>
</environment>
</environments>
<!--指定映射文件的位置,映射配置文件是每个dao的独立配置文件-->
<mappers>
<!-- <mapper resource="cn/edu/hdu/dao/IUserDao.xml" />-->
<mapper class="cn.edu.hdu.dao.IUserDao" />
</mappers>
</configuration>
<mapper namespace="cn.edu.hdu.dao.IUserDao">
<select id="findAll" resultType="cn.edu.hdu.domain.User">
select * from user
</select>
</mapper>
必然是先读取配置文件吗,解析其中的标签,并获取标签中的内容。
(1)可以获取到的是连接数据库的四个必要条件,有了这四个条件可以创建Connection对象;
(2)可以获取mapper标签中resource或class内容,以此可以找到映射配置信息;
(3)可以获取sql语句,就可以获取PreparStatement,还有封装的全限定类名
读取配置文件用到的技术就是解析XML的技术。我将使用的是dom4j解析XML。
selectList方法
1. 根据配置文件的信息创建Connection对象(注册驱动,获得连接);
2. 获取预处理对象PrepareStatement(此时需要SQL语句),即conn.prepareStatement(sql);
3. 执行查询,即ResultSet res = preparedStatement.executeQuery();
4. 遍历结果集用于封装(下面是伪代码):
List<E> list = new ArrayList();
while(res.next()){
1)E element = (E)Class.forName(配置的全限定类名);
2)进行封装,将每个res的内容都添加到element中;(可以使用反射的方式来根据名称来获取每个属性,数据库表的列名和实体类的属性名有对应关系,处理后可以来获取)
3)把element加入到list中,即lsit.add(element);
5. 返回list(return list);
方法执行的需要的信息
1. 连接数据库的信息
2. 映射信息:
1)执行的SQL语句;
2)返回结果的实体类全限定类名
映射信息的两个信息需要封装在一个对象Mapper内,不然可能会发生返回值与返回的分装对象不对应情况
同时,一个映射配置文件会有多个SQL语句标签,这样还需要与标签中的id对应,同时还有可能出现不同的映射文件出现相同id的情况,所以采用一个map封装这些信息,key是 namespace+"."+id,值是对应的Mapper对象。
调用selectList的方法
session.getMapper(Class<T> daoInterfaceClass)来实现
根据dao接口的字节码创建dao的代理对象
public <T>T getMapper(Class<T> daoInterfaceClass){
Proxy.newProxyIntance(类加载器,代理对象要实现的接口字节码数组,具体的代理对象);
}
下面是具体的代码实现
https://github.com/samyScott/Mybatis_selectList_design