欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MyBatis开发Dao的原始Dao开发和Mapper动态代理开发

程序员文章站 2022-09-27 15:17:11
@[TOC] 使用MyBatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper动态代理开发方法。原始Dao开发中存在以下问题: Dao方法体存在重复代码:通过SqlSessionFactory创建SqlSession,调用SqlSession的数据库操作方法 调用sqlSessi ......

@
使用mybatis开发dao,通常有两个方法,即原始dao开发方法和mapper动态代理开发方法。原始dao开发中存在以下问题:
dao方法体存在重复代码:通过sqlsessionfactory创建sqlsession,调用sqlsession的数据库操作方法

调用sqlsession的数据库操作方法需要指定statement的id,这里存在硬编码,不得于开发维护。

而动态代理开发中mapper接口开发方法只需要程序员编写mapper接口(相当于dao接口),由

mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边dao接口实现类方法。

使用mapper代理的方法来开发dao时,程序员只需要干两件事即可:

1、编写mapper.xml映射文件
2、编写mapper接口(相当于dao接口)

mapper接口开发需要遵循以下四个规范(建议初学者结合下图理解)
1、mapper.xml文件中的namespace与mapper接口的类路径相同。
2、mapper接口方法名和mapper.xml中定义的每个statement的id相同
3、mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parametertype的类型相同
4、mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resulttype的类型相同

咳咳...初学者看文字(mapper接口开发四个规范)属实有点费劲,博主我就废了点劲做了如下图,方便理解:

MyBatis开发Dao的原始Dao开发和Mapper动态代理开发

原始dao开发方式

原始dao开发方法需要程序员编写dao接口和dao实现类。

1. 编写映射文件

编写映射文件如下:(也可以使用入门程序完成的映射文件)

