框架mybatis通过mapper接口加载sql映射文件

Posted 念奕玥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了框架mybatis通过mapper接口加载sql映射文件相关的知识,希望对你有一定的参考价值。

还是以之前入门例子,通过xml文件加载映射为例,数据表相同。
新建maven工程,配置好mybatis-config.xml文件,日志属性配置log4.properties等。
在这里插入图片描述

其中,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"/>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--连接数据库的四个基本信息-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.user}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
<!--        扫描整个包中的内容,免去通过resources一个个添加的麻烦-->
<!--        <mapper resource="mapper/stuMapper.xml"/>-->
        <package name="com.gy.mapper"/>
    </mappers>
</configuration>

创建JavaBean实体类与之前也相同。
新建mapper文件夹,编写mapper接口。

/**
 * StuMapper接口
 */
public interface stuMapper {
    //查询所有用户
    List<Student> selectAllStu();
    //根据id查询用户
    Student selectStuById(Integer id);
    //根据用户名模糊查询用户列表
    List<Student> selectStuByName(String userName);
    //添加用户
    Integer insertStu(Student user);
    //修改用户信息
    Integer updateStu(Student user);
    //删除用户
    Integer deleteStu(Integer id);
}

sql映射文件:
在resources目录下,新建文件夹:com/gy/mapper。中间不能是 . 号。否则可能会报Invalid bound statement (not found)错误(找不到对应的SQL标签)
在使用resultType的时候,前提是数据库表中的字段名和表对应实体类的属性名称一致才行(包括驼峰原则),但是在平时的开发中,表中的字段名和表对应实体类的属性名称往往不一定都是完全相同的,这样就会导致数据映射不成功,从而查询不到数据。那为了解决这个问题,需要使用resultMap,通过resultMap将字段名和属性名作一个对应关系。
编写映射文件的注意事项:

  • XML文件名的命名必须和Mapper接口名称相同。
  • SQL映射文件中命名空间namespace必须对应Mapper接口的全限定类名。
  • 增删改查元素中的id与Mapper接口中的方法必须对应。
  • parameterType的类型必须和Mapper接口方法的输入参数类型相同(有时可以省略)。
  • resultType的类型必须和Mapper接口方法的输出参数类型相同。
<?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标签是当前配置文件的根标签 -->
<mapper  namespace="com.gy.mapper.stuMapper">
    <!-- 配置查询结果的列名和实体类的属性名的对应关系 -->
    <!--id:唯一标识,type:需要映射的java类型-->
    <resultMap id="StuMap" type="com.gy.entity.Student">
        <!-- 与主键字段的对应,property对应实体属性,column对应表字段 -->
        <id property="StuId" column="id"/>
        <!-- 与非主键字段的对应,property对应实体属性,column对应表字段 -->
        <result property="StuName" column="Stuname"/>
        <result property="StuAge" column="age"/>
    </resultMap>
<!--    查询所有学生的信息-->
    <select id="selectAllStu" resultType="com.gy.entity.Student">
        select * from stuinfo;
    </select>
<!--    通过id来查询一个学生-->
    <select id="selectStuById" parameterType="int"
            resultType="com.gy.entity.Student">
        select * from stuinfo where id=#{id};
    </select>
    <!-- 模糊查询,根据stuName字段查询用户-->
    <select id="selectStuByName" parameterType="string"
            resultType="com.gy.entity.Student">
        select * from stuinfo where stuName like '%${value}%';
    </select>
    <!-- 添加学生-->
    <insert id="insertStu" parameterType="com.gy.entity.Student">
        insert into stuinfo(stuName,age) values (#{stuName},#{age});
    </insert>
    <!-- 根据Id更新学生信息 -->
    <update id="updateStu" parameterType="com.gy.entity.Student">
        update stuinfo set stuName = #{stuName},age=#{age} where id = #{id};
    </update>
    <!-- 根据Id删除学生 -->
    <delete id="deleteStu" parameterType="int">
        delete from stuinfo where id = #{id}
    </delete>
</mapper>

测试一下:

public class StudentTest {
    SqlSession sqlSession = null;
    //定义 StuMapper对象
    private stuMapper mapper = null;
    @Before
    public void getSqlSession() {
        //加载 mybatis 全局配置文件
        InputStream is = StudentTest.class.getClassLoader().getResourceAsStream(
                "mybatis-config.xml");
        //创建 SqlSessionFactory 对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //根据 sqlSessionFactory 产生 session
        sqlSession = sqlSessionFactory.openSession();
        //4、创建Mapper接口的的代理对象,getMapper方法底层会通过动态代理生成StuMapper的代理实现类
        mapper = sqlSession.getMapper(stuMapper.class);
    }
    @After//在测试方法执行完成之后执行,也有提交事务和关闭资源
    public void destroy() throws IOException {
        sqlSession.commit();
        sqlSession.close();
    }
    //查询所有用户数据
    @Test
    public void testSelectAllUser() {
        List<Student> listUser = mapper.selectAllStu();
        for (Student stu : listUser) {
            System.out.println(stu);
        }
    }

    //根据Id查询一个学生数据
    @Test
    public void testSelectStuById() {
        Student user = mapper.selectStuById(1);
        System.out.println(user);
    }

    //模糊查询:根据stuinfo表的stuName字段
    @Test
    public void testSelectStuByName() {
        List<Student> stuList = mapper.selectStuByName("on");
        System.out.println("模糊查询");
        for(Student stu : stuList){
            System.out.println(stu);
        }
    }

    //添加一个学生数据
    @Test
    public void testInsertUser() {
        Student stu = new Student();
        stu.setAge(10);
        stu.setStuName("huahua");
        Integer i = mapper.insertStu(stu);
        System.out.println( (i>0)? "添加成功!":"添加失败!");
    }

    //根据Id修改学生数据
    @Test
    public void testUpdateUser(){
        Student stu = new Student();
        stu.setStuName("baibai");
        stu.setId(2);
        stu.setAge(29);
        int i = mapper.updateStu(stu);
        System.out.println( (i>0)? "修改成功!":"修改失败!");
    }

    //根据Id删除学生数据
    @Test
    public void testDeleteUser(){
        int i = mapper.deleteStu(4);
        System.out.println( (i>0)? "删除成功!":"删除失败!");
    }
}

以上是关于框架mybatis通过mapper接口加载sql映射文件的主要内容,如果未能解决你的问题,请参考以下文章

框架mybatis通过mapper接口加载sql映射文件

MyBatis sql映射器 Mapper

Mybatis增删改查

MyBatis进阶讲解+ssm集成

mybatis 详解------通过mapper接口加载映射文件

mybatis 详解------通过mapper接口加载映射文件