Mybatis入门学习笔记(一)

Mybatis入门学习笔记(一)

  • 1. 绪论
    • 1.1 框架
    • 1.2 三大框架 SSH->SSM
    • 1.3 传统JDBC
    • 1.4 Mybatis
  • 2. Mybatis开发
    • 2.1 Mybatis下载与安装
    • 2.2 Mybatis使用须知
    • 2.3 搭建步骤
    • 2.4 小结
  • 3. 配置详解
    • 3.1 核心配置文件
    • 3.2 映射文件--与业务相关
  • 4. 基本查询操作
  • 4.1 概念
  • 4.2 根据id查询
  • 4.3 查询所有
  • 4.4 模糊查询
  • 4.5 分页查询
  • 5. 增删改
    • 5.1 增加数据
    • 5.2 删除数据
    • 5.3 修改数据

学习视频链接

学习文档链接

官方文档链接

1. 绪论

1.1 框架

  1. 三层架构:
  • 表述层 servlet

  • 业务逻辑层 javabean

  • 数据持久层 JDBC

    大量时间用于搭建项目。开发效率比较低。其实对于开发人员来说,重要的是业务,更应该关注业务。

  1. 实际上,框架就是将重复繁琐的代码实现封装,让开发人员将更多的精力放在业务的理解和分析上。
  2. 框架的意义:提高开发效率、隐藏细节

1.2 三大框架 SSH->SSM

  1. 表述层:用户交互 servlet------SpringMVC/struts2
  2. 业务逻辑层: 业务处理 javabean/ejb----Spring
  3. 数据持久层: 数据库 JDBC----Mybatis/Hibernate

1.3 传统JDBC

  1. 连接数据库时四个关键参数的使用有硬编码。即用户名、密码、数据库地址、数据库驱动被写死,怎么解决?使用xml文件配置

  2. statement使用中存在硬编码。

  3. 频繁的建立和关闭连接。(数据源、连接池)

1.4 Mybatis

传统框架的不足,使得Mybatis框架应运而生。

  1. MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。

    MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

    在框架里面写代码不多,但需要大量配置。

  2. MyBatis 是一个优秀的ORM框架。

    ORM:Object Relationship Mapping(对象关系映射)

    将对象通过一定的方式插入数据库。

  3. Mybatis不需要开发人员更多的关注数据库的连接和关闭以继statement对象的创建,着重关注SQL语句。

    即:关注映射,输入参数和输出参数。

    Mybatis更像一个黑匣子。

2. Mybatis开发

2.1 Mybatis下载与安装

  1. Mybatis的前身是ibatis,后期这个项目被移植到Google code才正式更名为Mybatis。
    github中可以下载Mybatis。
  2. 要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。
  3. 如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:

  org.mybatis
  mybatis
  x.x.x

2.2 Mybatis使用须知

  1. 配置文件
  • xfg.xml 核心配置文件(全局配置文件):连接信息的配置(连接池)、事务管理
  • mapper.xml 映射文件
  1. SqlsessionFactory: session工厂
  2. Sqlsession :面向程序员的接口(增删改查)

2.3 搭建步骤

  1. 创建一个maven项目,引入相关的依赖。
  2. 常用Mybatis的依赖jar包

Mybatis入门学习笔记(一)_第1张图片

  1. 配置核心配置文件(xml)

    注意:此处配置的并不是pom.xml文件哈~此处取名为MybatisDemo.xml

    XML 配置文件中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器(TransactionManager)。



  
    
      
      
        
        
        
        
      
    
  
  
    
  

environment 元素体中包含了事务管理和连接池的配置。mappers 元素则是包含一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。

传统的JDBC需要频繁建立和释放连接。使用连接池后,java向连接池申请连接,用完后归还至连接池即可。

Mybatis入门学习笔记(一)_第2张图片

连接池:

  • 当项目启动,向数据库请求N条(N=初始化连接数)连接放置在连接池中管理。
  • 当连接的请求多于初始化连接数,此时会根据步长来增加连接数(创建连接)。增加的连接数最大不超过最大连接数,仍不够时需要根据超时时间进行等待。
  • 当连接的请求远低于当前的连接数,此时会根据最小连接数释放相应的连接。
  • 减少连接的频繁关闭,但连接需要占用资源
  • 常用连接池: DBCP C3P0 DROID

