栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MyBatis——Sql 映射文件

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MyBatis——Sql 映射文件

Sql 映射文件

文章目录
  • Sql 映射文件
    • 1、增删改的实现
    • 2、获取自增主键的值
    • 3、参数处理
      • 3.1、关于参数的扩展思考
      • 3.2、结合源码,mybatis 怎么处理参数
      • 3.3、参数值的获取:# 与 $ 的区别
    • 4、Select 返回 List
    • 5、Select 记录封装 Map
    • 6、Select 中 resultMap 属性:自定义结果映射查询

MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。

1、增删改的实现

首先我们在接口中定义方法:

import mybatis.Employee;

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

    public void addEmp(Employee employee);

    public void updateEmp(Employee employee);

    public void deleteEmpById(Integer id);
}

接着,在 Sql 映射文件中给出对应的 Sql 语句实现:





    

    
    select * from tbl_employee where id = #{param1} and last_name = #{param2}

测试代码:

@Test
public void test7() throws IOException {
    //1、获取sqlSessionFactory对象
    SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();

    //2、获取sqlSession对象
    SqlSession sqlSession = sqlSessionFactory.openSession();

    try {
        //3、获取接口的实现类对象
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);

        Employee jerry = mapper.getEmpByIdAndLastName(2, "jerry");
        System.out.println(jerry);

    }finally {
        sqlSession.close();
    }
}
DEBUG 12-22 20:12:43,544 ==>  Preparing: select * from tbl_employee where id = ? and last_name = ?  (baseJdbcLogger.java:137) 
DEBUG 12-22 20:12:43,600 ==> Parameters: 2(Integer), jerry(String)  (baseJdbcLogger.java:137) 
DEBUG 12-22 20:12:43,630 <==      Total: 1  (baseJdbcLogger.java:137) 
Employee{id=2, lastname='jerry', email='jerry@qq.com', gender='1'}
  • 【命名参数】:明确指定封装参数时 map 的 key;@Param("id")

    多个参数会被封装成一个 map:

    key:使用 @Param 注解指定的值

    value:参数值

    #{指定的key} 取出对应的参数值

修改接口:

public interface EmployeeMapper {
    public Employee getEmpByIdAndLastName(@Param("id")Integer id, @Param("lastname")String lastname);

修改 Sql 映射文件:


    
    select * from tbl_employee where id = #{id} and last_name = #{lastname}

  • POJO

    如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入 pojo;

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

  • Map

    如果多个参数不是业务模型中的数据,没有对应的 pojo,不经常使用,为了方便,我们也可以传入 map

    #{key}:取出 map 中对应的值

添加一个查询:

public interface EmployeeMapper {
    public Employee getEmpByMap(Map map);

在 Sql 映射文件中也对应添加:


    select * from tbl_employee where id = #{id}

测试代码:

@Test
public void test10() throws IOException {
    //1、获取sqlSessionFactory对象
    SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();

    //2、获取sqlSession对象
    SqlSession sqlSession = sqlSessionFactory.openSession();

    try {
        //3、获取接口的实现类对象
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);

        Map empByIdReturnMap = mapper.getEmpByIdReturnMap(1);
        System.out.println(empByIdReturnMap);


    }finally {
        sqlSession.close();
    }
}
DEBUG 12-24 10:54:45,092 ==>  Preparing: select * from tbl_employee where id = ?  (baseJdbcLogger.java:137) 
DEBUG 12-24 10:54:45,125 ==> Parameters: 1(Integer)  (baseJdbcLogger.java:137) 
DEBUG 12-24 10:54:45,149 <==      Total: 1  (baseJdbcLogger.java:137) 
{gender=0, last_name=jerry2, id=1, email=jerry3@qq.com}	//HashMap 是无序的

如果想封装多条记录:

public interface EmployeeMapper {
    //多条记录封装一个map:Map,键是这条记录的主键,值是记录封装后的javaBean
    @MapKey("id")   //告诉mybatis,封装这个map的时候使用哪个属性作为主键
    public Map getEmpByLastNameLikeRetrunMap(String lastName);

    select * from tbl_employee where last_name like #{lastName}

@Test
public void test11() throws IOException {
    //1、获取sqlSessionFactory对象
    SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();

    //2、获取sqlSession对象
    SqlSession sqlSession = sqlSessionFactory.openSession();

    try {
        //3、获取接口的实现类对象
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);

        Map empByLastNameLikeRetrunMap = mapper.getEmpByLastNameLikeRetrunMap("%r%");
        System.out.println(empByLastNameLikeRetrunMap);


    }finally {
        sqlSession.close();
    }
}
DEBUG 12-24 11:01:43,224 ==>  Preparing: select * from tbl_employee where last_name like ?  (baseJdbcLogger.java:137) 
DEBUG 12-24 11:01:43,256 ==> Parameters: %r%(String)  (baseJdbcLogger.java:137) 
DEBUG 12-24 11:01:43,277 <==      Total: 3  (baseJdbcLogger.java:137) 
{1=Employee{id=1, lastname='jerry2', email='jerry3@qq.com', gender='0'}, 2=Employee{id=2, lastname='jerry1', email='jerry1@qq.com', gender='1'}, 3=Employee{id=3, lastname='jerry', email='jerry@qq.com', gender='1'}}

如果想把 lastName 作为 key:

@MapKey("lastname")
public Map getEmpByLastNameLikeRetrunMap(String lastName);
DEBUG 12-24 11:06:00,448 ==>  Preparing: select * from tbl_employee where last_name like ?  (baseJdbcLogger.java:137) 
DEBUG 12-24 11:06:00,482 ==> Parameters: %r%(String)  (baseJdbcLogger.java:137) 
DEBUG 12-24 11:06:00,503 <==      Total: 3  (baseJdbcLogger.java:137) 
{jerry2=Employee{id=1, lastname='jerry2', email='jerry3@qq.com', gender='0'}, jerry1=Employee{id=2, lastname='jerry1', email='jerry1@qq.com', gender='1'}, jerry=Employee{id=3, lastname='jerry', email='jerry@qq.com', gender='1'}}

6、Select 中 resultMap 属性:自定义结果映射查询

新建一个接口 EmployeePlus:

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

新建一个 sql 映射文件 EmployeeMapperPlus: