Skip to content

7.Mapper代理的形式开发

跟原生SQLSession接口一样需要搭建myabtis,

7.1 添加加依赖

7.2 创建SqlMapConfig.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>

    <properties resource="jdbc.properties"/>

    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="UNPOOLED">
                <property name="username"   value="${jdbc.username}"/>
                <property name="password"   value="${jdbc.password}"/>
                <property name="url"        value="${jdbc.url}"/>
                <property name="driver"     value="${jdbc.driver}"/>
            </dataSource>
        </environment>
    </environments>



    <mappers>
        <mapper resource="UploadFilesMapper.xml"></mapper>
    </mappers>

</configuration>

7.3 定义Mapper代理对象的接口

java
package com.neuedu.dao;

import com.neuedu.entity.UploadFile;
import com.neuedu.util.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;

import java.util.List;
import java.util.Map;

public interface UploadFilesMapper {


    /**
     * 查询集合
     *
     * @return
     */

    /**
     *  com.neuedu.dao.UploadFilesDao.selectListofEntity
     * @return
     */
    public List<UploadFile> selectListofEntity();


    /**
     * com.neuedu.dao.UploadFilesDao.selectById
     * @param id
     * @return
     */
    public UploadFile selectById(Integer id);

    public int selectCount();

    public int save(UploadFile uploadFile);

    public int update(UploadFile uploadFile);
    
    public int deleteById(Integer id);
}

7.4 编写Mapper映射文件

编写(UploadFilesMapper.xml)

  1. namespace为Mapper接口的全限定名
  2. 方法上:
    1. 方法名 跟 Mapperd Statement id保持一致
    2. 方法入参 跟Statement 的入参一致
    3. 返回值类型如果是集合List,否则是其他类型

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.neuedu.dao.UploadFilesMapper">

    <resultMap id="resultMap" type="com.neuedu.entity.UploadFile">
        <!--        <id column="id" property="id" jdbcType="int"  javaType="Integer"></id>-->
        <id property="id" column="id"></id>
        <result property="originName" column="origin_name"></result>
        <result property="path" column="path"></result>
        <result property="size" column="size"></result>
        <result property="ip" column="ip"></result>
        <result property="uploadTime" column="upload_time"></result>
    </resultMap>


    <!--使用 Entity 如果 字段跟属性名称不一致,set无效,需要有一个机制,转换 -->
    <select id="selectListofEntity" resultMap="resultMap">
            select * from upload_files
    </select>


    <!--    根据主键查询一条 selectOne-->
    <select id="selectById" resultMap="resultMap" parameterType="int">
            select * from upload_files where id = #{id}
    </select>


    <!--    查询总条数-->
    <select id="selectCount" resultType="int">
            select count(1) from upload_files
    </select>


    <!-- 插入数据-->
    <insert id="save" parameterType="com.neuedu.entity.UploadFile">
         INSERT INTO upload_files (  origin_name,  path, upload_time, size,  ip  )
            VALUES   (  #{originName},  #{path},  #{uploadTime},  #{size},  #{ip}  )
    </insert>



    <!--    更新数据-->
    <update id="update" parameterType="com.neuedu.entity.UploadFile">
        UPDATE
          upload_files
        SET
          origin_name= #{originName},
          path= #{path},
          upload_time= #{uploadTime},
          size= #{size},
          ip= #{ip}
        WHERE id= #{id}

    </update>

    <!--    根据主键删除数据-->
    <delete id="deleteById" parameterType="int">
        delete from upload_files where id = #{id}
    </delete>

</mapper>

7.5 编写的Mapper.xml配置到SqlMapConfig.xml中

使用的是resource属性配置资源映射

<mappers>
<mapper resource="UploadFilesMapper.xml"></mapper>
</mappers>

7.6. 单元测试

java
package com.neuedu.dao;

import com.neuedu.dao.UploadFilesMapper;
import com.neuedu.entity.UploadFile;
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.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

import static org.junit.Assert.*;

public class UploadFilesMapperTest {



    SqlSessionFactory sqlSessionFactory;


    @Before
    public void setup() throws IOException {

        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    }



    @Test
    public void selectListofEntity() {
        SqlSession session = sqlSessionFactory.openSession();
        UploadFilesMapper uploadFilesMapper = session.getMapper(UploadFilesMapper.class); //通过mybatis产生一个 代理对象
        List<UploadFile> list = uploadFilesMapper.selectListofEntity();
        for (UploadFile o : list) {
            System.out.println(o);
        }
    }

    @Test
    public void selectById() {
        SqlSession session = sqlSessionFactory.openSession();
        UploadFilesMapper UploadFilesMapper = session.getMapper(UploadFilesMapper.class); //通过mybatis产生一个 代理对象
        Integer id = 17;
        System.out.println(UploadFilesMapper.selectById(id));
    }

    @Test
    public void selectCount() {
        SqlSession session = sqlSessionFactory.openSession();
        UploadFilesMapper UploadFilesMapper = session.getMapper(UploadFilesMapper.class); //通过mybatis产生一个 代理对象
        int count = UploadFilesMapper.selectCount();
        System.out.println("count = " + count);
    }

    @Test
    public void save() {
        SqlSession session = sqlSessionFactory.openSession();
        UploadFilesMapper UploadFilesMapper = session.getMapper(UploadFilesMapper.class); //通过mybatis产生一个 代理对象
        UploadFile uploadFile = new UploadFile();

        uploadFile.setOriginName("考试成绩.xls");
        uploadFile.setPath("asdofuhsaofhsadofhsaofjshUploadFilesMapperp.xls");
        uploadFile.setUploadTime(new Date());
        uploadFile.setIp("127.0.0.1");
        uploadFile.setSize(500L);

        int count  = UploadFilesMapper.save(uploadFile);


        System.out.println("count = " + count);


    }

    @Test
    public void update() {
        SqlSession session = sqlSessionFactory.openSession();
        UploadFilesMapper UploadFilesMapper = session.getMapper(UploadFilesMapper.class); //通过mybatis产生一个 代理对象
        Integer id = 17;

        UploadFile uploadFile = UploadFilesMapper.selectById(id);
        System.out.println("update before :  "+uploadFile);

        uploadFile.setOriginName(uploadFile.getOriginName()+"-2021年3月22日16:19:14");
        int count = UploadFilesMapper.update(uploadFile);
        uploadFile = UploadFilesMapper.selectById(id);
        System.out.println("count = " + count);
        System.out.println("update after :  "+uploadFile);
    }

    @Test
    public void deleteById() {
        SqlSession session = sqlSessionFactory.openSession();
        UploadFilesMapper UploadFilesMapper = session.getMapper(UploadFilesMapper.class); //通过mybatis产生一个 代理对象
        Integer id = 18;
        int count =  UploadFilesMapper.deleteById(id);
        System.out.println("count = " + count);
    }
}

7.7 使用Class 映射Mapper

​ 在SqlMapConfig中使用class 映射Mapper 需要满足如下条件:

  1. mapper.xml中namespace为Mapper接口的全限定名一致
  2. Mapper.xml和Mapper.java文件名称保持一致(扩展名除外,xml、java)
  3. Mapper.xml和Mapper.java编译的目标位置相同
xml
<mappers>
    <!--使用Class映射的Mapper  -->
    <mapper class="com.neuedu.dao.UploadFilesMapper"/>
</mappers>

7.8 使用package扫描

同class注册Mapper的要求是一样的

xml
<mappers>
    <package name="com.neuedu.dao"/>
</mappers>

Released under the MIT License.