2.4 小结

  1. 项目结构
    Mybatis入门学习笔记(一)_第3张图片
  2. pom.xml文件


    4.0.0

    com.mybatis
    MybatisDemo
    1.0-SNAPSHOT

    
        1.8
        1.8
    

    
        
            
                src/main/resources
                
                    **/*.xml
                
            
        
    

    
        
            org.mybatis
            mybatis
            3.3.0
        
        
        
            mysql
            mysql-connector-java
            8.0.17
        

    



  1. DataMapper.xml




    
    

Mybatis入门学习笔记(一)_第4张图片
4. MybatisDemo.xml






    
    
        
        
            
            
                
                
                
                
            
        
    
    
    
        
    

  1. Data.java
package entity;

public class Data {
    private int id;
    private String name;
    private int age;

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }


}

  1. Test.java
import entity.Data;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;


import java.io.InputStream;

public class Test {
    public static void main(String[] args) throws Exception{
        //加载配置文件为流
        InputStream is=Resources.getResourceAsStream("MybatisDemo.xml");
        //创建SqlSessionFactory工厂
        SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(is);
        //核心接口(发送SQL语句)
        SqlSession session=ssf.openSession();

        Data data=session.selectOne("com.selectData",2);

        System.out.println("ID:"+data.getId()+"\n"+"姓名:"+data.getName()+"\n"+"年龄:"+data.getAge());

        //释放资源
        session.close();
    }
}

  1. Mysql数据库

Mybatis入门学习笔记(一)_第5张图片
8. 运行结果

Mybatis入门学习笔记(一)_第6张图片

至此,一个简单的Mybatis的入门项目就已经完成了。

3. 配置详解

3.1 核心配置文件

  1. 属性(properties)------可外部配置且可动态替换
  • 可以在典型的 Java 属性文件中配置,即java的属性文件外部引入 resource=“jdbc.properties”
  • 亦可通过 properties 元素的子元素来传递,property标签中配置
  • 当两者冲突时,最终使用Java的属性文件的配置

Mybatis入门学习笔记(一)_第7张图片

  1. 设置(settings)–这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为
    Mybatis入门学习笔记(一)_第8张图片
    Mybatis入门学习笔记(一)_第9张图片

  2. 类型别名(typeAliases)

    类型别名是为 Java 类型设置一个短的名字。 它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余
    Mybatis入门学习笔记(一)_第10张图片

  3. 类型处理器(typeHandlers)

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

  4. 对象工厂(objectFactory)

    MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。 如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。

    ObjectFactory 接口很简单,它包含两个创建用的方法,一个是处理默认构造方法的,另外一个是处理带参数的构造方法的。 最后,setProperties 方法可以被用来配置 ObjectFactory,在初始化你的 ObjectFactory 实例后, objectFactory 元素体中定义的属性会被传递给 setProperties 方法。

  5. 插件(plugins)

    MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。

  6. 环境配置(environments)

    MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中 使用相同的 SQL 映射。有许多类似的使用场景。

    不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。

Mybatis入门学习笔记(一)_第11张图片

  • 事务管理器:
    JDBC:和JDBC使用同样的提交和回滚策略
    MANAGED:依赖于应用服务器上下文(context)的配置(必须在服务器上运行)
    Mybatis入门学习笔记(一)_第12张图片

  • 数据源
    UNPOOLED:请求时连接,完毕时关闭
    POOLED:连接池
    JNDI:依赖于应用服务器,即在上下文配置数据源,然后再java获取上下文的引用从而获取数据源
    Mybatis入门学习笔记(一)_第13张图片
    Mybatis入门学习笔记(一)_第14张图片

  1. 映射器(mappers):引用已经配置好的配置文件

既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。 但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:/// 的 URL),或类名和包名等。
Mybatis入门学习笔记(一)_第15张图片

3.2 映射文件–与业务相关

Mybatis入门学习笔记(一)_第16张图片

4. 基本查询操作

4.1 概念

Mybatis入门学习笔记(一)_第17张图片

  1. 查询映射:
    
  • id:唯一标识

  • #{}: 代表占位符

  • parameterType:输入参数类型(输入参数的映射)(可省略)

  • 输入参数的映射:
    简单类型:int,string 可以随意写
    对象类型:#{}值为属性名称
    map:#{}值为key值
    包装类:属性导航

  • resultType:结果类型 (输出结果的映射)(可省略)
    简单类型:int,string 可以随意写
    对象类型:字段与属性之间一一对应
    注意:字段名称,即结果集中的名字和属性名称必须一致

  • resultMap:写外部resultMap的id

4.2 根据id查询

映射文件----DataMapper.xml


Test.java

ata data=session.selectOne("com.selectData",2);
System.out.println("ID:"+data.getId()+"\n"+"姓名:"+data.getName()+"\n"+"年龄:"+data.getAge());

运行结果:
Mybatis入门学习笔记(一)_第18张图片

4.3 查询所有

映射文件----DataMapper.xml


Test.java

//查询所有
        List list = session.selectList("com.selectAll");
        for(int i = 0; i < list.size(); i++){
            System.out.println(list.get(i).toString());
        }

注意:一定要在Data.java中重写toString方法!!!

    @Override
    public String toString() {
        return "Data{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

运行结果:

在这里插入图片描述

4.4 模糊查询

映射文件----DataMapper.xml

    

Test.java

//模糊查询
        List list1 = session.selectList("com.selectLike","t");
        System.out.println(list1);

模糊查询:有SQL注入的风险

4.5 分页查询

  1. 编写类
  2. map
    
//分页查询
        Map map=new HashMap<>();
        map.put("start",0);
        map.put("length",2);
        List list2 = session.selectList("com.selectPage",map);
        System.out.println(list2);
  1. Mybatis RowBounds
    
        //分页查询
        RowBounds bunds=new RowBounds(0,1);
        List list3= session.selectList("com.selectPage1",null,bunds);
        System.out.println(list3);

5. 增删改

5.1 增加数据

  1. 简单增加数据
    映射文件----DataMapper.xml
    
        
        insert into yangtingting(name,age) values(#{name},#{age})
    

Test.java

        Data data1 = new Data("杨婷婷",24);
        int rows=session.insert("com.insertData", data1);
        session.commit();
        System.out.println(rows);

注意:应该在Data.java中增加构造方法

    public Data(String name, int age) {
        this.name = name;
        this.age = age;
    }

注意事项

  1. 插入,主键返回,用于建立多表之间的关系
    
        insert into yangtingting(name,age) values(#{name},#{age})
    
        Data data1 = new Data("杨婷婷",24);
        int rows=session.insert("com.insertData", data1);
        session.commit();
        System.out.println(rows);
        System.out.println(data1.getId());

在这里插入图片描述

5.2 删除数据


  delete from Author where id = #{id}

5.3 修改数据


  update Author set
    username = #{username},
    password = #{password},
    email = #{email},
    bio = #{bio}
  where id = #{id}

 Data data1 = new Data();
        data1.setId(2);
        data1.setAge(24);
        data1.setName("tyyyy");
        session.insert("com.updateData", data1);
        session.commit();
        session.close();

Mybatis入门学习笔记(一)_第19张图片

你可能感兴趣的:(Java框架)