MyBatis基础入门-1

MyBatis-1

什么是框架:

我的理解就比如房建的框架结构,都是由许多钢筋混凝土的梁和柱共同组成的框架来承受房屋全部荷载的结构。框架内部可自行选择填充材料,具有空间分割灵活,自重轻,节省材料,缩短工期,整体性和刚度较好等优点。

  • 程序开发中的框架往往是对常见功能的封装,是整个或者部分系统的可重用设计,是JavaEE底层技术的封装。

  • 框架是可以被开发者定制的应用骨架。

  • 框架是一个半成品,软件是成品。我们在它的基础上开发出成品。

框架的作用:
  • 解决了技术通用的问题

    在JavaEE体系中,有着各种各样的技术。不同的软件企业,根据自身的业务需求选择不同的技术,容易造成应用依赖技术,增加了项目开发实现的复杂性和技术风险性。企业项目中应该将应用的设计与实现技术解耦。

  • 提升了开发效率

​ 企业项目中使用框架,只需要专注实现业务需求。使用框架的方便性,提升了开发效率。

  • 提升了系统稳定性

​ 一个成熟的框架,经过了在众多企业项目中的验证使用,稳定性有保障。

mybatis框架介绍

官网及框架包下载:

官网:http://www.mybatis.org/mybatis-3/

框架包:https://github.com/mybatis/mybatis-3/releases

mybatis框架:一个持久层框架,用来访问数据库,只是众多持久层框架中一个;ORM框架:对象关系映射框架

  • 优点:
  1. 简单易学:mybatis本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个SQL映射文件即可。
  2. 使用灵活:Mybatis不会对应用程序或者数据库的现有设计强加任何影响。SQL语句写在XML里,便于统一管理和优化。
  3. 解除SQL与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易进行单元测试。SQL语句和代码的分离,提高了可维护性。
  • 不足:
  1. 编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
  2. SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
  3. 框架还是比较简陋,功能尚有缺失,二级缓存机制不佳

ORM的概念

ORM概念:Object Relational Mapping 对应关系映射,将关系型数据库映射成面向对象编程的语言,如果使用框架,这由框架去完成

java语言是面向对象的,mysql是关系型数据库,两者需要有一个映射机制,这个映射机制称为ORM。由框架自动去完成的。

mybatis的两种映射方式

  1. 通过XML的配置文件
  2. 通过注解
ORM 表结构
对象 <------> 记录
成员变量 <------> 字段名

入门案例:环境搭建

