Mybatis学习

本文详细介绍了MyBatis的学习过程,从JDBC基础到MyBatis的优势与不足,逐步讲解了MyBatis的入门、日志配置、CRUD操作、映射配置、注解、分页、一对一关联查询、延迟加载、缓存机制等内容,帮助读者全面理解并掌握MyBatis框架的使用。
摘要由CSDN通过智能技术生成

MyBatis_01 入门、安装

一、JDBC

Java程序是通过JDBC(Java Data Base Connectivity)连接数据库的,JDBC是由SUN公司提出的 一系列规范,但是它只定义了接口的规范,而具体的实现是交给了各个数据库厂商去实现的, JDBC是一种典型的桥接模式

JDBC编程步骤

  1. 使用JDBC编程需要连接数据库,注册驱动和数据库信息

  2. 操作Connection,打开Statement对象

  3. 通过Statement执行SQL,返回结果到ResultSet对象

  4. 使用ResultSet读取数据,然后通过代码转换为具体的POJO对象

  5. 关闭数据库相关资源

JDBC弊端

  1. 工作量大

  2. 编程复杂

  3. SQL代码和JAVA代码混在一起

二、ORM模型

ORM取代了JDBC,所有的ORM模型都是基于JDBC进行封装的,不同ORM模型对JDBC封装的强 度是不一样的

ORM:对象关系映射(Object Relational Mapping),简单的说ORM框架就是数据库的表和简单 Java对象的映射关系模型,我们通过这层映射关系就可以简单迅速地把数据库表的数据转化为 POJO

java程序---->映射配置---->数据库

java程序-<----映射配置<----数据库

目前较为流行的ORM框架:

  • Hibernate:ORM鼻祖,功能强大,能自动生成SQL,但是使用起来较为复杂

  • JPA:与Hibernate为同一作者

  • MyBatis:轻量级,简单易用

三、Hibernate

Hibername一问世就成为了Java世界首选的ORM框架,它是建立在POJO和数据库 表模型的直接映射关系上的

Hibernate应用程序<------hbm.xml<-------DataBase

Hibernate应用程序------>hbm.xml------->DataBase

Hibernate优势:

  • 消除了代码的映射规则,它全部被分离到了XML或者注解里面去配置

  • 无需再管理数据库连接,它也可以配置在XML里面

  • 一个会话中,不要操作多个对象,只要操作Session对象即可

  • 关闭资源只需要关闭一个Session便可

Hibernate缺陷:

  • 全表映射带来了不便,比如更新时需要发送所有的字段

  • 无法根据不同的条件组装不同的SQL

  • 对多表关联和复杂SQL查询支持较差,需要自己写SQL,返回后,需要自己将数据组装为 POJO

  • 不能有效支持存储过程

  • 虽然有HQL,但是性能较差, 大型互联网系统往往需要优化SQL,而hibernate做不到

四、Mybatis

为了解决Hibernate的不足,一个半自动映射的框架MyBatis应运而生 mybatis是一个java持久层框架,它封装少、高性能·可优化、维护简单等优点成为了目前java移动 互联网网站服务的首选持久层框架,它特别适合分布式和大数据网络数据库编程 之所以称它为半自动,是因为它需要手工匹配提供POJO、SQL和映射关系,而全表映射的 Hibernate只需要提供POJO和映射关系便可

历史

Mybaits的前身是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了 google code 并且改名为Mybatis,2013年11月迁移到Github,目前 mybaits是由Github维护的

名称

iBatis一词来源于“internet”和“abatis”的组合 mybaits所需要提供的映射文件包含以下三个部分

  • SQL

  • 映射规则

  • POJO

什么时候用mybaits

  • Hibernate只适用于场景不太复杂,要求性能不太苛刻的时候

  • Mybatis拥有动态列,动态表名,存储过程支持,同时提供了简易的缓存、日 志、级联,但是它的缺陷是需要你提供映射规则和sql,所以它的开发工作量 比Hibernate略大一些

五、创建表

六、开发工具

JDK要求:>=1.8

七、创建项目

1、创建实体类(和表对应)

package com.turing.mybatis.entity;
/**
* 学生实体类--和表对应
* @author fred
*
*/
public class Student {
    private int id;
    private String name;
    private int age;
    private String email;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" +  name + ", age=" + age + ",
email=" + email +  "]";
    }
}

