MyBatis(3)-映射文件

本次博文有疑问,请先看MyBatis(1)-简单入门MyBatis(2)-全局配置文件!

如在有疑问,请留言或者咨询博主,博主每天都在!谢谢!

映射文件:

主要是在xxxmapper.xml文件里的配置

映射文件指导这MyBatis如何进行数据库的增删该查,有着很重要的意义。

下面开始进入正题,最后会发一个完整版的代码

因为实现的主要内容是增删改查,所以我们现在接口类中定义好相关的方法,后面不在进行单一的定义!

工程的目录如下:

EmployeeMapper.java

package com.MrChengs.dao;

import java.util.Map;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import com.MrChengs.bean.Employee;

public interface EmployeeMapper {

  //我们直接传入map
    public Employee getByMap(Map<String,Object> map);

    //查询满足两个条件的数据
    public Employee getByIdAndNames(@Param("id")int id,@Param("name")String name);

    //查询
    public Employee getEmployee(int id);

    //增加
    public void addEmp(Employee employee);

    //更新
    public void updateEmp(Employee employee);

    //删除
    public void deleteById(int id);
}

1)insert-映射插入语句

1.1)EmployeeMapper.xml

  <insert id="addEmp" >

             insert into test(name,gender,email) values(#{name},#{gender},#{email})

     </insert>

1.2)在测试类中MyBatisTest.java

   @Test
     public void test2() throws IOException{
           //1.得到SqlSeesionFactory
           SqlSessionFactory sessionFactory = getSqlSessionFactory();
           //2.得到SqlSession
           SqlSession sqlSession = sessionFactory.openSession();
           try{
                EmployeeMapper mapper = (EmployeeMapper) sqlSession.getMapper(EmployeeMapper.class);
                //手动添加数据:
                Employee em = new Employee( "zhangsan", "boy", "[email protected]");
                mapper.addEmp(em);
                //手动提交数据
                sqlSession.commit();
           }finally{
                sqlSession.close(); }}

1.3)测试成功

2)update映射更新语句

2.1)EmployeeMapper.xml

 <update id="updateEmp">
           update test set name=#{name},gender=#{gender} where id=#{id}
     </update>

2.2)测试类中

   @Test
     public void test3() throws IOException{
           //1.得到SqlSeesionFactory
           SqlSessionFactory sessionFactory = getSqlSessionFactory();
           //2.得到SqlSession
           SqlSession sqlSession = sessionFactory.openSession();
           try{
                EmployeeMapper mapper = (EmployeeMapper) sqlSession.getMapper(EmployeeMapper.class);
                //手动添加数据:
                Employee em = new Employee( 6,"Jerry", "gril", null);
                mapper.updateEmp(em);
                //手动提交数据
                sqlSession.commit();
           }finally{
                sqlSession.close();}}

2.3)测试成功!

3)delete-映射删除操作

3.1)EmployeeMapper.xml

     <delete id="deleteById">
           delete from test where id=#{id}
     </delete>

3.2)测试类中

 @Test
     public void test4() throws IOException{
           //1.得到SqlSeesionFactory
           SqlSessionFactory sessionFactory = getSqlSessionFactory();
           //2.得到SqlSession
           SqlSession sqlSession = sessionFactory.openSession();
           try{
                EmployeeMapper mapper = (EmployeeMapper) sqlSession.getMapper(EmployeeMapper.class);
                //手动添加数据:
                mapper.deleteById(6);
                //手动提交数据
                sqlSession.commit();
           }finally{
                sqlSession.close();}}

3.3)测试成功!

4)关于主键的值问题

有时候需要用到主键值的问题,所以我们需要去学习这个知识点!

4.1)EmployeeMapper.xml

    <!-- useGeneratedKeys="true"使用自增主键获取主键的值 -->
    <!-- keyProperty=""接受对应的主键值-->
    <insert id="addEmp" useGeneratedKeys="true"  keyProperty="id">
        insert into test(name,gender,email) values(#{name},#{gender},#{email})
    </insert>

4.2)测试类

  @Test
    public void test2() throws IOException{
        //1.得到SqlSeesionFactory
        SqlSessionFactory sessionFactory = getSqlSessionFactory();
        //2.得到SqlSession
        SqlSession sqlSession = sessionFactory.openSession();
        try{
            EmployeeMapper mapper = (EmployeeMapper) sqlSession.getMapper(EmployeeMapper.class);
            //手动添加数据:
            Employee em = new Employee( "zhangsan", "boy", "[email protected]");
            mapper.addEmp(em);
            //获取主键值的属性值进行打印
            System.out.println(em.getId());
            //手动提交数据
            sqlSession.commit();
        }finally{
            sqlSession.close();
        }
    }

