zoukankan      html  css  js  c++  java
  • MyBatis 基础入门

    MyBatis 是一个半自动化的持久层的框架,能让开发者专注SQL本身

    JDBC 连接数据库的硬编码问题,通过config,mapper配置文件解决

    Mybatis开发需要关注的文件

    l POJO类(DTO、VO、PO等)

    l Mapper接口(就是dao接口)

    l Mapper映射文件

    全局配置文件

    MyBatis 架构原理

    说明

    1、 mybatis配置文件

    a) SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。

    b) Mapper.xml,此文件作为mybatis的sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。

    2、 SqlSessionFactory

    通过mybatis环境等配置信息构造SqlSessionFactory,即会话工厂。

    3、 sqlSession

    通过会话工厂创建sqlSession即会话,程序员通过sqlsession会话接口对数据库进行增删改查操作。

    4、 Executor执行器

    mybatis底层自定义了Executor执行器接口来具体操作数据库,Executor接口有两个实现,一个是基本执行器(默认)、一个是缓存执行器,sqlsession底层是通过executor接口操作数据库的。

    5、 Mapped Statement

    也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个selectinsertupdatedelete标签对应一个MappedStatement对象selectinsertupdatedelete标签的id即是Mapped statement的id。

    a) Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。

    b) Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

    Mybatis 程序运行步骤

    // 配置文件

    String resource = "SqlMapConfig.xml";

    InputStream inputStream = Resources.getResourceAsStream(resource);

    // 使用SqlSessionFactoryBuilder从xml配置文件中创建SqlSessionFactory

    sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 建造器模式

    // 数据库会话实例

    sqlSession = sqlSessionFactory.openSession(); //程序员用到的接口

    // 查询单个记录,根据用户id查询用户信息

    User user = sqlSession.selectOne("test.findUserById", 10);//namespace.id

    MyBatis  增删改查

     1.根据用户名模糊查询

    <select id="findUserByUsername" parameterType="java.lang.String" 

    resultType="com.kkb.mybatis.po.User">

       select * from user where username like '%${value}%'

    </select>

    测试:List<User> list = sqlSession.selectList("test.findUserByUsername", "小明");

    2.插入

    <insert id="insertUser" parameterType="com.kkb.mybatis.po.User">

      insert into user(username,birthday,sex,address)

      values(#{username},#{birthday},#{sex},#{address})

    </insert>

    sqlSession = sqlSessionFactory.openSession();

    // 添加用户信息

    User user = new User();

    user.setUsername("张小明");

    sqlSession.insert("test.insertUser", user);

    sqlSession.commit();

    3.删除

    <delete id="deleteUserById" parameterType="int">

    delete from user where id=#{id}

    </delete>

    执行:

    sqlSession.delete("test.deleteUserById",18);

    sqlSession.commit();

    4.修改

    <update id="updateUser" parameterType="com.kkb.mybatis.po.User">

    update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}

    where id=#{id}

    </update>

    User user = new User();

    user.setId(16);

    sqlSession.update("test.updateUser", user);

    sqlSession.commit();

    Mapper接口开发需要遵循以下规范:

    1、 Mapper接口的类路径Mapper.xml文件中的namespace相同。

    2、 Mapper接口方法名称Mapper.xml中定义的每个statement的id相同。

    3、 Mapper接口方法的输入参数类型mapper.xml中定义的每个sql 的parameterType的类型相同。

    4、 Mapper接口方法的返回值类型mapper.xml中定义的每个sql的resultType的类型相同。

    OGNL对象导航图语言

    |---User(参数值对象)

    |--username--张三

    |--birthday

    |--sex--

    |--dept -- Department

    |--name

    |--no

    OGNL表达式去获取Department对象的name属性dept.name

     #{}和${}区别

    区别1

    #{} 相当于JDBC SQL语句中的占位符? (PreparedStatement)

    ${}  : 相当于JDBC SQL语句中的连接符合 + (Statement)

    区别2

    #{}  进行输入映射的时候,会对参数进行类型解析(如果是String类型,那么SQL语句会自动加上’’)

    ${}  :进行输入映射的时候将参数原样输出到SQL语句中

    区别3

    #{}  如果进行简单类型String、Date、8种基本类型的包装类)的输入映射时,#{}中参数名称可以任意

    ${}  : 如果进行简单类型String、Date、8种基本类型的包装类)的输入映射时,${}中参数名称必须是value

     用到的设计模式

    代理模式 : mapper接口,实现类是框架通过JDK动态代理生成的 (实际就是原来的DAO,做了封装)

    工厂模式:  SqlSessionFactory  工厂模式生成SqlSession对象实例

    构造模式 :SqlSessionFactoryBuilder 根据主配置文件生成一个SqlSessionFactory

  • 相关阅读:
    ssdb使用笔记
    跟我学爬虫-2-使用正则表达式解析文本
    跟我学爬虫-1-爬虫简介
    python int函数转换浮点型字符串的坑???
    python使用smtplib和email发送腾讯企业邮箱邮件
    php文件之间传值的三种主流并且常用的方式
    验证码的输入框与图片不能对齐问题
    web前端命名规范
    css盒子模型
    css基础
  • 原文地址:https://www.cnblogs.com/bruce0706/p/11060524.html
Copyright © 2011-2022 走看看