Mybatis开发dao的方法--原始dao篇

下面的SqlSession使用范围 
4.1 SqlSession使用范围 
4.1.1 SqlSessionFactoryBuilder 
通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory 
将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。 
在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。 
4.1.2 SqlSessionFactory 
通过SqlSessionFactory创建SqlSession,使用单例模式管理sqlSessionFactory(工厂一旦创建,使用一个实例)。 
将来mybatis和spring整合后,使用单例模式管理sqlSessionFactory。 
4.1.3 SqlSession 
SqlSession是一个面向用户(程序员)的接口。 
SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)、selectList(返回单个或多个对象)。 
SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。 
SqlSession最佳应用场合在方法体内,定义成局部变量使用。

 

原始Dao开发Mybatis

ResourceDao接口

    public interface ResourceDao {
        int deleteByPrimaryKey(String resourceId);

        int insert(Resource record);

        Resource selectByPrimaryKey(String resourceId);

        int updateByPrimaryKey(Resource record);

    }
ResourceDao接口实现类

public class ResourceDaoImpl implements ResourceDao {
    private SqlSessionFactory sqlSessionFactory;

    public ResourceDaoImpl(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }

    @Override
    public int deleteByPrimaryKey(String resourceId) {
        SqlSession sqlSession = null;
        int rs = 0;
        try {
            sqlSession = sqlSessionFactory.openSession();
            rs = sqlSession.delete("com.pingan.hdht.dao.ResourceMapper.deleteByPrimaryKey", resourceId);//第一个参数为命名空间加上statement的id
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }

        return rs;
    }

    @Override
    public int insert(Resource record) {
        SqlSession sqlSession = null;
        int rs = 0;
        try {
            sqlSession = sqlSessionFactory.openSession();
            rs = sqlSession.insert("com.pingan.hdht.dao.ResourceMapper.insert", record);//第一个参数为命名空间加上statement的id
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }

        return rs;
    }

    @Override
    public Resource selectByPrimaryKey(String resourceId) {
        SqlSession sqlSession = null;
        Resource rs = null;
        try {
            sqlSession = sqlSessionFactory.openSession();
            rs = sqlSession.selectOne("com.pingan.hdht.dao.ResourceMapper.selectByPrimaryKey", resourceId);//第一个参数为命名空间加上statement的id
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }

        return rs;
    }

    @Override
    public int updateByPrimaryKey(Resource record) {
        SqlSession sqlSession = null;
        int rs = 0;
        try {
            sqlSession = sqlSessionFactory.openSession();
            rs = sqlSession.update("com.pingan.hdht.dao.ResourceMapper.insert", record);//第一个参数为命名空间加上statement的id
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }

        return rs;
    }

测试实例就以根据主键查询为实例来介绍,其他增删改类似

public class ResourceDaoImplTest {
    private static SqlSessionFactory sqlSessionFactory = null;

    /**
     * <p>
     * 行为描述:
     * 状态转变:
     * 定义的算法:
     * 操作系统/硬件依赖:
     * 允许的实现变化:
     * 安全约束:
     * </p>
     * @param
     * @return
     * @throws
     * @see
     * @since %I%
     */
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        //mybatis配置文件
        String resource = "SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂,传递mybatis的配置文件信息
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    @Test
    public void testSelectByPrimaryKey() {
        ResourceDao resourceDao = new ResourceDaoImpl(sqlSessionFactory);
        Resource resource = resourceDao.selectByPrimaryKey("1");
        System.out.println(resource.getResourceDesc());
    }

}

运行结果如下 
这里写图片描述 
以上就是Mybatis开发dao的方法–原始dao开发的方式

下面我们用mybatis的最新实现方式   ----------Mybatis开发的dao方法-Mapper代理

 

代码以及实现

Mapper代理的方式有一定的规范需要遵守 
我们的*Mapper.xml中的namespace要配置为ResourceMapper.java的全限定名如下: 
ResourceMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.pingan.hdht.dao.ResourceMapper" >
  <resultMap id="BaseResultMap" type="com.pingan.hdht.model.Resource" >
    <id column="RESOURCE_ID" property="resourceId" jdbcType="VARCHAR" />
    <result column="RESOURCE_TYPE" property="resourceType" jdbcType="VARCHAR" />
    <result column="RESOURCE_NAME" property="resourceName" jdbcType="VARCHAR" />
    <result column="RESOURCE_DESC" property="resourceDesc" jdbcType="VARCHAR" />
    <result column="RESOURCE_PATH" property="resourcePath" jdbcType="VARCHAR" />
    <result column="ENABLE" property="enable" jdbcType="SMALLINT" />
    <result column="PARENT_ID" property="parentId" jdbcType="VARCHAR" />
  </resultMap>
  <sql id="Base_Column_List" >
    RESOURCE_ID, RESOURCE_TYPE, RESOURCE_NAME, RESOURCE_DESC, RESOURCE_PATH, ENABLE, 
    PARENT_ID
  </sql>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" >
    select 
    <include refid="Base_Column_List" />
    from SHHD_RESOURCES
    where RESOURCE_ID = #{resourceId,jdbcType=VARCHAR}
  </select>
</mapper>

 

ResourceMapper

public interface ResourceMapper {


    Resource selectByPrimaryKey(String resourceId);

}
SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 和spring整合后 environments配置将废除-->
    <environments default="development">
        <environment id="development">
        <!-- 使用jdbc事务管理,事务由mybatis管理 -->
            <transactionManager type="JDBC" />
        <!-- 数据库连接池,由mybatis管理 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://10.20.22.211:3306/activity" />
                <property name="username" value="root" />
                <property name="password" value="mysql123" />
            </dataSource>
        </environment>
    </environments>
    <!--加载映射文件 -->
    <mappers>
        <mapper resource="sqlmap/ResourceMapper.xml"/>
    </mappers>

</configuration>
单元测试类

package com.pingan.hdht.dao;

import java.io.InputStream;

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 org.junit.BeforeClass;
import org.junit.Test;

import com.pingan.hdht.model.Resource;

/**
 * <p>
 * 概要信息:
 * 状态信息: 
 * 操作系统/硬件依赖/应用时可能存在的差异: 
 * 安全约束: 
 * 序列化格式: 
 * 参考的外部规格说明: 
 * </p>
 *
 * <p>
 * 版权: ©2016 中国平安保险(集团)股份有限公司 版权所有
 * </p>
 * 
 * @author gaoyunqi745
 * @version %I%, %G%
 */
public class ResourceDaoImplTest {
    private static SqlSessionFactory sqlSessionFactory = null;

    /**
     * <p>
     * 行为描述:
     * 状态转变:
     * 定义的算法:
     * 操作系统/硬件依赖:
     * 允许的实现变化:
     * 安全约束:
     * </p>
     * @param
     * @return
     * @throws
     * @see
     * @since %I%
     */
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        //mybatis配置文件
        String resource = "SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂,传递mybatis的配置文件信息
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }


    @Test
    public void testMapperSelectByPrimaryKey() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        ResourceMapper resourceMapper = sqlSession.getMapper(ResourceMapper.class);
        Resource resource = resourceMapper.selectByPrimaryKey("1");
        System.out.println(resource.getResourceDesc());
    }
}

运行效果 
这里写图片描述

 

 

posted @ 2017-10-17 15:38  技术专家  阅读(178)  评论(0)    收藏  举报