一、整体认识mybatis和mybatis的体系结构

1 myBatis 核心概念

1.1 基本概念

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录.

###1.2 核心对象的作用域与生命周期

简单示例:

  • UserMapper.xml



    

  • mybatis-config.xml



    
        
            
            
                
                
                
                
            
        
    
    
        
        
    

示例:

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
User result = session.selectOne("com.niuh.mybatis.dao.UserMapper.selectUser", 1);
System.out.println(result.toString());
  • SqlSessionFactoryBuilder

用于构建会话工厂,基于 config.xml environment 、props 构建会话工厂,构建完成后即可丢弃。

  • SqlSessionFactory

用于生成会话的工厂,作用于整个应用运行期间,一般不需要构造多个工厂对像

  • SqlSession

作用于单次会话,如WEB一次请求期间,不能用作于某个对像属性,也不能在多个线程间共享,因为它是线程不安全的。

1.3 接口式编程

由于每次调用时都去找对应用 statement 以及拼装参数,使用上不是特别友好,myBatis 引入了接口的机制,将接口与mapper.xml  的namespace 名称绑定,MyBatis就可以根据ASM工具动态构建该接口的实例。

mapper 映射器接口实例
通过 session.getMapper(Class type) 就可以获取mapper 实例,该实例一般作用于方法域。

2 全局的configuration配置

2.1 属性

properties 元素可以通过 resource 或url 加载外部 properties文件中的属性,也可以直接设置property 属性。然后在xml 中就可以通过${属性名}进行引用替换。


    

resource= app.properties  从class path中加载
url=[file:///G:/git/niuh-mybatis/src/main/resources/app.properties](file:///G:/git/tuling-mybatis/src/main/resources/app.properties) 基于url加载

引用属性方式:
j d b c . u s e r 从 M y B a t i s 3.4.2 开 始 , 位 符 指 定 一 个 默 认 值 。 例 如 : {jdbc.user} 从 MyBatis 3.4.2 开始,位符指定一个默认值。例如: jdbc.userMyBatis3.4.2{jdbc.user:root}

2.2 环境配置

一个项目经常需要在例如开发坏境、测试环境、预演环境、生产环境中等不同环境中进行部署,每个环境所对应的参数是不一样的,myBatis 中可以通过 environment 来设置不同环境的属性。


        
            
            
            
            
                
            
        
        
            
            
                
            
        
    

可通过 SqlSessionFactoryBuilder.build( environment) 来指定初始化哪套环境。

2.3 设置

设置MyBatis 全局参数,约定myBatis 的全局行为



  
  
  

示例驼峰命名开启与关闭:尝试开关 mapUnderscoreToCamelCase 属性 来观察Account 数据查询情况。

2.4 别名

在myBatis 中经常会用到 java 中类型,如sql 块中中 parameterType  参数引用中 javaType 结果集映射的javaType ,都要使用java 全路径名,可以通过


    
    

提示:建议不要设置。因为常用的类 mybatis 已经内置别名,而自定义的类设置别反而不好去找,影响阅读。

2.5 类型处理器

持久层框架其中比较重要的工作就是处理数据的映射转换,把java 类型转换成jdbc 类型的参数,又需要把jdbc 类型的结果集转换成java 类型。在mybatis 中是通过 TypeHandler 接口来实现的。

一、整体认识mybatis和mybatis的体系结构_第1张图片

可以看到 typeHandler 就是两个作用 设置参数 与获取结果。
你可以设置自定义处理器


  

可以通过以下两种方式指定处理的范围

  • javaType=“long”, jdbcType=“Date”
  • @MappedJdbcTypes( jdbc类型) @MappedTypes       java类型

示例:
long 类型时间戳转换成 日期类型
添加算定义处理类:

@MappedJdbcTypes(JdbcType.TIMESTAMP)
@MappedTypes(Long.class)
public class LongTimeHandler extends BaseTypeHandler {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Long parameter, JdbcType jdbcType) throws SQLException {
        ps.setDate(i, new Date(parameter));
    }
 
    @Override
    public Long getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return rs.getDate(columnName).getTime();
    }
 
    @Override
    public Long getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return rs.getDate(columnIndex).getTime();
    }
 
    @Override
    public Long getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return cs.getDate(columnIndex).getTime();
    }
}

在resultMap中指定 typeHandler:


   


2.6 mappers映谢器


  
  
  
 

加载方式:

  • resource 基于classPath 加载xml文件
  • url:基于资源定位加载xml 文件
  • class:基于接口加载
  • package :扫描包下所有class 然后进行加载
  • 约定规则:
  • mapper 中的 namespace必须与对应的接口名称对应。
  • 通过 class 或package 中加载时 .xml 文件必须与接口在同一级目录。

3 mapper 文件

3.1 sql语句块statement

通过原生JDBC写DAO的年代 ,程序员最怕莫过于 拼接SQL语句,拼接参数与设置返回结果集,Hibernate 将拼接SQL时代成为过去,通过ORM映谢,完全不需要处理任何SQL,但这又带来了新的问题就是。无法编写自定义SQL从而丧失了灵活活及更好的性能。MyBatis 通过 mapper 映射SQL很好解决了这一点。它无需在JAVA代码中拼接SQL,而是将其移至mapper 文件集中处理SQL节约了大量的开发时间。

Mapper中的元素:

  • cache – 对给定命名空间的缓存配置。
  • resultMap – 结果集映射。
  • sql – 可被其他语句引用的可重用语句块。
  • insert – 插入语句
  • update – 更新语句
  • delete –删除语句
  • select – 查询语句

select 用法及属性

示例:


属性:


    select * from user  where id = #{id}

集合collection

1、直接将collection集合元素的属性写为collection的字标签

    
    
    
    
        
        
        
            
            
       
   

它们的关系是这样的:
User里有一个Set roles
Role里有一个Set permissions
通过这样的配置,我们在执行查询User时,通过多表联查,就可以将这些级联属性全部关联查出。

下面是查询语句:


2、通过在collection标签中引用别的mapper的查询方法

        
        
        
        
        

在SysUser中有Set sysRoles
我们不需要再在collection中配置SysRole的属性,只需要将SysRole中的selectRoleListByUserId方法引入就可以了。

以下是查询语句:我们只需要查询SysUser就行了


当然,在SysRole的mapper中,我们是需要有selectRoleListByUserId方法的:


        
        
        
        
        
    
 
    

同理,SysRole中的permissions也是一样的。
两种方式的实现都可以,第二种方式不需要写过于复杂的sql,同时,每个mapper中的方法都是独立可以使用的,其适用性更强。

你可能感兴趣的:(Mybatis)