<?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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="test">

    <!-- 根据id查询用户 -->
    <select id="queryuserbyid" parametertype="int"
        resulttype="com.gx.mybatis.pojo.user">
        select * from user where id = #{id}
    </select>

    <!-- 根据username模糊查询用户 -->
    <select id="queryuserbyusername" parametertype="string"
        resulttype="com.gx.mybatis.pojo.user">
        select * from user where username like '%${value}%'
    </select>

    <!-- 保存用户 -->
    <insert id="saveuser" parametertype="com.gx.mybatis.pojo.user">
        <selectkey keyproperty="id" keycolumn="id" order="after"
            resulttype="int">
            select last_insert_id()
        </selectkey>
        insert into user(username,birthday,sex,address)
        values(#{username},#{birthday},#{sex},#{address})
    </insert>

</mapper>

### 2. 编写dao接口

先进行dao的接口开发,编码如下:

public interface userdao {
    /**
     * 根据id查询用户
     * 
     * @param id
     * @return
     */
    user queryuserbyid(int id);

    /**
     * 根据用户名模糊查询用户
     * 
     * @param username
     * @return
     */
    list<user> queryuserbyusername(string username);

    /**
     * 保存用户
     * 
     * @param user
     */
    void saveuser(user user);
}

3.编写dao实现类

编写的dao实现类如下

public class userdaoimpl implements userdao {
    private sqlsessionfactory sqlsessionfactory;

    public userdaoimpl(sqlsessionfactory sqlsessionfactory) {
        super();
        this.sqlsessionfactory = sqlsessionfactory;
    }

    @override
    public user queryuserbyid(int id) {
        // 创建sqlsession
        sqlsession sqlsession = this.sqlsessionfactory.opensession();
        // 执行查询逻辑
        user user = sqlsession.selectone("queryuserbyid", id);
        // 释放资源
        sqlsession.close();

        return user;
    }

    @override
    public list<user> queryuserbyusername(string username) {
        // 创建sqlsession
        sqlsession sqlsession = this.sqlsessionfactory.opensession();

        // 执行查询逻辑
        list<user> list = sqlsession.selectlist("queryuserbyusername", username);
        // 释放资源
        sqlsession.close();
        return list;
    }

    @override
    public void saveuser(user user) {
        // 创建sqlsession
        sqlsession sqlsession = this.sqlsessionfactory.opensession();

        // 执行保存逻辑
        sqlsession.insert("saveuser", user);
        // 提交事务
        sqlsession.commit();
        // 释放资源
        sqlsession.close();
    }
}

4.编写dao测试

创建一个junit的测试类,对userdao进行测试(充当main方法),测试代码如下:

public class userdaotest {
    private sqlsessionfactory sqlsessionfactory;

    @before
    public void init() throws exception {
        // 创建sqlsessionfactorybuilder
        sqlsessionfactorybuilder sqlsessionfactorybuilder = new sqlsessionfactorybuilder();
        // 加载sqlmapconfig.xml配置文件
        inputstream inputstream = resources.getresourceasstream("sqlmapconfig.xml");
        // 创建sqlsessionfactory
        this.sqlsessionfactory = sqlsessionfactorybuilder.build(inputstream);
    }

    @test
    public void testqueryuserbyid() {
        // 创建dao
        userdao userdao = new userdaoimpl(this.sqlsessionfactory);
        // 执行查询
        user user = userdao.queryuserbyid(1);
        system.out.println(user);
    }

    @test
    public void testqueryuserbyusername() {
        // 创建dao

        userdao userdao = new userdaoimpl(this.sqlsessionfactory);
        // 执行查询
        list<user> list = userdao.queryuserbyusername("五");
        for (user user : list) {
            system.out.println(user);
        }
    }

    @test
    public void testsaveuser() {
        // 创建dao
        userdao userdao = new userdaoimpl(this.sqlsessionfactory);

        // 创建保存对象
        user user = new user();
        user.setusername("孙尚香肠");
        user.setbirthday(new date());
        user.setsex("1");
        user.setaddress("蜀国");
        // 执行保存
        userdao.saveuser(user);

        system.out.println(user);
    }
}

mapper动态代理方式

1.定义mapper.xml(映射文件)

定义mapper映射文件usermapper.xml
将usermapper.xml放在config下mapper目录下,效果如下:
MyBatis开发Dao的原始Dao开发和Mapper动态代理开发

2、编写usermapper.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">
<!-- namespace:命名空间,用于隔离sql -->
<!-- 还有一个很重要的作用,使用动态代理开发dao,1. namespace必须和mapper接口类路径一致 -->
<mapper namespace="com.gx.mybatis.mapper.usermapper">
    <!-- 根据用户id查询用户 -->
    <!-- 2. id必须和mapper接口方法名一致 -->
    <!-- 3. parametertype必须和接口方法参数类型一致 -->
    <!-- 4. resulttype必须和接口方法返回值类型一致 -->
    <select id="queryuserbyid" parametertype="int"
        resulttype="com.gx.mybatis.pojo.user">
        select * from user where id = #{id}
    </select>

    <!-- 根据用户名查询用户 -->
    <select id="queryuserbyusername" parametertype="string"
        resulttype="com.gx.mybatis.pojo.user">
        select * from user where username like '%${value}%'
    </select>

    <!-- 保存用户 -->
    <insert id="saveuser" parametertype="com.gx.mybatis.pojo.user">
        <selectkey keyproperty="id" keycolumn="id" order="after"
            resulttype="int">
            select last_insert_id()
        </selectkey>
        insert into user(username,birthday,sex,address) values
        (#{username},#{birthday},#{sex},#{address});
    </insert>

</mapper>

3.编写usermapper(接口文件)

创建usermapper接口代码如下:

public interface usermapper {
    /**
     * 根据id查询
     * 
     * @param id
     * @return
     */
    user queryuserbyid(int id);

    /**
     * 根据用户名查询用户
     * 
     * @param username
     * @return
     */
    list<user> queryuserbyusername(string username);

    /**
     * 保存用户
     * 
     * @param user
     */
    void saveuser(user user);
}

4.加载usermapper.xml文件

修改sqlmapconfig.xml文件,添加以下所示的内容:

    <!-- 加载映射文件 -->
    <mappers>
        <mapper resource="sqlmap/user.xml" />
        <mapper resource="mapper/usermapper.xml" />
    </mappers>

5.编写测试

编写的测试方法如下:

public class usermappertest {
    private sqlsessionfactory sqlsessionfactory;

    @before
    public void init() throws exception {
        // 创建sqlsessionfactorybuilder
        sqlsessionfactorybuilder sqlsessionfactorybuilder = new sqlsessionfactorybuilder();
        // 加载sqlmapconfig.xml配置文件
        inputstream inputstream = resources.getresourceasstream("sqlmapconfig.xml");
        // 创建sqlsessionfactory
        this.sqlsessionfactory = sqlsessionfactorybuilder.build(inputstream);
    }

    @test
    public void testqueryuserbyid() {
        // 获取sqlsession,和spring整合后由spring管理
        sqlsession sqlsession = this.sqlsessionfactory.opensession();

        // 从sqlsession中获取mapper接口的代理对象
        usermapper usermapper = sqlsession.getmapper(usermapper.class);
        // 执行查询方法
        user user = usermapper.queryuserbyid(1);
        system.out.println(user);

        // 和spring整合后由spring管理
        sqlsession.close();
    }

    @test
    public void testqueryuserbyusername() {
        // 获取sqlsession,和spring整合后由spring管理
        sqlsession sqlsession = this.sqlsessionfactory.opensession();

        // 从sqlsession中获取mapper接口的代理对象
        usermapper usermapper = sqlsession.getmapper(usermapper.class);
        // 执行查询方法
        list<user> list = usermapper.queryuserbyusername("五");
        for (user user : list) {
            system.out.println(user);
        }

        // 和spring整合后由spring管理
        sqlsession.close();
    }

    @test
    public void testsaveuser() {
        // 获取sqlsession,和spring整合后由spring管理
        sqlsession sqlsession = this.sqlsessionfactory.opensession();

        // 从sqlsession中获取mapper接口的代理对象
        usermapper usermapper = sqlsession.getmapper(usermapper.class);
        // 创建保存对象
        user user = new user();
        user.setusername("刘备胎");
        user.setbirthday(new date());
        user.setsex("2");
        user.setaddress("鼠国");
        // 执行查询方法
        usermapper.saveuser(user);
        system.out.println(user);


        // 和spring整合后由spring管理
        sqlsession.commit();
        sqlsession.close();
    }
}

如果本文对你有一点点帮助,那么请点个赞呗,谢谢~

最后,若有不足或者不正之处,欢迎指正批评,感激不尽!如果有疑问欢迎留言,绝对第一时间回复!

欢迎各位关注我的公众号,一起探讨技术,向往技术,追求技术,说好了来了就是盆友喔...

MyBatis开发Dao的原始Dao开发和Mapper动态代理开发