zoukankan      html  css  js  c++  java
  • 初始mybatis

    框架的概念:

        应用程序的半成品;

        提供可用的公用结构;

        按一定规则组织的一组组件;

    主流框架的介绍:

      Struts 2框架:

        Struts 2以WebWork优秀的设计思想核心,吸收了Struts框架的部分优点,提供了一个更加整洁的MVC设计模式实现的Web应用程序框架。它引入了几个新的框架特性:从逻辑中分离出横切关注点的拦截器,减少或者消除额配置文                       件,贯穿整个框架的强大表达式语言,支持可变更和可重用MVC模式的标签API等。Struts 2充分利用了其他MVC框架学到的经验和教训,使整个框架更加清晰,更加灵活。

      Hibernate框架:

        Hibernate是一个优秀的持久化框架,负责简化将对象数据库保存到数据库中,或从数据库中读取数据并封装到对象的工作。Hibernat通过简单配置和编程即可替代JDBC烦琐的程序代码。Hibernate已经成为当前主流的数据库持久化框                     架,被广泛应用。

      Spring框架:

        Spring也是一个开源框架。它的目标是使现有的javaEE技术更容易使用和促进的编程习惯。它是一个轻量级的框架,渗透了javaEE技术的方方面面。它主要作为依赖注入容器和AOP实现存在,还是提供了声明式事务,对DAO层的支                 持等简化开发的功能。Spring还可以很方便地与SpringMVC,Struts2,mybatis,Hibernate等框架集成,其中大名鼎鼎的SSM集成框架指的就是基于SpringMVC+Spring+mybatis的技术框架,使用这个集成框架将使我们的应用程序更                 加健壮,稳固,轻巧和优雅,这也是当前最流行的java技术框架。

      SpringMVC框架:

        SpringMVC是Spring框架提供的构建Web应用程序的全功能MVCC模块,属于SpringFramework的后续产品,已经融合在Spring Web Flow里面,是结构最清晰的MVC Model2的实现。并且拥有高度的可配置性,支持多种视图的技术。                还可以进行定制开发,相当灵活。此外,Spring整合SpringMVC可以说是天缝集成,是一个高性能的架构模式。现在越来越广泛地应用于在互联网的开发中。

      MyBatis框架:

        MyBatis是一个优秀的数据库持久化层框架,在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM实现。其封装性要低于Hibernate,性能优秀,并且小巧,简单易学,现在应用也越来越广泛。

    mybatis和Hibernate框架的区别

      1.Hibernate是全自动化,而mybatis是半自动;

       Hibernate 完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成SQL。而mybatis仅有基本的字段映射,对象数据库以及对象实际关系仍然需要通过手写SQL来实现和管理;

      2.Hibernate数据库移植性远大于mybatis;

       Hibernate通过强大的映射结构和SQL语言,大大降低了对象与数据库(Oracle,mysql等)的耦合性,而mybatis由于需要写sql,因此与数据库的耦合性直接取决于程序员写sql的方法,如果sql不具通用性而用了很多某数据库特性的sql                语句的话,移植性也会随之降低很多,成本很高;

      3.Hibernate拥有完整的日志系统,mybatis则欠缺一些;

       Hibernate日志系统非常健全,涉及广泛,包括:sql记录,关系异常,优化警告,缓存提示,脏数据警告等;而mybatis则除了基本记录功能外,功能薄弱很多;

      4.mybatis相比Hibernate需要关心很多细节;

       Hibernate胚子要比mybatis复杂的很多,学习成本也比mybatis高,但也正因为mybatis使用简单,才导致它要比Hibernate关心很多技术细节。mybatis由于不用考虑很对细节,开发模式上于传统JDBC区别很小,因此很容易上手开发项·            目,但忽略细节会导致项目前期bug较多,因而开发出相对稳定的软件很慢,而开发软件却很快。Hibernate则正好与之相反。但是如果使用Hibernate很熟练的话,实际上开发效率丝毫不差于甚至超越mybatis。

      5.sql直接优化上,mybatis要比Hibernate方便很多;

       由于mybatis的sql都是写在xml里,因此优化sql比Hibernate方柏霓很多。而Hibernate的sql很多都是自动生成的,无法支架维护sql;虽有sql,但功能还是不急sql强大,见到报表等变态需求时,hql也歇菜,也就是说hql是由局限的;                   Hibernate虽然也支持原生sql,但开发模式上却与orm不同,需要转换思维,因此使用上不是非常方便。总之写sql的灵活度上Hibernate不急mybatis。

      总结:

        mybatis:小巧,方便,高效,简单,直接,半自动;

        hibernate:强大,方便,高效,负载,绕圈子,全自动;

    Struts 2 框架和SpringMVC框架的区别

      1.拦截机制不同

        Struts2是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype,然后通过setter,getter把request数据注入到属性。Struts2中,一个Action对应一个request,response上               下文,在接受参数时,可以通过属性接收,这说明属性参数是让对个方法共享的。Struts2中Action的一个方法可以对应一个url,而其他类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了,只能设计多例。

        SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又和一个url对应,参数的传递是直接注入到方法中,是方法所独有的。处理结果通过           ModeMaop返回给框架。在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,又因为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加                 @Scope注解修改。

        Struts2有自己拦截Interceptor机制,SpringMVC这是用的是独立Aop方式,这样导致Struts2配置文件量还是比SpringMVC大。

      2.底层框架的不同

        Strurs2采用Filter(StrutsPrepareAndExecuteFilter)实现,SpringMVC(DispatcherServlet)则采用Servlet实现。Filter在容器启动之后即初始化;服务器停止以后坠毁,晚于Servlet。Servlet在是在调用时初始化,先于Fileter调用,           服务器停止后销毁。

      3.性能方面

        Struts2类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,有加载一次单例模式bea注入。所以SpringMVC开发效率和性能高Struts2。

      4.配置方面

        SpringMVC和Spring是无缝的。从这个项目的管理和安全上也比Struts高。

    MyBatis三大基本要素

        ➢ 核心接口和类
        ➢ MyBatis 核心配置文件(mybatis-config.xml)
        ➢ SQL 映射文件(mapper.xml)

    MyBatis核心接口和类

        

       1、每个 MyBatis 的应用程序都以一个 SqlSessionFactory 对象的实例为核心,SqlSessionFactory 对象实例可以通过 SqlSessionFactoryBuilder 对象来获得。首先获取 SqlSessionFactoryBuilder 对象,可以根据 XML 配置文件或                    Configuration 类的实例构建该对象。然后获取 SqlSessionFactory 对象,有了 SqlSessionFactory 对象之后,就可以进而获取 Sqlsession 实例, Sqlsession 对象中完全包含以数据库为背景的所有执行 SQL 操作的方法。可以用该实例来            直接执行已映射的 SQL 语句。

      2、根据 XML 配置文件构建 SqlSessionFactory 的实例非常简单,建议使用。

        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);   //获取 SqlSessionFactory 对象实例
        SqlSession session = sqlSessionFactory.openSession();   //获取 SqlSession 对象实例
    
        try {
            //业务逻辑代码:如通过调用 session 对象的一系列 SQL 操作方法,对数据库表执行 CRUD 操作
            int count=session.selectOne("com.mybatis.dao.UserMapper.count", 2);  //方式 1
            int count= session.getMapper(UserMapper.class).count(2);  //方式 2:更简单,代码更安全,减少类型转换错误(推荐使用)
        } finally {
            session.close();    //关闭 SqlSession 
        }   
    
      说明:
           1、UserMapper mapper = session.getMapper(UserMapper.class);   //获取映射器实例 mapper 
         2、映射器是你创建绑定映射语句的接口,映射器接口的实例可以从 SqlSession 中获得,映射器实例的最佳范围是方法范围。即它们应该在使用它们的方法中被请求,然后就抛弃掉。它们不需要明确地关闭。
    SqlSessionFactoryBuilder
      SqlSessionFactoryBuilder作用
        SqlSessionFactoryBuilder 负责构建 SqlSessionFactory,并且提供了多个 build() 方法的重载,由于方法参数 environment 和 Properties 都可以为 null,那么去除重复的,真正的重载方法其实只有如下三种:
            build(Reader reader,String environment,Properties properties)
            build(InputStream inputStream,String environment,Properties properties)
            build(Configuration config)
        通过上述分析,发现配置信息可以以三种形式提供给 SqlSessionFactoryBuilder 的 build() 方法,分别是 InputStream(字节流)、 Reader(字符流)、 Configuration(类),由于字节流与字符流都属于读取配置文件的方式,所以从配置信息         的来源就很容易想到构建一个 SqlSessionFactory 有两种方式:读取 XML 配置文件构造方式和编程构造方式。我们采用读取 XML 配置文件的方式来构造 SqlSessionFactory。
      SqlSessionFactoryBuilder生命周期和作用域
         SqlSessionFactoryBuilder 的最大特点是:用过即丢。一旦创建了 SqlSessionFactory 对象之后,这个类就不再需要存在了,因此 SqlSessionFactoryBuilder 的最佳范围就是存在于方法体内,也就是局部变量而已。即最佳范围是方法                       范围 (本地方法变量)。
    SqlSessionFactory 
      SqlSessionFactory 作用
        SqlSessionFactory 简单的理解就是创建 SqlSession 实例的工厂。所有的 MyBatis 应用都是以 SqlSessionFactory 实例为中心, SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 对象来获得。有了它之后,顾名思义,就          可以通过 SqlSessionFactory 提供的 openSession() 方法来获取 SqlSession 实例。
        说明: openSession() 方法的参数为 boolean 值时,若传入 true 表示关闭事务控制,自动提交; false 表示开启事务控制。若不传入参数,默认为 true。
          openSession (boolean autoCommit)
          openSession()//若不传入参数,默认为 true ,自动提交
      SqlSessionFactory 生命周期和作用域
        SqlSessionFactory 对象一旦创建,就会在整个应用运行过程中始终存在。没有理由去销毁或再创建它,并且在应用运行中也不建议多次创建 SqlSessionFactory 。因此 SqlSessionFactory 的最佳作用域是 Application,即随着应                      用的生命周期一同存在。那么这种 “存在于整个应用运行期间,并且同时只存在一个对象实例” 的模式就是所谓的单例模式(指在应用运行期间有且仅有一个实例)。即 SqlSessionFactory 的最佳范围是应用范围。
    SqlSession
      SqlSession作用
        SqlSession 是用于执行持久化操作的对象,类似于 JDBC 中的 Connection 。它提供了面向数据库执行 SQL 命令所需的所有方法,可以通过 SqlSession 实例直接运行已映射的 SQL 语句。
      SqlSession生命周期和作用域  

        正如其名, SqlSession 对应着一次数据库会话。由于数据库会话不是永久的,因此 SqlSession 的生命周期也不应该是永久的。相反,在每次访问数据库时都需要创建它(注意:并不是说在 SqlSession 里只能执行一次 SQL,是完全可             以执行多次的,但是若关闭了 SqlSession ,那么就需要重新创建它)。创建 SqlSession 的地方只有一个,那就是 SqlSessionFactory 对象的 openSession()方法。

        需要注意的是:每个线程都有自己的 SqlSession 实例, SqlSession 实例不能被共享,也不是线程安全的。因此最佳的作用域范围是请求 request 范围或者方法范围。

        关闭 SqlSession 是非常重要的。必须要确保 SqlSession 在 finally 语句块中正常关闭。可以使用下面的标准方式来关闭:

          SqlSession session =sqlSessionFactory.openSession();
          try{
              //do work
          }finally{
              session.close();   //关闭 SqlSession 
          } 
    SqlSession两种使用方式
        
      //方式 1:通过 SQLSession 实例调用 selectList、selectOne 等方法来直接执行已映射的 SQL 语句。(不需要编写 DAO 接口)
        
            // MyBatis 通过 mapper 文件的 namespace 和子元素的 id 来找到相应的 SQL,从而执行查询操作
            userList=sqlSession.selectList("com.smbms.dao.UserMapper.getUserList"); 
    
        说明:
            1、com.smbms.dao.UserMapper.getUserList=namespace+id
            2、使用方式一可以不用写接口中的方法,因为方式一直接执行映射文件的 SQL 语句。
         3、执行 CRUD 操作,有参数传递时此方式不适用,应使用方式 2。
    
      //方式 2:基于 mapper 接口方式操作数据。(官方推荐使用)
    
            //创建绑定映射语句的接口 UserMapper.java,并提供接口方法 getUserList(),该接口称为映射器。
             userList=sqlSession.getMapper(UserMapper.class).getUserList();
    
           说明:
              1、接口的方法必须与 SQL 映射文件中 SQL 语句的 id 一一对应。
              2、第二种方式是通过 SQLSession 实例调用 getMapper(Mapper.class) 执行 Mapper 接口方法来实现对数据库的查询操作。
              3、第一种方式是旧版本的 MyBatis 提供的操作方式,虽然现在也可以正常工作,但是第二种方式是 MyBatis 官方所推荐使用的,其表达方式也更加直白。代码更加清晰,类型安全,也不用担心易错的字符串字面值以及强制类型转换。

    获取SqlSession工具类(MyBatisUtil.java)

      此 MyBatisUtil.java 文件是优化后获取 SqlSession ,关闭 SqlSession 的公用工具类

        package cn.mybatis.util;
    
        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 MyBatisUtil {
        
            private static SqlSessionFactory sessionFactory;
        
            static{//在静态代码块下,sessionFactory 只会被创建一次
                try {
                    //读取 mybatis-config.xml 文件
                    InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
                    //创建SqlSessionFactoryBuilder对象
                    SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
                    //利用SqlSessionFactoryBuilder对象 去构建sessionFactory工厂
                    sessionFactory = sessionFactoryBuilder.build(in);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        
            //创建sqlSession
            public static SqlSession getSqlSession(){
                //利用sessionFactory工厂对象去生产sqlSession
                SqlSession sqlSession = sessionFactory.openSession(false);//false代表不会自动提交事务,true 代表自动提交事务
                return sqlSession;
            }
        
            //关闭sqlSession
            public static void close(SqlSession sqlSession){
                if(sqlSession!=null){
                    sqlSession.close();
                }
            }
        }
     MyBatis的基本要素——核心配置文件

      MyBatis 核心配置文件( mybatis-config.xml),该文件配置了 MyBatis 的一些全局信息,包含数据库连接信息和 MyBatis 运行时所需的各种特性,以及设置和影响 MyBatis 行为的一些属性。

    mybatis-config.xml文件结构

      mybatis-config.xml 文件需配置一些基本元素,需要注意的是,该配置文件的元素节点是有先后顺序的,其层次结构如下图: 

          

       说明:

          1、从上图中可以看出,configuration 元素是整个 XML 配置文件的根节点,其角色就相当于是 MyBatis 的总管, MyBatis 所有的配置信息都会存放在它里面。 MyBatis 还提供了设置这些配置信息的方法。 Configuration 可从配置                          文件里获取属性值,也可以通过程序直接设置。Configuration 可供配置的内容如下。

          2、mybatis-config.xml  文件的元素节点是有一定顺序的,节点位置若不按顺序排位,那么 XML 文件会报错

    jdbc.properties文件

        driver=com.mysql.jdbc.Driver
        url=jdbc:mysql:///smbms
        user=root
        password=123

    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>
            <properties resource="jdbc.properties"></properties>
            <!-- 环境配置 -->
            <environments default="development">
                <environment id="development">
                    <transactionManager type="JDBC"/>
                    <!-- 数据库连接相关配置 ,这里动态获取config.properties文件中的内容-->
                    <dataSource type="POOLED">
                        <property name="driver" value="${driver}" />
                    <property name="url" value="${url}" />
                    <property name="username" value="${user}" />
                    <property name="password" value="${password}" />
                </dataSource>
                </environment>
            </environments>
            <!-- mapping文件路径配置 -->
            <mappers>
                <mapper resource="com/mybatis/Dao/UserMapper.xml"/>
                <!-- 如果没有UserMapper.xml文件 就需要以下操作 要在对应的接口中写注释方法 -->
                <!--<mapper class="com.mybatis.Dao.UserMapper"></mapper>-->
            </mappers>
        </configuration>

    小配置文件(名称必须与Dao接口名相同)

        <?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指定Dao接口的完整类名
        mybatis会依据这个接口动态创建一个实现类去实现这个接口,
        而这个实现类是一个Mapper对象-->
        <mapper namespace="com.mybatis.Dao.UserMapper">
            <!-- parameterType:参数类型
                   resultType:返回的结果类型
                   id:对应Dao接口的方法-->
            <select id="getOne"  resultType="com.mybatis.entity.User">
                SELECT * FROM smbms_user
            </select>

            <delete id="del"  parameterType="int" >
                DELETE FROM smbms_user WHERE id=#{id}
            </delete>

            <insert id="add" parameterType="com.mybatis.entity.User" >
                INSERT INTO smbms_user(userCode,userName,userPassword,gender,birthday,phone,address,userRole,createdBy,creationDate)
                    VALUES (#{userCode},#{userName},#{userPassword},#{gender},#{birthday},#{phone},#{address},#{userRole},#{createdBy},#{creationDate})
            </insert>

            <update id="update" parameterType="com.mybatis.entity.User">
                    UPDATE smbms_user SET userCode=#{userCode} WHERE id=#{id}
            </update>
        </mapper>

     接口中实现注解方式编写SQL

      如果不想编写小配置文件需编写注释

          

    使用注解测试SQL

        

      

  • 相关阅读:
    浅谈软件测试流程
    在9个点上画10条直线,要求每条直线上至少有三个点
    word中快速插入时间
    多核处理器时,__rdtsc()的使用编程珠玑第一章
    解决 error LNK2019: 无法解析的外部符号 问题
    修改IE代理
    overload重载 override覆盖 overwirte重写
    几个题目
    12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球。
    在link.c中已经include了头文件了,为什么使用ld还无法识别mian和printf?
  • 原文地址:https://www.cnblogs.com/wnwn/p/11594883.html
Copyright © 2011-2022 走看看