4.3)测试成功

5)参数处理

5.1)单个参数:MyBatis不会做任何处理

    #{参数名} : 取出参数值

5.1.1)xml配置文件中

<select id="getId" resultType="com.MrChengs.bean.Employee">
        select id,name,gender,email from test where id = #{idabc}
    </select>

5.1.2)测试类

@Test
    public void test() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) new
                SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sqlSessionFactory.openSession();
        try{
            Employee employee =  session.selectOne("getId",5);
            System.out.println(employee);
        }finally{
            session.close();
        }
    }

5.1.3)测试是成功的!

5.2)多个参数时

MyBatis会做特殊的处理

多个参数时封装成map

key param1 ,param2......

value 传入的值

5.2.1)接口类中的查询代码设计如上所展示的

public Employee getByIdAndNames(@Param("id")int id,@Param("name")String name);
此时去掉@param:
public Employee getByIdAndNames(int id,String name);

5.2.2) xml文件

<select id="getByIdAndNames" resultType="com.MrChengs.bean.Employee" >
        select id,name,gender,email from test where id = #{id} and name=#{name}
 </select>

5.2.3)测试代码

  @Test
    public void test5() throws IOException{
                SqlSessionFactory sessionFactory = getSqlSessionFactory();
                SqlSession sqlSession = sessionFactory.openSession();
                try{
                    EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
                    Employee employee = mapper.getByIdAndNames(5, "MrChengs");
                    System.out.println(employee);
                }finally{
                    sqlSession.close();
                }
    }

5.2.4)此时会报错

5.2.5)处理方案:是在EmployeeMapper.xml文件中修改的

<!-- 同时使用两个参数进行数据库的查询 -->
    <!-- public Employee getByIdAndNames(int id,String name); -->
    <select id="getByIdAndNames" resultType="com.MrChengs.bean.Employee" >
        select id,name,gender,email from test where id = #{param1}       and name=#{param2} </select>

此时得到正确的答案!

5.3)多个查询字段时推荐使用的命名字段

明确指定封装参数时的map和key @param("id")

key:使用@param指定的值

5.3.1)接口类中

public Employee getByIdAndNames(@Param("id")int id,@Param("name")String name);

5.3.2)xml文件中

<select id="getByIdAndNames" resultType="com.MrChengs.bean.Employee" >
        select id,name,gender,email from test where id = #{id} and name=#{name}
</select>

测试类是5.2.3中的测试类,此时可以得到正确的结果!

5.4)

pojo:

如果参数过多,正好是业务逻辑的数据模型,我们直接传入pojo刚刚好

#{属性名} : 取出传入的pojo的属性值

如果多个参数不是业务逻辑数据,没有对应pojo,为了方法我们也可以直接传入map

#{key}就是取出对应的值

5.4.1)接口类中的

  public Employee getByMap(Map<String,Object> map);

5.4.2)xml文件中添加

<select id="getByMap" resultType="com.MrChengs.bean.Employee" >
           select id,name,gender,email from test where id = #{id} and name=#{name}
</select>

5.4.3)测试类

  @Test
    public void test6() throws IOException{
                SqlSessionFactory sessionFactory = getSqlSessionFactory();
                SqlSession sqlSession = sessionFactory.openSession();
                try{
                    EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
                    Map<String, Object> map = new HashMap<>();
                    map.put("id", 5);
                    map.put("name", "MrChengs");
                    Employee employee = mapper.getByMap(map);
                    System.out.println(employee);
                }finally{
                    sqlSession.close();
                }
    }

运行时,可以正确输出结果!

5.5)思考问题注意

未完,待更新....

原文地址:https://www.cnblogs.com/Mrchengs/p/9721608.html

时间: 2024-10-20 16:56:24

MyBatis(3)-映射文件的相关文章

mybatis中映射文件和实体类的关联性

