自定义Mybatis selectList

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值