2、引入jar包(mybatis的jar包和mysql的驱动jar包)

注意:如mybatis的版本比较高时,数据库的驱动也要使用高版本,例如mybatis版本为3.5.6 时,mysql驱动包需使用5.1.48版本,否则就会报错!

3、创建资源目录包(放在资源目录中的文件和放在根目录是一样的)

4、创建mybatis全局配置文件:mybatis-config.xml(名称可以随便取)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 配置 -->
<configuration>
    <!-- 多个环境 -->
    <environments default="development">
        <!--
        environment:一个环境
        id:给该环境取一个标识符-->
        <environment id="development">
            <!-- 事务管理: 使用JDBC自带的-->
            <transactionManager type="JDBC" />
            <!-- dataSource:数据源,POOLED就是数据源的一个默认实例 -->
            <dataSource type="POOLED">
                <property name="driver"  value="com.mysql.jdbc.Driver" />
                <property name="url"  value="jdbc:mysql://localhost:3306/java16"
/>
                <property name="username"  value="root" />
                <property name="password"  value="root" />
            </dataSource>
        </environment>
    </environments>
    
    <!-- mappers:映射文件列表 -->
   <mappers>
      <!-- mapper:某一个映射 -->
      <mapper  resource="StudentMapper.xml" />
   </mappers>
    
</configuration>

POOLED:(POOLED实则就是数据源的一个实例名)

5、创建测试类,获取SqlSessionFactory对象

package com.turing.mybatis.entity;
import java.io.IOException;
import java.io.InputStream;
import  org.apache.ibatis.io.Resources;
import  org.apache.ibatis.session.SqlSession;
import  org.apache.ibatis.session.SqlSessionFactory;
import  org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class Test {
   public static void main(String[]  args) {
      try {
         //通过XML配置文件来构建SqlSessionFactory对象
         String resource =  "mybatis-config.xml";
         InputStream inputStream =  Resources.getResourceAsStream(resource);
         SqlSessionFactory  sqlSessionFactory =
new  SqlSessionFactoryBuilder().build(inputStream);
         
         
         //获取SqlSessionq(其实就相当于我们以前的Connection对象)
         //打开session
         SqlSession session =  sqlSessionFactory.openSession();
         try {
            Student stu =  session.selectOne("com.turing.haha.selectStu", 1);
            System.out.println(stu);
         } finally {
            //关闭session
            session.close();
         }
         
      } catch (IOException e) {
         // TODO Auto-generated  catch block
         e.printStackTrace();
      }
   }
}

6、创建映射文件StudentMapper.xml

<?xml version="1.0" encoding="UTF-8"  ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper  3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
   mapper:映射
   namespace:名字空间
   id:定义该条执行语句的标识符
   resultType:返回类型,写全包名(全限定名)
   #{id}:类似于以前的占位符?
-->
<mapper namespace="com.turing.haha">
   <select id="selectStu"  resultType="com.turing.mybatis.entity.Student">
      select id,p_name  name,age,email from student where id  = #{id}
   </select>
</mapper>

MyBatis_02 日志、全局配置

一、配置日志(LOG4J)

使用日志可以监控SQL的执行情况,目前日志框架也非常成熟,如log4j。

1、导入jar包(可以去mybatis的lib包下拷贝)

2、加入配置文件,名称必须为:log4j.properties。(不需要手写,可以去网上拷贝一个 模板)

log4j.rootLogger=DEBUG,Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p - %m%n
log4j.logger.org.apache=INFO

3、效果(在控制台或指定文件中,输出执行过程)

二、全局配置(mybatis-config.xml)

1、配置文件头(固定写法,建议不要手写,从官网拷贝,或自己保存为一个模板,其中dtd为标签约束文 件,当电脑联网会自动下载,否则没有提示)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config  3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">

2、configuration

<configuration>
    ...
</configuration>

配置根节点,不能缺少,所有标记都必须在该标签下

3、environments

环境列表,表示在该标签下,可以配置多个environment标签,default可以指定一个默认环境。 使用场景:例如配置两个environment,一个为开发环境,一个为上线环境,开发时使用mysql,上线时使 用oracle。这样不用改变明细代码,而只用改变default就可以随意切换,非常方便

