Mybatis 映射文件

Mapper 就是“映射”的意思,Mapper 文件时 Mybatis 中的 SQL 语句的配置文件,其会在运行时加载 SQL 语句并映射相应参数。在 Mybatis 的全局配置文件中,其中最后一项就是 mapper 文件的资源路径的配置,因为创建 SqlSessionFactory 时会加载全局配置文件,这说明 Mapper 映射文件会在创建伊始就会被加载了。

一、映射文件标签

Mapper 映射文件,主要就是用来配置 SQL 映射语句的,根据不同的 SQL 语句性质,要使用不同的标签来包裹。

标签名称标签作用
insert用来映射插入语句
update用来映射更新语句
delete用来映射删除语句
select用来映射查询语句
resultMap自定义结果集映射
sql配置可以被其他语句引用的SQL语句块
cache命名空间的二级缓存设置
cache-ref其他命名空间缓存配置的引用

1.1 insert 标签

EmployeeMapper.xml

<insert id="addEmp">
     insert into tbl_employee (id, last_name, email, gender)
     values (#{id}, #{lastName}, #{email}, #{gender})
 </insert>

接口 EmployeeMapper.java

package com.example.mapper;

import com.example.pojo.Employee;

import java.util.List;

public interface EmployeeMapper {
    public boolean addEmp(Employee employee);
}

测试方法:

@Test
public void test04() throws IOException {
    SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
    SqlSession sqlSession = sqlSessionFactory.openSession();
    try{
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
        Employee employee = new Employee();
        employee.setLastName("zhangsan");
        employee.setEmail("zhangsan@123.com");
        employee.setGender("0");
        boolean addEmp = mapper.addEmp(employee);
        System.out.println(addEmp);
        // 需手动提交
        sqlSession.commit();
    } finally {
        sqlSession.close();
    }
}

控制台结果:

[main] [com.example.mapper.EmployeeMapper.addEmp]-[DEBUG] ==>  Preparing: insert into tbl_employee (id, last_name, email, gender) values (?, ?, ?, ?); 
[main] [com.example.mapper.EmployeeMapper.addEmp]-[DEBUG] ==> Parameters: null, zhangsan(String), zhangsan@123.com(String), 0(String)
[main] [com.example.mapper.EmployeeMapper.addEmp]-[DEBUG] <==    Updates: 1
true

1.2 update 标签

EmployeeMapper.xml

<update id="updateEmp">
    update tbl_employee set
    last_name=#{lastName},email=#{email},gender=#{gender}
    where id=#{id}
</update>

接口 EmployeeMapper.java

package com.example.mapper;

import com.example.pojo.Employee;

import java.util.List;

public interface EmployeeMapper {
    public Integer updateEmp(Employee employee);
}

测试方法:

@Test
public void test05() throws IOException {
   SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
   SqlSession sqlSession = sqlSessionFactory.openSession();
   try{
       EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
       Employee employee = mapper.getEmpById(8);
       employee.setLastName("lisi");
       employee.setEmail("lisi@123.com");
       employee.setGender("0");
       Integer updateEmp = mapper.updateEmp(employee);
       System.out.println(updateEmp);
       sqlSession.commit();
   } finally {
       sqlSession.close();
   }
}

控制台结果:

[main] [com.example.mapper.EmployeeMapper.getEmpById]-[DEBUG] ==>  Preparing: select * from tbl_employee where id = ? 
[main] [com.example.mapper.EmployeeMapper.getEmpById]-[DEBUG] ==> Parameters: 8(Integer)
[main] [com.example.mapper.EmployeeMapper.getEmpById]-[DEBUG] <==      Total: 1
[main] [com.example.mapper.EmployeeMapper.updateEmp]-[DEBUG] ==>  Preparing: update tbl_employee set last_name=?,email=?,gender=? where id=? 
[main] [com.example.mapper.EmployeeMapper.updateEmp]-[DEBUG] ==> Parameters: lisi(String), lisi@123.com(String), 0(String), 8(Integer)
[main] [com.example.mapper.EmployeeMapper.updateEmp]-[DEBUG] <==    Updates: 1
1

1.3 delete 标签

EmployeeMapper.xml

<delete id="deleteEmpById">
    delete from tbl_employee where id = #{id}
</delete>

接口 EmployeeMapper.java

package com.example.mapper;

import com.example.pojo.Employee;

import java.util.List;

public interface EmployeeMapper {
    public void deleteEmpById(Integer id);
}

测试方法:

 @Test
 public void test06() throws IOException {
     SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
     SqlSession sqlSession = sqlSessionFactory.openSession();
     try{
         EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
         mapper.deleteEmpById(7);
         sqlSession.commit();
     } finally {
         sqlSession.close();
     }
 }

控制台结果:

[main] [com.example.mapper.EmployeeMapper.deleteEmpById]-[DEBUG] ==>  Preparing: delete from tbl_employee where id = ? 
[main] [com.example.mapper.EmployeeMapper.deleteEmpById]-[DEBUG] ==> Parameters: 7(Integer)
[main] [com.example.mapper.EmployeeMapper.deleteEmpById]-[DEBUG] <==    Updates: 1

1.4 select 标签

EmployeeMapper.xml

<select id="getEmpById" resultType="employee">
    select * from tbl_employee where id = #{id}
</select>

接口 EmployeeMapper.java

package com.example.mapper;

import com.example.pojo.Employee;

import java.util.List;

public interface EmployeeMapper {
    public Employee getEmpById(Integer id);
}

测试方法:

@Test
public void test03() throws IOException {
     SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
     SqlSession sqlSession = sqlSessionFactory.openSession();
     try{
         EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
         Employee emp = mapper.getEmpById(1);
         System.out.println(emp);
     } finally {
         sqlSession.close();
     }
 }

控制台结果:

[main] [com.example.mapper.EmployeeMapper.getEmpById]-[DEBUG] ==>  Preparing: select * from tbl_employee where id = ? 
[main] [com.example.mapper.EmployeeMapper.getEmpById]-[DEBUG] ==> Parameters: 1(Integer)
[main] [com.example.mapper.EmployeeMapper.getEmpById]-[DEBUG] <==      Total: 1
Employee{id=1, lastName='tom', email='tom@123.com', gender='0'}

总结:
关于增删改:

  • Mybatis 允许增删改直接定义以下类型返回值:Integer、Long、Boolean、void
  • 需要手动提交数据 sqlSession.commit()。
    sqlSessionFactory.open() 为手动提交
    sqlSessionFactory.open(true) 为自动提交

二、标签属性含义

在insert、update、delete 及 select 配置标签中可以配置很多属性,具体可以配置的属性如下:

<select 
     id="selectEmployee" 
     parameterType="int"
     resultType="hashmap"
     resultMap="employeeResultMap"
     flushCache="false"
     useCache="true"
     timeout="10000"
     fetchSize="256"
     statementType="PREPARED"
     resultSetType="FORWARD_ONLY">
</select>

<insert id="insertEmployee"
     parameterType="com.example.pojo.Employee"
     flushCache="true"
     statementType="PREPARED"
     keyProperty=""
     keyColumn=""
     useGeneratedKeys="true"
     timeout="20">
</insert>

<update id="updateEmployee"
     parameterType="com.example.pojo.Employee"
     flushCache="true"
     statementType="PREPARED"
     timeout="20">
 </update>
 
<delete id="updateEmployee"
     parameterType="com.example.pojo.Employee"
     flushCache="true"
     statementType="PREPARED"
     timeout="20">
</delete>

每一个属性所代表的含义如下所示:

属性名含义所属标签
idSQL 映射配置的唯一标识,可以代表 SQL 配置select¦insert¦update¦delete
parameterType可选属性,用来传入 SQL 配置中需要的参数类型的类名或别名select¦insert¦update¦delete
resultType可选属性,用来配置 SQL 语句执行后期望得到的结果数据类型,配置的是结果类型的类名或别名。此属性不能与 resultMap 同时使用select
resultMap用来引入外部结果集配置,该结果集配置对应 SQL 结果中的每个字段名称,即将映射到 Java 对象中的哪个属性。此属性不能与 resultType 同时使用select
flushCache设置语句调用时,是否清空本地缓存和二级缓存,默认为falseselect¦insert¦update¦delete
useCache设置语句调用时,执行结果是否保存二级缓存,对 select 元素默认为 falseselect
timeout在抛出异常前,驱动程序等待数据库回应的最大秒数select¦insert¦update¦delete
fetchSize设置驱动程序每次批量返回结果的行数select
statementType设置 Mybatis 的 Statement 类型。可以配置为 STATEMENT、PREPARED 或 CALLABLE 中的一个,表示使用 Statement、PreparedStatement 或 CallableStatement 类型。默认配置为 PREPAREDselect¦insert¦update¦delete
resultSetType设置 Mybatis 的结果集类型。可以配置为 FORWARD_ONLY 、SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一个。默认无配置select
databaseId在配置 databaseIDProvider 的情况下,Mybatis 会加载所有不带 databaseId 或者匹配当前 databaseId 的语句select¦insert¦update¦delete
resultSets当有多个结果集的时候使用,会为 SQL 执行后返回的每个结果集设定一个名称,以逗号分隔select
useGeneratedKeys设置 Mybatis 使用 JDBC 的 getGeneratedKeys 方法来获取有数据库内部生成的主键(自增主键)。默认值为 falseinsert¦update
keyProperty代表主键。Mybatis 会将生成的主键赋给这个列。联合主键使用逗号隔开insert¦update
keyColumn仅对特定数据库生效,当主键列不是表中的第一列时需要设置该属性。如果希望得到多个生成的列,也可以是以逗号分隔的属性名称列表insert¦update
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值