Mybatis 用Demo去入门 (使用数据库的查询操作测试)

一:首先知道什么叫 Mybatis      

      MyBatis 是支持普通 SQL查询存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
   每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。
用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。
二:执行流程:(比较抽象{拽文得大牛读得懂哈哈---} 可参照 Demo 理解)
 
(1)加载配置并初始化
触发条件:加载配置文件
处理过程:将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
(2)接收调用请求
触发条件:调用Mybatis提供的API
传入参数:为SQL的ID和传入参数对象
处理过程:将请求传递给下层的请求处理层进行处理。
(3)处理操作请求
触发条件:API接口层传递请求过来
传入参数:为SQL的ID和传入参数对象
处理过程:
(A)根据SQL的ID查找对应的MappedStatement对象。
(B)根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。
(C)获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。
(D)根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。
(E)释放连接资源。
(4)返回处理结果将最终的处理结果返回。
三:Demo 入门 Mybatis (本文最主要的部分)[后期提供相应的代码]
   首先看一下整个项目文件部署图:

         (1)创建项目-----接着导入相关的jar 包;

(稍后提供相应的源码)

        (2) 接着 创建好 相应的数据库表 (Demo的数据库名:hytc ;表名称:users)

          (3) 创建相应的 entity 实体类 Users (Demo中 类的私有属性和表重的元素----有些不同 这里大家先留意一下

  

package ankermaker.top.entity;
import java.util.Date;
/**
 * 
 * @author Ankermaker
 *  users 表对应的实体类
 */
public class Users {    
    protected Integer id;
    protected String name;
    protected String sex;
    protected String edu;
    protected Date birth;
    protected String remark;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getEdu() {
        return edu;
    }

    public void setEdu(String edu) {
        this.edu = edu;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }
    @Override
    public String toString() {
        return "Users [id=" + id + ", name=" + name + ", sex=" + sex + ", edu="
                + edu + ", birth=" + birth + ", remark=" + remark + "]";
    }

}

    (4)接下来创建 Mybatis 的 核心配置xml文件 (命名 没有要求 ),存放与src目录下;[Demo中 以 conf.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>
<!-- 为 实体映射 文件 创建别名映射 -->
<typeAliases>

    <package name="ankermaker.top.entity"/><!--这个 包下面的 所有 实体类 别名 自动 创建 -->

</typeAliases>

    <environments default="development"><!-- 环境池 配置 :default 属性值 默认环境名称 -->
        <environment id="development">
            <transactionManager type="JDBC" />
            <!-- 配置数据库连接信息 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/hytc" /><!-- 老陈写法:jdbc:mysql:///hytc -->
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
     
     <mappers>      
        <mapper resource="ankermaker/top/mappers/Usersmapper.xml"/>       
    </mappers>
</configuration>

      (5)接下来创建 mapper 映射操作xml文件 (这个文件的作用:简单的说:所有对表的增删改查操作 的sql 语句和 该文件映射的借口类中的方法 在给文件中注册体现;执行查询的方法有多种,通过 映射文件创建映射借口,用户调用Mapper接口中的方法,执行相应的sql语句 并返回查询结果!大家在测试之后 可以仔细的感受该文件的作用!!!)

      Demo中的Mapper 映射操作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="ankermaker.top.mappers.Usersmapper"><!-- 映射接口类的 路径!!! -->
     
     <!-- 实体类 中 与表名字 不同  使用 resultMap 来创建 别名映射!-->
     <resultMap type="users" id="userMap">
             <id column="u_id" property="id" jdbcType="INTEGER"/>
             <result column="u_name" property="name"/>
             <result column="u_sex" property="sex"/>    
     </resultMap>   
       <!-- 查询 所有 数据 测试! -->  
    <select id="getObjects" resultMap="userMap"> <!-- 直接引用 上面的 resultMap --> 
     
        select u_id,u_name,u_sex from users
        
    </select>
  
</mapper>

      (6)接下来创建 mapper映射文件的 映射接口类:接口类名和映射操作xml文件 名一样!!都为:Usersmapper

package ankermaker.top.mappers;

import java.util.List;


import ankermaker.top.entity.Users;

public interface Usersmapper {

    /**
     * 查询所有用户的信息
     * 
     * @return
     */
    public List<Users> getObjects();//测试 数据库获取所有的 记录 方法;


}

        (7)接了下就是测试 数据库操作的时候了  创建 测试类,

      

package ankermaker.top.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import ankermaker.top.entity.Users;
import ankermaker.top.mappers.Usersmapper;
public class AppText {

    private SqlSessionFactory sessionFactory;
    private static SqlSession session;
    private Usersmapper mapper;

    @Before
    public void setup() {
        String resource = "conf.xml";
        InputStream is = null;
        try {
            is = Resources.getResourceAsStream(resource);
            sessionFactory = new SqlSessionFactoryBuilder().build(is);
            session = sessionFactory.openSession();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Test
    public void getObjects() {
        // 分页查询
        // 获取 映射 借口 对象 ;
        mapper = session.getMapper(Usersmapper.class);
        List<Users> list = mapper.getObjects();

        for (Users u : list) {
            System.out.println(u + "测试成功");
        }
    }

    @After
    public void result() {
        if (sessionFactory != null) {
            sessionFactory = null;
        }
        if (session != null) {
            session = null;

        }
    }
}

  使用 junit test 测试 getObjects方法; 

四:问题分析:论ResultMap 的作用!

大家看Usersmapper.xml 中的resultMap标签的使用! 

<resultMap id="userMap" type="users">

  <id jdbcType="INTEGER" property="id" column="u_id"/>

  <result property="name" column="u_name"/>

  <result property="sex" column="u_sex"/>

</resultMap> 

....

select u_id,u_name,u_sex from users 

由于实体中的私有属性和表中的列名不一致所以要使用 ResultMap 这个标签让他们之间产生映射,Demo中不能展现的很清楚大家可以在测试 按条件查询的时候,会发现resultMap 的用处!

五:项目部署完成  但总感觉这篇写的没有什么思路希望大家看不明白了谅解,大家学习即可就好啦,我们大家一起进步;

项目源码下载

    
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/Ankermaker/p/6930903.html