zoukankan      html  css  js  c++  java
  • Mybatis入门

    1、mybatis 介绍   : mybatis是一个持久层框架,他是对jdbc的完美的封装

    2、mybatis和hibernate的区别 :

          1、Mybatis不是一个完全的ORM的框架,hibernate是一个完全的ORM的框架

          2、工作效率: mybatis的开发的工作量相对较大,hibernate的开发效率比较高

          3、SQL灵活:mybatis支持自定义sql,对SQL的支持较好。hibernate对SQL支持相对较差

          4、没有更好的框架,只有最适合的框架。要根据当前的业务、场景来决定选择哪种框架

    3、Mapper的代理方式 :

          1、接口的权限定类名要和mapeer的映射文件中的namespace一致
          2、接口的方法名称要和映射文件中statementId 保持一致
          3、接口的方法的 参数类型 要和 映射文件中的 parameterType 保持一致
          4、接口的方法的返回值类型要和 映射文件中的 resultType 保持一致

    4、

      4.1 #{}${} 区别   :

            #{}表示一个占位符号通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类 型值或pojo属性值 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

            ${}表示拼接sql通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value

      4.2 parameterTyperesultType

    parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。

    resultType:指定输出结果类型,mybatissql查询结果的一行记录数据映射为resultType指定类型的对象。

     4.3 mysql自增主键返回

    通过修改sql映射文件,可以将mysql自增主键返回:

    <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">

    <!-- selectKey将主键返回,需要再返回 -->

    <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">

    select LAST_INSERT_ID()

    </selectKey>

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

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

    </insert>

    添加selectKey实现将主键返回

    keyProperty:返回的主键存储在pojo中的哪个属性

    orderselectKey的执行顺序,是相对与insert语句来说,由于mysql的自增原理执行完insert语句之后才将主键生成,所以这里selectKey的执行顺序为after

    resultType:返回的主键是什么类型

    LAST_INSERT_ID():mysql的函数,返回auto_increment自增列新记录id值。

    4.4、Mysql使用 uuid实现主键

    需要增加通过select uuid()得到uuid

    <insert  id="insertUser" parameterType="cn.itcast.mybatis.po.User">

    <selectKey resultType="java.lang.String" order="BEFORE"

    keyProperty="id">

    select uuid()

    </selectKey>

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

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

    </insert>

    注意这里使用的order是“BEFORE

     

     5、配置内容 :

     SqlMapConfig.xml中配置的内容和顺序如下

    properties(属性)

    settings(全局配置参数)

    typeAliases(类型别名)

     typeHandlers(类型处理器)

     objectFactory(对象工厂)

     plugins(插件)

     environments(环境集合属性对象)

      environment(环境子属性对象)

        transactionManager(事务管理)

        dataSource(数据源)

    mappers(映射器)

    6、SqlSession的使用范围

    SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等。

    通过SqlSessionFactory创建SqlSession,而SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建。

    6.1 、SqlSessionFactoryBuilder

    SqlSessionFactoryBuilder用于创建SqlSessionFacotySqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。

    6.2、SqlSessionFactory

    SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory

    6.3、 SqlSession

    SqlSession是一个面向用户的接口, sqlSession中定义了数据库操作方法。

    每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。

    打开一个 SqlSession;使用完毕就要关闭它。通常把这个关闭操作放到 finally 块中以确保每次都能执行关闭。如下:

    SqlSession session = sqlSessionFactory.openSession();

    try {

       // do work

    } finally {

       session.close();

    }

        

        

  • 相关阅读:
    linux下wc命令详解
    用shell脚本监控进程是否存在 不存在则启动的实例附带if判断详细条件
    shell脚本输出给字体带颜色
    在centos6.5下安装配置docker
    php lock_sh共享锁 与 lock_ex排他锁
    hadoop streaming 多路输出 [转载]
    gzip压缩及测试方法【转载】
    天空没有翅膀的痕迹,而我已飞过
    logrotate机制与原理[转载]
    服务器 数据库 问题定位的几个工具
  • 原文地址:https://www.cnblogs.com/lijingbo/p/7441382.html
Copyright © 2011-2022 走看看