步骤:

  1. 数据库创建要查询的表

    create table user (
      id int primary key auto_increment,
      username varchar(20) not null,
      birthday date,
      sex char(1) default '男',
      address varchar(50)
    );
    
    insert into user values (null, '孙悟空','1980-10-24','男','花果山水帘洞');
    insert into user values (null, '白骨精','1992-11-12','女','白虎岭白骨洞');
    insert into user values (null, '猪八戒','1983-05-20','男','福临山云栈洞');
    insert into user values (null, '蜘蛛精','1995-03-22','女','盤丝洞');
    
    select * from user;
    
  2. 创建项目(模块)

  3. 创建lib目录,导入jar包

    • 日志驱动包:log4j-1.2.17.jar
    • MySQL驱动:mysql-connector-java-5.1.37-bin.jar
    • mybatis框架包:mybatis-3.5.3.jar
  4. 编写实体类User

    /**
     用户实体类对象 */
    public class User {
    	  //基本类型使用的是包装类,使用包装类的好处,更加与表吻合,如:表中这列为NULL,int默认是0,Integer没有就是null
        private Integer id;  
        private String username;
        private Date birthday;
        private String sex;
        private String address;
        /*
        构造方法、get、set方法、tostring方法已省略未写
        ......
        */
    
  5. 配置文件(src目录下)

    ​ 核心配置文件:sqlMapConfig.xml(配置数据库连接,连接池等属性)

    ​ 日志记录配置文件:log4j.properties

    ​ 实体类映射配置文件:UserMapper.xml(编写SQL语句,指定表与类ORM之间映射关系)

  6. 编写用户DAO接口(UserMapper):查询所有用户的方法

    package com.itheima.dao;
    
    import com.itheima.entity.User;
    
    import java.util.List;
    
    /**
     * DAO层的接口
     */
    public interface UserMapper {
    
        /**
         * 查询所有的用户
         */
        List<User> findAllUsers();
    }
    
  7. 创建实体映射文件:UserMapper.xml

    
    
    
    <mapper namespace="com.itheima.dao.UserMapper">
        
        <select id="findAllUsers" resultType="com.itheima.entity.User">
            select * from user
        select>
    mapper>
    
  8. 修改核心配置文件中sqlMapConfig.xml,加载UserMapper.xml

    <mappers>
        
        <mapper resource="com/itheima/UserMapper.xml"/>
    mappers>
    
  9. 编写测试代码

    package com.itheima.test;
    
    import com.itheima.dao.UserMapper;
    import com.itheima.entity.User;
    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.IOException;
    import java.io.InputStream;
    import java.util.List;
    
    /**
     * 编写测试类
     */
    public class TestUserMapper {
    
        public static void main(String[] args) throws IOException {
            //0.mybatis也提供了一个工具类,直接读取src目录下配置文件,转成一个输入流。注:不要导错包
            InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
            //1.创建会话工厂建造类
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            //2.创建会话工厂对象,读取核心配置文件
            SqlSessionFactory factory = builder.build(inputStream);
            //3.从工厂中获取会话对象,相当于获取数据库的连接对象
            SqlSession sqlSession = factory.openSession();
            //4.获取DAO的代理对象,它是DAO的实现类。多态,前面是接口,后面是它的实现类
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            //5.调用DAO接口中方法来实现增删改查
            List<User> users = userMapper.findAllUsers();
            //6.输出查询的结果
            users.forEach(System.out::println);
            //7.释放资源
            sqlSession.close();
        }
    
    }
    

mybatis中的三大核心对象

  1. SqlSessionFactoryBuilder(造工厂的工人):会话工厂创建类,用来创建会话工厂的,第一次运行直接实例化即可。
  2. SqlSessionFactory(工厂):会话工厂类,是一个重量级的对象,在每个项目中只需要创建一个就可以了。
  3. SqlSession(汽车):用户每次访问数据库,就会创建一个会话对象,这个对象不能共享,每个用户有自己的会话对象。它由上面的工厂对象创建。会话对象是轻量级对象,每次访问都可以创建,用完以后关闭。类似于Connection连接对象。
    • 增删改
    • 查询
      • selectList
      • selectOne
    • 事务
    • 关闭资源

ResourceAPI

  • 作用:就是加载配置文件为InputStream,底层实现实际上就是利用ClassLoader的getResourceAsstream

装饰者模式

  • 作用:在不改变原有类的情况下增强原有类的功能
    • 原有类:A
    • LoggingA:装饰者类‘
  • KTV: 唱歌
  • HeimaKTV: 实现了KTV的基础功能,有唱歌功能
  • 需求:除了基本的唱歌功能,还需要灯光效果(不改变原有类代码)
    • 继承
    • 装饰
  • 装饰:
    • 本地不变还是KTV(实现KTV规范)
    • 需要基础KTV属性字段
    • 添加灯光效果
  • 总结:
    • 装饰者以及被装饰者应该是同一个类型
    • 如果被装饰者有功能实现那么自己不再重复实现直接使用被装饰者的功能,
    • 装饰者需要做的只是其他额外功能的实现

适配器模式

  • 对象:
    • 目标接口(我们想要什么类型)
    • 已存在实现(网线接口)
    • 适配(实现目标接口, 继承已有实现)
  • 目标
    • 已有sports接口(这是目标类型), 目前系统已有SportsExercise但其没有实现Sports接口;我要利用已有的实现,并且符合Sports规范

动态代理模式

  • 代理出来的对象和原本被代理对象没有任何关系, 只不过他们都有相同接口
  • 如果遇到不想增强的方法那么我们可以利用反射调用被代理对象的方法(这才是产生关联的原因)

你可能感兴趣的:(MyBatis基础入门-1)