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

    什么是 MyBatis?

    MyBatis是支持定制化SQL,存储过程以及高级映射的优秀的持久层框架.MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集.MyBatis可以对配置和原生Map使用简单的XMl或注解,将接口和Java的POJO(Plain Old java Objects,普通的Java对象)映射成数据库中的记录.


    MyBatis如何安装?

    jar包下载地址

    要使用MyBatis,只需要mybatis-x.x.x.jar文件置于classpath中即可,web项目把jar包放到WEB-INF下的lib包中
    如果使用Maven来构建项目,则需将下面dependency代码置于pom.xml文件中:

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifacId>
            <version>x.x.x</version> //版本号
        </dependency>
    

    MyBatis的功能架构

    我们把Mybatis的功能架构分为三层

    1. API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库.接口层一接受调用请求就会调用数据处理层来完成具体的数据处理.
    2. 数据处理层:负责具体的SQL查找.SQL解析.SQL执行和执行结果映射处理等.它主要的目的是根据调用的请求完成一次数据库操作
    3. 基础支撑层:负责最基础的功能支撑,包括连接管理,事务管理,配置加载和缓存处理,这些都是共有的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑

    MyBatis的优缺点

    优点:

    • 简单易学:本身就很小且简单.没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
    • 灵活:mybatis不会对应用程序或则数据库的现有设计强加任何影响。sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,获取更多。
    • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
    • 提供映射标签,支持对象与数据库的orm字段关系映射
    • 提供对象关系映射标签,支持对象关系组建维护
    • 提供xml标签,支持编写动态sql。

    缺点:

    • 编写SQL语句时工作量很大,尤其是字段多,关联表多时,更是如此
    • SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
    • 框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
    • 二级缓存机制不佳

    MyBatis的使用

    1.创建Mybatis的核心配置文件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">
    <!--通过这个配置文件,完成mybatis与数据库的连接  -->
    <configuration>	
        <!-- 注意此配置文件内的元素的  -->
        <!-- 引入database.properties文件 -->
        <properties resource="database.properties"/>  <!-- 可以配置在Java 属性配置文件中 -->
        <!--配置mybatis的log实现为LOG4J  -->
        <!-- 配置后,后台就会有sql语句的输出 -->
        <settings> <!-- 修改 MyBatis 在运行时的行为方式 -->
            <setting name="logImpl" value="LOG4J"/>
        </settings>
       <typeAliases> <!-- 为 Java 类型命名一个别名(简称) -->
          <package name="cn.smbms.pojo"/>
       </typeAliases>
     
        <environments default="development"> <!-- 环境 -->
            <environment id="development"> <!-- 环境变量 -->
                <!-- 配置事务管理 ,采用JDBC管理事务-->
                <transactionManager type="JDBC"/> <!-- 事务管理器 -->
                <!-- POOLED是mybatis的 数据源 -->
                <!-- JNDI是基于tomcat的数据源 -->
                <dataSource type="POOLED"> <!-- 数据源(UNPOOLED,POOLED,JNDI) -->
                    <property name="driver" value="${driver}"/>
                    <property name="url" value="${url}"/>
                    <property name="username" value="${username}"/>
                    <property name="password" value="${password}"/>
                </dataSource>
            </environment>
        </environments>
        <!-- pojo的映射文件UserMapper引入到配入到配置文件中 -->
        <mappers> <!-- 映射器 -->
            <!-- resource要写成路径 -->
            <mapper resource="cn/smbms/dao/UserMapper.xml"/>
        </mappers>
    </configuration>
    

    mybatis-config.xml文件的几个常用元素的作用如下:

    1.configuration:配置文件的根元素节点

    2.properties:通过resource属性从外部指定properties属性文件
    (database.properties),database.properties属性文件描述数据库连接的相关配置,包括数据库驱动 (jdbc.driver)、连接数据库的url(jdbc.url)、数据库用户名(jdbc.user)、数据库密码(jdbc.pwd),位置也在/resoureces目录下。

    3.settings:设置MyBatis运行中的一些行为,比如此处设置MyBatis的log日志实现为LOG4J,即使用 log4j实现日志功能。

    4.environments:表示配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上,该元素节点下可以配置多个environment子元素节点,但是必须指定其中一个默认运行环境(通过default指定)。

    5.environment:配置MyBatis的一套运行环境,需指定运行环境ID、事务管理、数据源配置等相关信息。

    6.mappers:作用是告诉MyBatis去哪里找到SQL映射文件(该文件内容是开发者定义的映射sql语句),整个项目中可以有1个或多个SQL映射文件

    7.mapper:mappers的子元素节点,具体指定SQL映射文件的路径,其中resource属性的值表述了sql
    映射文件的路径(类资源路径)
    注意:mybatis-config.xml文件的元素节点是有一定顺序的,节点位置若不按顺序排位,那么XML文件会报错

    2.接下来准备持久化类和SQL映射文件
    我们先来定义一个简单的类(user类) user类的属性也就是我们数据库中表的字段(user表)

    public class User {
    	private Integer id; //id 
    	private String userCode; //用户编码
    	private String userName; //用户名称
    	private String userPassword; //用户密码
    	private Integer gender;  //性别
    	private Date birthday;  //出生日期
    	private String phone;   //电话
    	private String address; //地址
    	private Integer userRole;    //用户角色
    	private Integer createdBy;   //创建者
    	private Date creationDate; //创建时间
    	private Integer modifyBy;     //更新者
    	private Date modifyDate;   //更新时间
    	//省略getter,setter方法
    

    注意:一般情况下我们的类名和数据库的表名都是一致的

    接下来进行SQL映射文件的创建,完成与POJO(实体类)的映射,该文件也是一个XML文件

    <?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="cn.smbms.dao.UserMapper">
    	<!--查询用户表记录数  -->
    		<select id="count" resultType="int">
    			select count(1) as count from smbms_user
    		</select>
    </mapper>
    
    

    经验:SQL映射文件一般都对应相应的POJO(实体类),所以一般都是采用POJO的名称+Mapper的规则来进行命名,比如我们创建的这个映射文件,名字叫做UserMapper.xml(映射文件放置与dao包下)

    上述配置文件中各元素的意义:
    mapper:映射文件的根元素节点,只有一个属性namespace
    namespace:用于区分不同的mapper,全局唯一
    select:表示查询语句,是MyBatis 常用的元素之一,常用属性如下:
    id属性:该命名空间下唯一标识符
    resultType属性:表示SQL语句返回值类型,此处通过SQL语句返回的是int类型

    接下来创建测试类,在工程中加入JUnit4,创建测试类(UserMapperTest.java)进行测试,代码如下:

    public class UserMapperTest {
        public static void main(String[] args) throws Exception {
            //1.读取全局配置文件:mybatis-config.xml
            String resource="mybatis-config.xml";
            //获取mybatis-config.xml文件的输入流
            InputStream is= Resources.getResourceAsStream(resource);
            //2.创建SqlSessionFactory对象
            SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
            //创建SqlSession
            int count=0;
            SqlSession sqlSession=null;
            sqlSession=factory.openSession();
            count=sqlSession.selectOne("com.smbms.dao.user.UserMapper.count");
            //3.关闭SqlSession对象
            sqlSession.close();
            System.out.println(count);
        }
    }
    

    由于我们每次执行SQL语句都要创建这些对象,所以说会有很多冗余代码,我们把这些重复的代码抽出来放到一个工具类中,以后直接调用这些工具类中的方法即可
    创建工具类:MyBatisUtil

    public class MyBatisUtil {
        private static SqlSessionFactory factory;
        static {
            try {
                InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
                factory=new SqlSessionFactoryBuilder().build(is);
            }catch (IOException e){
                e.printStackTrace();
            }
        }
        public static SqlSession createSqlSession(){
            return factory.openSession(false);
        }
        public static void closeSqlSession(SqlSession sqlSession){ 
        if (null!=sqlSession){
                sqlSession.close();
            }
        }
    }
    

    具体使用请看后面 SQLSession使用第二种方式

    MyBatis的基本要素-核心对象

    SqlSessionFactoryBuilder

    1.build()方法使用三种形式的配置信息,分别是InputStream(字节流)、Reader(字符流、Configuration(类)
    2.SqlSessionFactoryBuilder 大特点是用过即丢

    SqlSessionFactory

    1.openSession()方法获取SqlSession实例,openSession()传入参数true表示关闭事务控制,自动提交,false开启事务控制机制。默认为true。
    2.SqlSessionFactory一旦创建,就会在整个应用运行过程中始终存在。

    SqlSession

    1.SqlSession是用于执行持久化操作的对象,类似于JDBC中的Connection。
    2.SqlSession对应一次数据库会话,SqlSession不是线程安全的.
    3.SqlSession有两种使用方式

    第一种使用方式:
    1.现在Mapper文件中添加一个select节点

    <!--查询用户列表-->
    <select id="getUserList" resultType="com.smbms.pojo.User">
        SELECT * FROM USER
    </select>
    

    2.编写测试

    SqlSession sqlSession=null;
    List<User> userList=new ArrayList<User>(); 
    try{
        sqlSession= MyBatisUtil.createSqlSession();
        userList=sqlSession.selectList("com.smbms.dao.user.UserMapper.getUserList"); 
    }catch (Exception ex){
        ex.printStackTrace();
    }finally {
        MyBatisUtil.closeSqlSession(sqlSession);
    }
    for (User user :  userList) {
        System.out.println(user.getUserName());
    }
    

    第二种使用方式:
    基于上面的Mapper配置文件
    1.编写接口

    public interface UserMapper {
        /**
    *	获取用户列表
    *	@return
         */
        List<User> getUserList();
    }
    

    2.编写测试

    SqlSession sqlSession=null;
    List<User> userList=new ArrayList<User>(); 
    try{
        sqlSession= MyBatisUtil.createSqlSession();
        userList=sqlSession.getMapper(UserMapper.class).getUserList();
    }catch (Exception ex){
        ex.printStackTrace();
    }finally {
        MyBatisUtil.closeSqlSession(sqlSession);
    }
    for (User user : userList) {
        System.out.println(user.getUserName());
    }
    

    注意:推荐使用第二种方法

    by 安心

  • 相关阅读:
    数据结构与算法4—队列
    栈的应用——括号匹配
    迷宫求解
    python的socket编程
    数据结构与算法3—栈
    数据结构与算法2—链表
    数据结构与算法1—线性表
    增量解析
    ElementTree类
    节点序列化
  • 原文地址:https://www.cnblogs.com/anxin0/p/9896683.html
Copyright © 2011-2022 走看看