Mybatis学习笔记

MyBatis

MyBatis框架描述

  • 什么是Mybatis

    Mybatis是支持定制化SQL,存储过程以及高级映射的优秀的持久层框架

  • Mybatis的特点

    Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集

    Mybatis可以使用简单的xml或者注解用于配置和原始映射,将接口和Java的POJO映射成数据库的记录

    SQL和Java编码分开,功能边界清晰,一个专注业务,一个专注数据

搭建MyBatis框架

  • 引入依赖
     		<!--Mybatis-->
    		<dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.9</version>
            </dependency>
    		<!--MySQL驱动-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.25</version>
            </dependency>
    
  • 创建Mybatis全局配置文件

    Mybatis的全局配置文件包含了影响Mybatis行为的设置(settings)和属性(properties)信息,如数据库连接池信息等

    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                    <property name="username" value="root"/>
                    <property name="password" value="zxc85167518"/>
                </dataSource>
            </environment>
        </environments>
        <!--写好的sql映射文件需要注册到全局映射中-->
        <mappers>
            <mapper resource="mapper/EmployeeMapper.xml"/>
        </mappers>
    </configuration>
    
  • 创建Dao接口
    public interface EmployeeMapper {
         
    
         Employee getEmpById(Integer id);
    }
    
  • 创建SQL映射文件

    映射文件的作用相当于定义Dao接口的实现类如何工作,包含了每个sql语句的映射信息,将sql语句抽取出来

    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <!--
        namespace:名称空间(接口的全类名)
        id:唯一标识
        resultType:返回值类型
        #{id}:从传递过来的参数中取出id值
    -->
    <mapper namespace="com.zlh.mybatis.bean.EmployeeMapper">
        <select id="getEmpById" resultType="com.zlh.mybatis.bean.Employee">
            select id,last_name lastName,email,gender from t_employee where id = #{id}
        </select>
    </mapper>
    <!--创建完映射文件需注册在全局配置文件中-->
    
  • 接口式编程
    //根据全局配置文件,利用SqlSessionFactoryBuilder创建SqlSessionFactory
    String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = SqlSessionFactoryBuilder().build(inputStream);
    try (SqlSession openSession = sqlSessionFactory.openSession()) {
         
        //使用SqlSession获取映射器进行操作
                EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
        //调用接口的方法
                Employee employee = mapper.getEmpById(1);
                System.out.println(employee);
            }
    

    SqlSession的实例不是线程安全的,因此不能被共享

    SqlSession每次用完后需要正确关闭,这个关闭操作是必须的

    SqlSession推荐使用获取Dao接口的代理类,执行代理对象的方法,可以更安全的进行类型检查操作

MyBatis全局配置文件

Mybatis的配置文件包含了影响Mybatis行为的设置(settings)和属性(properties)信息。文档的顶层结构如下:

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--引入dtd约束文件-->
<configuration><!--配置-->
	<properties></properties><!--属性-->
    <settings></settings><!--设置-->
    <typeAliases></typeAliases><!--类型命名-->
    <typeHandlers></typeHandlers><!--类型处理器-->
    <objectFactory></objectFactory><!--对象工厂-->
    <plugins></plugins><!--插件-->
    <enviroments><!--环境-->
        <enviroment><!--环境变量-->
        	<transactionManager></transactionManager><!--事务管理器-->
            <dataSource></dataSource><!--数据源-->
        </enviroment>
    </enviroments>
    <databaseldProvider></databaseldProvider><!--数据库厂商标识-->
    <mappers></mapper><!--映射器-->
</configuration>
  • properties属性

    properties标签用于引入外部properties配置文件的内容

    resource属性:引入类路径下的资源

    url属性:引入网络路径或磁盘路径下的资源

    <properties resource="dbconfig.properties">
    	<property name="username" value="root"/>
    </properties>
    
    #dbconfig.properties
    jdbc.driver=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/mybatis
    jdbc.username=root
    jdbc.password=zxc85167518
    

    如果属性在不只一个地方进行配置,那么Mybatis将按照下面的顺序来加载:

    • 在properties元素体内指定的属性首先被读取
    • 然后根据properties元素的resource属性读取类路径下属性文件或根据url属性指定的路径读取属性文件,并覆盖已读取的同名属性
    • 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性
  • settings属性

    这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了常用设置中各项设置的含义、默认值等。

    设置参数 描述 有效值 默认值
    caheEnabled 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 true false true
    lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 true false false (在 3.4.1 及之前的版本中默认为 true)
    useColumnLabel 使用列标签代替列名。实际表现依赖于数据库驱动,具体可参考数据库驱动的相关文档,或通过对比测试来观察。 true false true
    defultStatementTimeout 设置超时时间,它决定数据库驱动等待数据库响应的秒数。 任意正整数 未设置 (null)
    mapUnderscoreToCamelCase 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 true false false
  • typeAliases别名处理器

    typeAliases标签用于为Java类型起别名(不区分大小写)

    type属性:指定起别名的类型全类名,默认别名为类名小写

    alisas属性:指定新的别名

    package标签:为某个包下所有类名起别名

    name属性:指定包名,为当前包以及下面所有的后代包的每个类默认起一个别名

    批量起别名的情况下,起别名可以使用@Alisas注解,防止类名相同时取别名重复报错的问题

     <typeAliases>
            <typeAlias type="com.zlh.mybatis.bean.Employee" alias="emp"/>
            <package name="com.zlh.mybatis.bean"/>
        </typeAliases>
    

    Mybatis已经为许多常见的Java类型内建了相应的类型别名,取别名需要注意不能占用已有的别名

  • typeHandlers类型处理器

    无论Mybatis在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集取出一个值时,都会用类型处理器将获取的值以合适的方式转换成Java类型

    可以重写已有的类型处理器或者创建新的处理器来处理不支持的或非标准的类型:实现org.apache.ibatis.type.TypeHandler接口或者继承org.apache.ibatis.type.BaseTypeHandler类,并且可以将它映射到一个JDBC类型

    @MappedJdbcTypes(JdbcType.VARCHAR)
    public class ExampleTypeHandler extends BaseTypeHandler<String> {
         
    
      @Override
      public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
         
        ps.setString(i, parameter);
      }
    
      @Override
      public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
         
        return rs.getString(columnName);
      }
    
      @Override
      public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
         
        return rs.getString(columnIndex);
      }
    
      @Override
      public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
         
        return cs.getString(columnIndex);
      }
    }
    

    在mybatis全局配置文件中注册

    <!-- mybatis-config.xml -->
    <typeHandlers>
      <typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
    </typeHandlers>
    
  • environments环境

    Mybatis可以配置多种环境,比如开发,测试和生产环境需要有不同的配置

    每种环境使用一个environment标签进行配置并指定唯一标识符

    可以通过environments标签中的default属性指定一个环境的标识符来快速的切换环境

    transactionManager标签:事务管理器

    • type属性:事务管理器类型,JDBC|MANAGED|自定义

      • JDBC(JdbcTransactionFactory):使用JDBC的提交和回滚设置,依赖于从数据源得到的连接来管理事务范围

      • MANAGED(ManagedTransactionFactory):不提交或回滚一个连接,让容器来管理事务的整个生命周期(比如JEE应用服务器的上下文)

      • 自定义:实现TransactionFactory接口

    dataSource标签:数据源

    • type属性:数据源类型,UNPOOLED|POOLED|JNDI|自定义
      • UNPOOLED:不使用连接池
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值