mybatis的映射文件写法多种多样,不同的写法和用法,在实际开发过程中所消耗的开发时间.维护时间有很大差别,今天我就把我认为比较简单的一种映射文件写法记录下来,供大家修改建议,争取找到一个最优写法~~: 以User对象和UserMap.xml为例讲解,代码如下: User为用户实体类(仅作为讲解,可以只关注引用类型变量,get/set方法省略): import com.google.common.collect.Lists; import com.gukeer.common.persisten

MyBatis -- sql映射文件详解

MyBatis 真正的力量是在映射语句中.和对等功能的jdbc来比价,映射文件节省很多的代码量.MyBatis的构建就是聚焦于sql的. sql映射文件有如下几个顶级元素:(按顺序) cache配置给定命名空间的缓存. cache-ref从其他命名空间引用缓存配置. resultMap最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来加载你的对象. parameterMap已经被废弃了!老式风格的参数映射.内联参数是首选,这个元素可能在将来被移除. sql可以重用的SQL块,也可以被其他

MyBatis学习-映射文件标签篇

MyBatis 真正的核心在映射文件中.比直接使用 JDBC 节省95%的代码.而且将 SQL 语句独立在 Java 代码之外,可以进行更为细致的 SQL 优化. 一. 映射文件的顶级元素 resultMap:最复杂,最有力量的元素,用来描述如何从数据库结果集中加载你的对象 sql:可以重用的 sql 代码块 insert:映射插入语句 update:映射更新语句 delete:映射删除语句 select:映射查询语句 cache:配置给定命名空间的缓存 cache-ref:从其他命名空间引用缓

Mybatis(三) 映射文件详解

前面说了全局配置文件中内容的详解,大家应该清楚了,现在来说说这映射文件,这章就对输入映射.输出映射.动态sql这几个知识点进行说明,其中高级映射(一对一,一对多,多对多映射)在下一章进行说明. 一.输入映射 输入映射:配置statement中输入参数的类型.有四种 1.1.传递简单类型,八大基本类型,比如int类型 findUserById:根据id进行查询对应user,那么传入的就应该是int类型的值.所以使用别名int来映射传入的值 1.2.传递pojo(代表正常的对象,比如user的jav

springboot整合mybatis(映射文件方式和注解方式)

springboot作为一个微服务框架,给我们开发人员提供极大的便利,秉着约定大于配置的原则,通过starter包的形式为我们做了许多默认的配置,在进行数据持久化到关系型数据库时,我们一般都会首选spring data jpa,springboot为我们提供了starter包,只需配置很少的参数,就能满足我们的需求,非常方便.但是当我们遇到一些比较复杂的查询.多表关联查询及动态sql时,mybatis则在这方面更出色,并且在使用mybatis时我们可以通过sql优化来提高查询效率,springb

Mybatis XML映射文件

mybatis为聚焦于SQL而构建,SQL映射文件常用的顶级元素如 resultMap,是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象. insert,映射插入语句 update, 映射更新语句 delete , 映射删除语句 select , 映射查询语句 1)简单的单表映射文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//my

MyBatis SQL映射文件

SQL映射文件的几个顶级元素: mapper : 映射文件的根元素节点 只有一个属性namespace(命名空间) 作用:用于区分不同的mapper ,全局唯一 绑定DAO接口,即面向接口编程 ,namespace的命名必须要跟接口同名.   cache:  配置给定命名空间的缓存 cache-ref: 从其他命名空间引用缓存配置 resultMap: 用来描述数据库结果集和对象的对应关系.   sql : 可以重用的SQL块,也可以被其他语句引用. insert: 映射插入语句. update

【MyBatis】映射文件示例

本文以实例说明Mapper文件的标签的使用. 配置文件在[MyBatis]配置文件示例 DAO文件 DepartmentMapper.java package com.atguigu.mybatis.dao; import com.atguigu.mybatis.bean.Department; public interface DepartmentMapper { public Department getDeptById(Integer id); public Department getD

MyBatis编写映射文件实现增删改操作 附说明即源码

1.看一下我们接口 package cn.bdqn.mybatis.dao; import org.apache.ibatis.annotations.Select; import cn.bdqn.mybatis.been.Emp; /** * 这个接口不用写实现类,是用来给empMapper.xml进行动态绑定的 * @author Administrator * */ public interface EmpMapper { public Emp getEmpById(Integer id)