zoukankan      html  css  js  c++  java
  • 【MyBatis】 MyBatis入门

    1、MyBatis简介

    MyBatis是这个框架现在的名字,而此框架最早的名字是IBatis,其名字的含义是“internet”、“abatis”两个单词的组合,是在2002年的时候开始的一个开源项目,在2010年6月16日Apache将项目交与Google进行管理,更名MyBatis。所以2010年之后,MyBatis框架逐渐成为主流,比Hibernate发展更快。

    IBatis和MyBatis两者的操作原理是相同的。IBatis变为了MyBatis之后,核心操作没有改变,但是配置部分有部分变化。

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

    持久层发展:实体Bean的设计思想 → JDO → Hibernate → MyBatis → JPA标准。MyBatis的性能优于Hibernate。

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

    2、第一个MyBatis程序

    本次使用Eclipse的Maven进行项目的构建,在pom.xml文件中添加如下代码;如果使用普通Java项目按需添加Jar包即可。

    <dependency>
        <groupId>org.mybatis</groupId>                
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.39</version>
    </dependency>

    在项目下新建目录:config,将config目录添加到classpath中(Build Path)。

    范例:配置数据库信息config/dbconfig.properties

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF8
    username=root
    password=mysqladmin

    范例:MyBatis核心配置文件config/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="dbconfig.properties"/>
      
      <environments default="development">     <!-- 定义数据库连接池 -->
        <environment id="development">         <!-- 一个数据库的资源配置 -->
          <transactionManager type="JDBC"/>    <!-- 进行事务管理 -->
          <dataSource type="POOLED">           <!-- 配置数据源 -->
              <!-- 数据库的驱动程序路径,配置的mysql驱动包中的类名称 -->
            <property name="driver" value="${driver}"/>
            <!-- 数据库的连接地址 -->
            <property name="url" value="${url}"/>
            <!-- 数据库连接的用户名 -->
            <property name="username" value="${username}"/>
            <!-- 数据库的连接密码 -->
            <property name="password" value="${password}"/>
          </dataSource>
        </environment>
      </environments>
      
      <!-- 配置的是每一张表的映射文件 -->
      <mappers>
        <!-- 映射文件路径, 与POJO类同包 -->
        <mapper resource="com/github/logsave/pojo/EmpMapper.xml"/> 
      </mappers>
    </configuration>

    对于一些配置做如下解释:

    1. 关于“<transactionManager type="jdbc" /> ”配置
      此处表示进行事务的配置,但是在MyBatis中有两种事务配置方式:
      • JDBC :表示使用 JDBC 这种比较简单的方式进行事务的提交或回滚,同时它依赖于从数据源得到的连接来管理事务形式;
      • MANAGED:此配置几乎没有什么用处,它即不提交事务也不回滚事务,而是让容器来管理整个生命周期(例如:Spring 就是一个容器,负责所有对象的生命周期的控制) 。
    2. 关于“<dataSource type="POOLED"> ”配置
      dataSource 主要使用基本的 JDBC 数据源接口来配置 JDBC 连接对象。而在 MyBatis 之中提供有三种可用的数据源配置类型:
      • UNPOOLED:这个数据源的实现是每次请求时简单打开和关闭连接操作。不过它的性能有一些慢,如果是一些简单的应用程序可以适用,因为它不需要及时取得可用连接。不过不同的数据库对此操作的表现也有所不同,所以对某些数据库来说配置数据源不重要,那么使用的机会也就少了,几乎不用;
      • POOLED :是 JDBC 连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间,速度会快一些,这个是现在开发之中主要使用的形式;
      • JNDI:使用一些容器里面配置的数据库连接池,此处就是配置一个名称引用。
    3. 关于“<mappers> ”配置
      这块为 MyBatis 的核心配置,主要是利用它来决定操作的数据表。

    建立一张emp表,创建对应的简单Java类也是Emp类。

    范例:建立数据库脚本

    -- 创建'mybatis'数据库
    CREATE DATABASE mybatis CHARACTER SET UTF8;
    -- 创建'emp'数据表
    CREATE TABLE emp (
            empno         INT(4),
            ename         VARCHAR(10) NOT NULL ,
            job          VARCHAR(9) ,
            mgr          INT(4) ,
            hiredate      DATE ,
            sal          DOUBLE(7,2) ,
            PRIMARY KEY (empno)
    );

    范例:定义简单Java类--Emp.java

    package com.github.logsave.pojo;
    import java.util.Date;
    public class Emp {
        private Integer empno;
        private String ename;
        private String job;
        private Integer mgr;
        private Date hiredate;
        private double sal;
        public Integer getEmpno() {
            return empno;
        }
        public void setEmpno(Integer empno) {
            this.empno = empno;
        }
        public String getEname() {
            return ename;
        }
        public void setEname(String ename) {
            this.ename = ename;
        }
        public String getJob() {
            return job;
        }
        public void setJob(String job) {
            this.job = job;
        }
        public Integer getMgr() {
            return mgr;
        }
        public void setMgr(Integer mgr) {
            this.mgr = mgr;
        }
        public Date getHiredate() {
            return hiredate;
        }
        public void setHiredate(Date hiredate) {
            this.hiredate = hiredate;
        }
        public double getSal() {
            return sal;
        }
        public void setSal(double sal) {
            this.sal = sal;
        }
        @Override
        public String toString() {
            return "Emp [empno=" + empno + ", ename=" + ename + ", job=" + job
                    + ", mgr=" + mgr + ", hiredate=" + hiredate + ", sal=" 
                    + sal + "]";
        }
    }

    此时虽然建立了Java类,但是简单Java类一定需要一个与它配合的映射文件。数据库Emp表对应的简单Java类是Emp.java,与Java类同一路径下新建EmpMapper.xml文件。

    范例:定义EmpMapper.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">
      <!--     每个POJO都对应MyBatis的一个命名空间,不能重复。
    设置命名空间,可以与不同表的同类型操作进行区分,使用时以“namespace.id”的方式调用。
    命名空间任意命名,均可正常调用,确保唯一性,一般按表名称实体类或表名称。 resultType使用全路径。
    --> <mapper namespace="com.github.logsave.pojo.EmpMapper"> <select id="selOne" resultType="com.github.logsave.pojo.Emp"> SELECT * FROM emp WHERE empno = #{empno} </select> <insert id="creatOne" parameterType="com.github.logsave.pojo.Emp"> INSERT INTO emp(empno,ename,job,mgr,hiredate,sal) VALUES (#{empno},#{ename},#{job},#{mgr},#{hiredate},#{sal}) </insert> </mapper>

    增加操作之中是针对于简单Java类之中的内容进行取出并填充,所以在访问属性的时候使用“#{属性名称}”,编写SQL语句时最后一定不要加“;”。

    多个XML配置文件及POJO之间相互引用,初学MyBatis容易出错。配置文件之间的引用关系如下图:

     

    范例:编写程序完成数据增加操作

    package com.github.logsave.test;
    
    import java.io.IOException;
    import java.io.Reader;
    import java.util.Date;
    
    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 com.github.logsave.pojo.Emp;
    
    public class Test01 {
        
        public static void creat(SqlSession sqlSession) {
            Emp emp = new Emp();
            /**
             *  测试时运行第二次会报错:Duplicate entry '7499' for key 'PRIMARY'
             *  原因是主键冲突了,修改Empno即可。
             */
            emp.setEmpno(7499); 
            emp.setEname("ALLEN");
            emp.setJob("SALESMAN");
            emp.setMgr(7695);
            emp.setHiredate(new Date());
            emp.setSal(1600.00);
            
            System.out.println("数据更新行数:" 
                    + sqlSession.insert("com.github.logsave.pojo.EmpMapper.creatOne",emp));
            sqlSession.commit();            // 事务提交
        }
        
        public static void selectByEmpNo(SqlSession sqlSession,int empno) {
            System.out.println(sqlSession.selectOne("com.github.logsave.pojo.EmpMapper.selOne",empno));
        }
            public static void main(String[] args) {
            
            try {
                // 1、取得操作的SqlSession对象
                String resource = "mybatis-config.xml";                  // MyBatis配置文件路径
                Reader reader = Resources.getResourceAsReader(resource); // 当前配置文件输入流
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); // 数据库会话工厂
                SqlSession sqlSession = sqlSessionFactory.openSession(); // 取得连接
                
                // 2、操作简单Java类    
    //            creat(sqlSession);                     // 增加数据
                selectByEmpNo(sqlSession,7499);          // 按empno查询数据
        
                sqlSession.close();        // 关闭连接
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    }

    此时数据库之中已经正常保存了我们添加的数据。

    总结一下MyBatis操作的步骤:

    • 通过 Resources 取得配置文件(mybatis-config.xml )的信息,通过 Resource 取得一个 Reader 对象路径;
    • 通过此 Reader对象肯定要读取配置,读取的配置用于实例化 SqlSessionFactoryBuilder 类对象,通过 SqlSessionBuilder 来建立 SqlSessionFactory 类对象;
    • 利用 SqlSessionFactory 打开 SqlSession 对象;
    • 利用 SqlSession 来实现数据的 CRUD 操作;
    • 如果是更新则提交事务后关闭连接。

    程序源码

  • 相关阅读:
    ACM Red and Black
    ACM Wooden Stricks
    ACM Strange fuction
    ACM pie
    ACM Doing Homework again
    ACM FatMouse' Trade
    ACM 今年暑假不AC
    ACM Ignatius and the Princess II
    一、数组---第三大的数
    一、数组---移动零※※※※※※
  • 原文地址:https://www.cnblogs.com/yan-lei/p/10311776.html
Copyright © 2011-2022 走看看