5、基于Mapper接口下的数据操作

5.1、概述

在 mybatis 中 dao 层的接口名字不推荐使用Dao,而是修改成Mapper,例如 UserDao 修改成 UserMapper

由于在 dao(mapper)的实现类中对 sqlsession 的使用方式很类似。mybatis 提供了接口的动态代理

5.2、动态Mapper接口的注意事项

1.将dao包更改命名为com.luke.mapper(可选)

2.将接口也改为xxMapper的形式(可选)

3.删除所有的dao类实现类(必须)因为此时我们是通过动态代理的方式来生产其操作类

4.将映射文件放在mapper包下,并且将该映射文件名更改为接口的名字.xml

mapper.xml

namespace:

根标签的 namespace 属性称为名称空间,如果希望使用 mybatis 通过的动态代理的接口,就需要 namespace 中的值,和需要对应的Mapper(dao)接口的全路径一致

Mapper中namespace定义本身没有限制,只要不重复即可,但是如果要想使用Mybatis提供的动态代理,namespace必须为dao接口的全路径

5.注意此时还需要保证我们接口中的方法名和配置文件中的id名称保持一致

5.3、具体操作

mapper接口

package com.luke.mapper;
import com.luke.pojo.User;
import java.util.List;
public interface UserMapper {
    public int insertUser(User vo) throws Exception;
    public int updateUser(User user) throws Exception;
    public int deleteUserById(Long id) throws Exception;
    public Integer selectCount() throws Exception;
    public User queryUserById(Long id) throws Exception;
    public List<User> queryAllUser() throws Exception;
}

测试类:

package com.luke.test;
import com.luke.mapper.UserMapper;
import com.luke.pojo.User;
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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

public class TestMyBatis {
    private UserMapper userMapper ;
    private SqlSession sqlsession;
    @Before
    public void setUp() throws Exception {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        sqlsession = sqlSessionFactory.openSession();
        userMapper = sqlsession.getMapper(UserMapper.class);

    }
    @After
    public void tearDown() throws Exception {
        sqlsession.close();
    }
    @Test
    public void testInsertUser() throws Exception {
        Date birthday = new Date();
        User user = new User( "关羽3", "123456", 15, "男", birthday);
        int result=-1;
        try {
            result = userMapper.insertUser(user);
            sqlsession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlsession.rollback();
        }
        System.out.println(result);
    }

    @Test
    public void testUpdateUser() throws Exception {
        Date birthday = new Date();
        User user = new User( 6,"关羽2", "123456", 15, "男", birthday);
        int result=-1;
        try {
            result = userMapper.updateUser(user);
            sqlsession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlsession.rollback();
        }
        System.out.println(result);
    }

    @Test
    public void testDeleteUserById() throws Exception {
        int result=-1;
        try {
            result = userMapper.deleteUserById(6l);
            sqlsession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlsession.rollback();
        }
        System.out.println(result);
    }

    @Test
    public void testSelectCount() throws Exception {
        int result=-1;
        try {
            result = userMapper.selectCount();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            sqlsession.close();
        }
        System.out.println(result);
    }


    @Test
    public void testQueryAll() throws Exception {
        List<User> list = null ;
        try {
            list = userMapper.queryAllUser();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            sqlsession.close();
        }
        for (User u:list){
            System.out.println(u);
        }
    }



    @Test
    public void testQueryUserById() throws Exception {
        User user = null ;
        try {

            user = userMapper.queryUserById(3l);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            sqlsession.close();
        }
        System.out.println(user);
    }

}

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:命名空間 (保证唯一)
-->
<mapper namespace="com.luke.mapper.UserMapper">
    <insert id="insertUser" parameterType="hello">
        insert into tb_user (userid,user_name,pwd,age,sex,birthday)
        values(seq_user.nextval,#{userName},#{pwd},#{age},#{sex},#{birthday})
    </insert>


    <update id="updateUser" parameterType="hello">
        update tb_user set user_name=#{userName},pwd=#{pwd},age=#{age},sex=#{sex},birthday=#{birthday}
        where userid=#{userid}
    </update>

    <delete id="deleteUserById" parameterType="long">
        delete from tb_user where userid=#{userid}
    </delete>

    <select id="selectCount" resultType="int">
        select count(*) from tb_user
    </select>

    <select id="queryAllUser" resultType="hello">
        select USERID,
                USER_NAME,
                PWD,
                AGE,
                SEX,
                BIRTHDAY
        from tb_user
    </select>

    <select id="queryUserById" resultType="hello">
        select  USERID,
                USER_NAME,
                PWD,
                AGE,
                SEX,
                BIRTHDAY
        from tb_user where userid = #{userid}
    </select>
</mapper>

mybatis-config.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>

    <properties resource="db.properties"></properties>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!--设置别名-->
    <typeAliases>
        <!--单一配置
        <typeAlias type="com.luke.pojo.User" alias="User"></typeAlias>
        -->
        <package name="com.luke.pojo"></package>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${db.driverClassName}"/>
                <property name="url" value="${db.url}"/>
                <property name="username" value="${db.username}"/>
                <property name="password" value="${db.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/luke/mapper/UserMapper.xml"></mapper>
    </mappers>
</configuration>

5.4、动态代理方式总结

使用Mapper接口不用写接口实现类即可完成数据操作,使用非常简单,也是官方推荐的方式,使用Mapper接口也必须具备以下几个条件

1.Mapper的namespace必须和mapper接口的全路径保持一致

2.Mapper接口的方法名必须和 sql定义的id一致

3.Mapper接口中的输出参数类型必须和sql定义的resultType一致

posted @ 2021-04-21 11:29  Mirindasky  阅读(198)  评论(0编辑  收藏  举报