【MyBatis学习03】调用Mapper映射的3种使用方式

本文博客地址:http://blog.csdn.net/soonfly/article/details/63363004 (转载请注明出处)

继续延用入门实例《【MyBatis学习01】一个简单入门实例》中的例子来阐述

一、(推荐)service访问Mapper映射器接口(代理DAO)

具体实现步骤参考《【MyBatis学习01】一个简单入门实例
在service中采用sqlSession.getMapper来获取映射器,通过Mapper映射器接口方法来实现操作。

SqlSession session = SqlSessionAssist.getSession();
/*获取mapper代理接口*/
UserMapper usermapper=session.getMapper(UserMapper.class);

这种方式是我们推荐的方式。它要求遵守几个约定:

1、接口.java文件与.xml文件在同一目录下
2、在映射器配置文件mapper.xml中声明的namespace即:<mapper
namespace="twm.mybatisdemo.mapper.UserMapper">
要与mapper接口名一致
3、mapper.xml内部statement的id要与mapper.java接口方法名一致
4、输入参数类型一致
5、返回值类型一致

二、service直接访问Mapper映射器配置文件(原始DAO)

在twm.mybatisdemo.mapper包下新增加文件User2Mapper.xml。
这里写图片描述
注意,首先要在mybatis配置文件的mappers标签中增加<mapper resource="twm/mybatisdemo/mapper/User2Mapper.xml"/>
这样mybatis才能正确加载映射文件。因为这种情况不支持指定扫描加载。

User2Mapper.xml的代码和原来的UserMapper.xml完全一样,除了mapper标签的namespace属性不同,这里故意改成了
<mapper namespace="twm.mybatisdemo.mapper.User2Mapper">以区分。

User2Mapper.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="twm.mybatisdemo.mapper.User2Mapper">
    <!-- 自定义返回结果集 -->
    <resultMap id="userMap" type="twm.mybatisdemo.pojo.User">
        ...省略部分...
    </resultMap>    

    <select id="selectById" parameterType="int" resultMap="userMap">
        select * from user where id=#{id}
    </select>

    ...省略部分...

</mapper>

接下来在service中使用SqlSession访问定义在映射器配置文件User2Mapper.xml中的statement

public static void main(String[] args) throws Exception {
        SqlSession session = SqlSessionAssist.getSession();
        User aPerson;

        /*1、增加单条记录*/
        aPerson=new User("郭灭","123456", "aX3Qcs", (short)1, "济南云龙客栈", "18911110000", "guom@gulong.com");
        /*insert返回操作记录的数量,插入一条记录即为:1。*/
        session.insert("twm.mybatisdemo.mapper.User2Mapper.insert",aPerson);
        System.out.println("1、增加单条记录:插入用户["+aPerson+"]成功。");
        session.commit();/*对写操作进行提交*/

        ...省略部分...

        /*4、修改单条记录*/
        tmpuser.setAddress("锦绣山庄");
        tmpuser.setUsername("三笑将军");
        session.update("twm.mybatisdemo.mapper.User2Mapper.update",tmpuser);
        session.commit();/*提交*/
        System.out.println("4、修改单条记录:"+tmpuser+"。ID:"+tmpuser.getId());

        /*5、删除单条记录*/
        session.update("twm.mybatisdemo.mapper.User2Mapper.delete",tmpuser.getId());
        session.commit();/*提交*/
        System.out.println("5、删除单条记录:"+tmpuser);

        /*6、查询记录*/
        List<User>  userList=session.selectList("twm.mybatisdemo.mapper.User2Mapper.selectAll");
        System.out.println("6、查询记录:共找到"+userList.size()+"个用户");

        /*End:关闭mybatis会话*/
        session.close();
    }

和第一种方式比,少了书写映射器接口这一环节。
但这种方式有几个弊端:

1、调用sqlSession方法时,需要将satement的id硬编码作为参数传入,即类似于”twm.mybatisdemo.mapper.User2Mapper.update”。
2、sqlSession的方法(insert,update,selectOne等)中,要求传入的第二个参数是Object类型的(泛型),容易传错类型,IDE不会智能提示,不利于开发。

所以这种方式只是告诉大家,可以这么干,但最好不要这么干!

三、service直接访问带注解的Mapper映射器接口

使用SqlSession访问Mapper接口中用注解定义好的statement。
我们在原来的接口定义文件的目录下新增加一个接口文件User_2Mapper.java
这里写图片描述

代码如下:

public interface User_2Mapper {
    /**
     * 新增用戶
     * 
     * @param user
     * @return
     * @throws Exception
     */
    @Insert("insert into user (username,password,sex) values (#{username},#{password},#{sex}")
    public int insert_2(User user) throws Exception;


    /**
     * 根据id查询用户信息
     * 
     * @param id
     * @return
     * @throws Exception
     */
    @Select("select * from user where id=#{id}")
    public User selectById_2(int id) throws Exception;  
}

在Service中访问:

public static void main(String[] args) throws Exception {
        SqlSession session = SqlSessionAssist.getSession();
        User aPerson;

        /*1、增加单条记录*/
        aPerson=new User("孙济城","123456", "aX3Qcs", (short)1, "济南云龙客栈", "18911110000", "guom@gulong.com");
        /*insert返回操作记录的数量,插入一条记录即为:1。*/
        session.insert("twm.mybatisdemo.mapper.User_2Mapper.insert_2",aPerson);
        session.commit();
        System.out.println("1、增加单条记录:插入用户["+aPerson+"]成功。");



        /*2、读取单条记录*/
        User tmpuser=session.selectOne("twm.mybatisdemo.mapper.User_2Mapper.selectById_2", 1);
        System.out.println(tmpuser==null?"null":"2、读取单条记录:"+tmpuser+"。ID:"+tmpuser.getId());

        session.close();

}

这种方式是上面两种的综合,好处有:

1、文件数量减少,不需要维护xml 2、service通过接口方式访问,方法参数是限定类型,可智能提醒,可降低开发期错误

本文博客地址:http://blog.csdn.net/soonfly/article/details/63363004 (转载请注明出处)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 是一款使用 XML 或注解配置的持久层框架,它可以自动化地将数据库中的数据映射Java 对象中。在 MyBatis 中,mappermapper.xml 是配对使用的,其中 mapper 是接口,而 mapper.xml 是映射配置文件。 mapper 接口中定义了数据库操作的方法,而 mapper.xml 中则定义了这些方法的 SQL 语句以及参数映射规则、结果集映射规则等。 下面是一个简单的例子: 1. 定义 mapper 接口 ```java public interface UserMapper { User selectUserById(Integer id); } ``` 2. 定义 mapper.xml 映射配置文件 ```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.example.UserMapper"> <resultMap id="userResultMap" type="com.example.User"> <id column="id" property="id"/> <result column="username" property="username"/> <result column="password" property="password"/> </resultMap> <select id="selectUserById" resultMap="userResultMap"> SELECT * FROM user WHERE id = #{id} </select> </mapper> ``` 上述代码中,namespace 属性指定了 mapper 接口的全限定名,resultMap 标签定义了一个结果集映射规则,select 标签定义了一个查询操作,其中 id 属性指定了 mapper 接口中的方法名,resultMap 属性指定了结果集映射规则的 id。 3. 在 MyBatis 配置文件中引入 mapper.xml ```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> <mappers> <mapper resource="com/example/UserMapper.xml"/> </mappers> </configuration> ``` 上述代码中,mapper 标签指定了映射配置文件的位置。 这样就完成了 mappermapper.xml 的配置。在代码中调用 selectUserById 方法时,MyBatis 会根据 mapper.xml 中的配置自动生成 SQL 语句,并将查询结果映射到 User 对象中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值