<environments default="development">
       <environment id="development">
          <transactionManager  type="JDBC" />
          <dataSource type="POOLED">
             <property name="driver"  value="${jdbc.driver}"/>
             <property name="url"  value="${jdbc.url}" />
             <property name="username"  value="${jdbc.username}" />
             <property name="password"  value="${jdbc.password}" />
          </dataSource>
       </environment>
   </environments>
  • <environment id="development"> 环境配置标签,id为该环境的唯一标识符

  • <transactionManager type="JDBC" /> 事务管理器配置,type="JDBC"表示使用JDBC自带的事务管理器,“JDBC”表示事务管理器的一个实 例,这里使用默认值即可。

  • <dataSource type="POOLED"> 数据源的配置,这里可以配置三种选项:

    • UNPOOLED:不使用连接池技术

    • POOLED:使用连接池技术

    • JNDI:使用JNDI的方式

4、mappers:映射器

1)概念

  • 映射器是MyBatis最复杂、最核心的组件。

  • 映射器提供DAO层接口到mapper.xml文件的映射,我们只需要调用DAO层的方法,就可以以执行对应 的SQL语句,这里用到的是java的动态代理特性。

  • mappers:配置mapper列表,专门放置我们写好的xxxMapper.xml配置文件。

  • mapper:resource指定xxxMapper.xml配置文件的所在路径。

    2)配置映射器

<!-- 配置mappers -->
   <mappers>
       <!-- 配置单个mapper,指定文件路径
          resource:指定类路径下的映射文件路径
       -->
       <mapper  resource="StudentMapper.xml" />
       <!-- <mapper  resource="com/turing/mapper/StudentMapper2.xml" /> -->
       
       <!-- 使用类名注册
          1、指定xxxMapper映射接口的类路径
          2、xxxMapper.xml文件要和映射接口在同一目录,且名称要保持一致。
          3、没有sql映射文件,所有sql通过注解写在接口中。
        -->
       <!-- <mapper  class="com.turing.mapper.StudentMapper"/> -->
       
       <!-- 批量注册:指定包名,全包扫描,但xml映射文件要和映射接口放在同一包下 -->
       <package  name="com.turing.mapper"/>
   </mappers>

3)使用注解配置,就不需要xxxMapper.xml配置文件,但需要配置接口或扫描接口

public interface StudentMapper {
   
   //根据id查询学生对象
   @Select("select * from student where  id=#{id}")
   Student findById(int id);
}

注意:

  • 注解虽然使用方便,但并不推荐,毕竟SQL写在代码中,产生了高耦合,维护起来不方便。

  • 实际开发中,也可以混合使用,重要的复杂的写在xml中,不重要的简单的可以使用注解。

4)批量注册

批量注册:指定包名,全包扫描,但xml映射文件要和映射接口放在同一包下

<package  name="com.turing.mapper"/>

我们通常可以在资源包下,创建一个和映射接口一模一样的文件。

5、properties:配置全局参数

<properties  resource="jdbc.properties"></properties>

properties可以配置全局参数,例如可以把jdbc的四要素配置在一个properties后缀的文件中

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///t146
jdbc.username=root
jdbc.password=root

6、typeAliases:别名设置

<typeAliases>
       <!-- 设置单个别名 -->
       <!-- <typeAlias  type="com.turing.entity.Student"  alias="Student"/> -->
       
       <!-- 设置批量别名 -->
       <package  name="com.turing.entity"/>
   </typeAliases>

注意:

  • 不管是通过 typeAlias 标签配置,还是通过package 标签配置的别名,在mapper.xml文件中使 用的时候,是可以忽略大小写的。

  • 如果不手动设置别名,默认是类名的小写。

  • 如果配置了注解别名,注解别名会覆盖上面的所有配置。

@Alias("stu")
public class Student {
    ...
}

7、settings:设置选项(本章不作为重点)

<settings>
       <!-- 是否开启驼峰命名 -->
       <setting  name="mapUnderscoreToCamelCase"  value="true"/>
        ...
   </settings>

其它设置选项和对应的值:

配置项 作用 配置选项 默认值
cacheEnabled 该配置影响所有映射 器中配置缓存的全局 开关 TRUE|FALSE T
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值