Unit07: MyBatis框架简介 、 MyBatis基本应用

  Unit07: MyBatis框架简介 、 MyBatis基本应用  

1. myBatis

(1)myBatis是什么?

是一个开源的持久层框架。

注:myBatis底层仍然是jdbc。

(2)编程步骤

step1. 导包。

mybatis,ojdbc,junit。

step2. 添加配置文件。

注:配置文件主要包含连接池的配置和映射文件的位置。

step3. 写实体类。

注:属性名必须跟表的字段名一样(大小写不区分)。

step4. 写映射文件。

注:映射文件主要包含的是sql语句。

step5. 使用SqlSession提供的方法来访问数据库。

(3)基本原理

(4)返回Map类型的结果

myBatis会将查询到的记录放到一个Map对象里面(会以字段名为key, 字段值作为value),然后再将Map对象里面的数据放到实体对象里面。

(5)解决表的字段名与实体类的属性名不一致的情况

方式一:使用别名来解决。

方式二: 使用ResultMap来解决。

(6)Mapper映射器

Mapper映射器是什么?

是符合映射文件要求的接口。

注:myBatis会依据该接口的要求生成一个相应的实例。

具体要求:

a. 方法的名称必须与sql的id一样。

b. 方法的返回值类型必须与sql的resultType一样。

c. 方法的参数类型必须怀sql的parameterType一样。

d. 映射文件的namespace必须等于该接口的完整的名称。

如何使用?

step1. 先按照映射文件要求写好相应的接口,比如EmployeDAO。

step2. 调用SqlSession的方法获得符合映射器要求的对象。

代码示例:

src/main/java

dao (Mapper映射器的接口类)

package dao;

import java.util.List;
import java.util.Map;

import entity.Employee;
import entity.Employee2;

/**
 * Mapper映射器
 *
 */
public interface EmployeeDAO {
    public void save(Employee e);
    public List<Employee> findAll();
    public Employee findById(int id);
    public void modify(Employee e);
    public void delete(int id);
    public Map findById2(int id);
    public Employee2 findById3(int id);
}

EmployeeDAO.java

entity

  Employee2.java类,测试表里字段名,和数据库中的字段名不一致时情况。

package entity;

public class Employee {
    private Integer id;
    private String name;
    private Integer age;

    @Override
    public String toString() {
        return "Employee [id=" + id + ", name=" + name + ", age=" + age + "]";
    }
    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 Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }

}

Employee.java

package entity;

public class Employee2 {
    private Integer empNo;
    private String ename;
    private Integer age;

    @Override
    public String toString() {
        return "Employee2 [empNo=" + empNo + ", ename=" + ename + ", age=" + age + "]";
    }

    public void setEmpNo(Integer empNo) {
        this.empNo = empNo;
    }
    public void setEname(String ename) {
        this.ename = ename;
    }
    public void setAge(Integer age) {
        this.age = age;
    }

}

Employee2.java

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
 "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">

<mapper namespace="dao.EmployeeDAO">
    <!--
        id:要求唯一
        parameterType:参数类型,要写类的完整的名称。
     -->
    <insert id="save"
        parameterType="entity.Employee">
        INSERT INTO emp_czh
        VALUES(emp_czh_seq.nextval,#{name},#{age})
    </insert>

    <!--
        resultType:返回类型,要写类的完整的名称。
     -->
    <select id="findAll"
        resultType="entity.Employee">
        SELECT * FROM emp_czh
    </select>

    <select id="findById"
        parameterType="int"
        resultType="entity.Employee">
        SELECT * FROM emp_czh
        WHERE id = #{id1}
    </select>

    <update id="modify"
        parameterType="entity.Employee">
        UPDATE emp_czh SET name = #{name},
        age = #{age} WHERE id = #{id}
    </update>

    <delete id="delete" parameterType="int">
        DELETE FROM emp_czh WHERE id = #{id1}
    </delete>

    <!-- 返回Map类型的结果 -->
    <!--
        map是java.util.Map的简写形式
     -->
    <select id="findById2" parameterType="int"
        resultType="map">
        SELECT * FROM emp_czh WHERE id = #{id1}
    </select>

    <!--
        resultMap告诉mybatis表的字段名
        与实体类的属性名的对应关系。
        (如果表的字段名与属性名相同,则不用写了)
     -->
    <resultMap type="entity.Employee2"
        id="empResultMap">
        <result property="empNo" column="id"/>
        <result property="ename" column="name"/>
    </resultMap>

    <select id="findById3" parameterType="int"
        resultMap="empResultMap">
        SELECT * FROM emp_czh WHERE id = #{id1}
    </select>
</mapper>

EmpMapper.xml

src/main/resources

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
    "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
    <environments default="environment">
        <environment id="environment">
            <transactionManager type="JDBC" />
            <!-- mybatis自带的连接池 -->
            <dataSource type="POOLED">
                <property name="driver"
                value="oracle.jdbc.driver.OracleDriver" />
                <property name="url"
                    value="jdbc:oracle:thin:@192.168.201.227:1521:orcl" />
                <property name="username" value="openlab" />
                <property name="password" value="open123" />
            </dataSource>
        </environment>
    </environments>
    <!-- 告诉mybatis,映射文件的位置 -->
    <mappers>
        <mapper resource="entity/EmpMapper.xml" />
    </mappers>

</configuration> 

SqlMapConfig.xml

src/test/java

test

  TestCase2.java测试使用映射器的情况。

package test;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import entity.Employee;
import entity.Employee2;

public class TestCase {
    private SqlSession session;
    @Before
    //执行测试方法(比如test1方法)之前,
    //@Before方法会先执行。
    public void init(){
        /*
         * 先要获得SqlSession,然后再调用
         * SqlSession提供的方法来访问数据库。
         */
        //step1. 创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder ssfb =
            new SqlSessionFactoryBuilder();
        //step2. 创建SqlSessionFactory对象
        SqlSessionFactory ssf =
            ssfb.build(
            TestCase.class.getClassLoader()
            .getResourceAsStream("SqlMapConfig.xml"));
        //step3. 创建SqlSession对象
         session =
                ssf.openSession();
    }

    @Test
    public void test1(){
        //step4. 调用SqlSession提供的方法访问数据库
        Employee e = new Employee();
        e.setName("Tom");
        e.setAge(22);
        session.insert("test.save", e);
        //step5. 提交事务
        //session.commit();
        //step6.关闭session
        session.close();
    }

    @Test
    public void test2(){
        List<Employee> employees =
            session.selectList("test.findAll");
        System.out.println(employees);
        session.close();
    }

    @Test
    public void test3(){
        Employee e =
                session.selectOne(
                        "test.findById", 5);
        System.out.println(e);
        session.close();
    }

    @Test
    public void test4(){
        Employee e =
                session.selectOne(
                        "test.findById", 5);
        e.setAge(e.getAge() + 20);
        session.update("test.modify",
                e);
        session.commit();
        session.close();
    }

    @Test
    public void test5(){
        session.delete("test.delete", 5);
        session.commit();
        session.close();
    }

    @Test
    //测试 返回Map类型的结果
    public void test6(){
        Map data =
            session.selectOne(
                    "test.findById2", 6);
        /*
         * oracle数据库中,表的字段名都是大写的。
         */
        System.out.println(data.get("NAME"));
        session.close();
    }

    @Test
    //测试  解决实体类属性与表的字段名不一致的情况
    public void test7(){
        Employee2 e =
            session.selectOne(
                    "test.findById3",6);
        System.out.println(e);
        session.close();
    }
}

TestCase.java

package test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import dao.EmployeeDAO;
import entity.Employee;

public class TestCase2 {
    private SqlSession session;
    @Before
    //执行测试方法(比如test1方法)之前,
    //@Before方法会先执行。
    public void init(){
        /*
         * 先要获得SqlSession,然后再调用
         * SqlSession提供的方法来访问数据库。
         */
        //step1. 创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder ssfb =
            new SqlSessionFactoryBuilder();
        //step2. 创建SqlSessionFactory对象
        SqlSessionFactory ssf =
            ssfb.build(
            TestCase.class.getClassLoader()
            .getResourceAsStream("SqlMapConfig.xml"));
        //step3. 创建SqlSession对象
         session =
                ssf.openSession();
    }
    @Test
    public void test1(){
        //获得符合映射器(接口)要求的对象
        EmployeeDAO dao =
                session.getMapper(
                        EmployeeDAO.class);
        Employee e = new Employee();
        e.setName("Eric");
        e.setAge(23);
        dao.save(e);
        //仍然需要提交事务
        session.commit();
        session.close();
    }

    @Test
    public void test2(){
        EmployeeDAO dao =
                session.getMapper(
                        EmployeeDAO.class);
        List<Employee> employees =
                dao.findAll();
        System.out.println(employees);
        session.close();
    }

    @Test
    public void test3(){
        EmployeeDAO dao =
                session.getMapper(EmployeeDAO.class);
        Employee e = dao.findById(6);
        System.out.println(e);
        session.close();
    }
}

TestCase2.java

  <dependencies>
      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.2.8</version>
      </dependency>
      <dependency>
          <groupId>com.oracle</groupId>
          <artifactId>ojdbc14</artifactId>
          <version>10.2.0.4.0</version>
      </dependency>
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
      </dependency>
  </dependencies>

pom.xml

时间: 2024-10-22 20:29:53

Unit07: MyBatis框架简介 、 MyBatis基本应用的相关文章

MyBatis框架简介

1.什么是MyBatis MyBatis最早源自Apache基金会的一个开源项目iBatis,2010年这个项目有Apache software foundation迁移到了google code,并且改名为MyBatis; MyBatis是支持普通查询SQL查询,存储过程和高级映射查询的优秀持久层框架 MyBatis封装了几乎所有的JDBC代码和参数的手工设置以及结果集的检索: MyBatis使用简单的XML或注解做配置和定义映射关系,将Java的POJOs(Plain Old Java Ob

MyBatis 框架简介

MyBatis 1.MyBatis简介:     1):MyBatis是开源的持久层框架.     2):利用JDBC抽象出持久层实现.     3):提供了简单易用的API与数据库进行交互.     4):MyBatis3起源于2001年的iBatis,添加了注解和映射支持. MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动.创建connection.创建statement.手动设置参数.结果集检

Mybatis框架(9)---Mybatis自定义插件生成雪花ID做为表主键项目

Mybatis自定义插件生成雪花ID做为主键项目 先附上项目项目GitHub地址 spring-boot-mybatis-interceptor 有关Mybatis雪花ID主键插件前面写了两篇博客作为该项目落地的铺垫. 1.Mybatis框架---Mybatis插件原理 2.java算法---静态内部类实现雪花算法 该插件项目可以直接运用于实际开发中,作为分布式数据库表主键ID使用. 一.项目概述 1.项目背景 在生成表主键ID时,我们可以考虑主键自增 或者 UUID,但它们都有很明显的缺点 主

【MyBatis框架】MyBatis入门程序第二部分

我们通过写一个简单的MyBatis小项目来在实战中学习MyBatis,接着上一篇继续 我们开始实现需求中的添加和删除用户功能 (1)向数据库中添加用户数据 使用User.xml,加入添加用户的sql语句. [html] view plain copy <!-- 添加用户 parameterType:指定输入参数类型是pojo(包括用户信息) #{}中指定POJO的属性名,接收到POJO对象的属性值,mybatis通过OGNL获取对象的属性 --> <insert id="ins

mybatis框架(6)---mybatis插入数据后获取自增主键

mybatis插入数据后获取自增主键 首先理解这就话的意思:就是在往数据库表中插入一条数据的同时,返回该条数据在数据库表中的自增主键值. 有什么用呢,举个例子: 你编辑一条新闻,同时需要给该新闻打上标签(可以一个或者多个:比如:女性,爱,钱等等),然后存储到数据库中.怎么存,肯定涉及到三张表,新闻表,标签表,新闻标签id关联表 新闻表插入数据简单,标签表插入数据简单.那新闻标签表呢,如何关联,那是不是需要新闻表和标签表插入数据的时候,返回它们的主键Id然后再存储到新闻标签表中. 这种场景还是蛮常

MyBatis框架及ORM

1.MyBatis框架简介 MyBatis 是一个开源的数据持久层框架(持久指的是瞬时到持久).它内部封装了通过JDBC访问数据库的操作,支持普通的SQL查询,存储过程的高级映射,几乎消除了所有JDBC 的代码和参数的手工设置以及结果集的检索.MyBatis作为持久层的框架,期主要思想是将程序中的大量SQL语句剥离出来,配置在配置文件中,实现SQL的灵活配置.这样做的好处 是将SQL与程序代码分离,可以在不修改程序代码的情况下,直接在配置文件中修改SQL. 2.什么是ROM ROM(Object

3.3.1 MyBatis框架介绍

MyBatis框架介绍 1. 什么是框架 (1) 框架是偷懒的程序员将代码进行封装, 之后进行重复使用的过程. (2) 框架其实是一个半成品, 以连接数据库为例, 连接数据库使用的驱动, url, 用户名 , 密码必须告知框架. (3) 程序员在使用框架的时候, 通常以配置文件的方式告知框架需要的信息, 多数会使用 xml 作为框架的配置文件. (4) 因此, 在使用框架开发代码时, 需要编写配置文件, 代码的编写反而会减少. (5) 框架都是第三方提供的, 提供的都是 jar 包. 因此, 使

MyBatis框架学习

MyBatis框架 1.MyBatis框架简介 目的(最大的作用):实现sql语句和java代码的分离,替代的是mvc模式中的Dao层,是持久层框架. 搭建方式: 1.配置mybatis全局配置文件: a.固定的文件头,根标签为<configuration></configuration>: b.在根标签内存在多个标签,<settings></settings>:设置日志文件打印内容的标签: <typeAliases></typeAlias

初识Mybatis框架,实现增删改查等操作

此第一次接触Mybatis框架确实是有点不适应,特别是刚从Hibernate框架转转型过来,那么为什么要使用Mybatis框架,Mybatis框架和Hibernate框架又有什么异同呢? 这个问题在我的另一篇blogs中有专门的讲解,今天我主要是带着大家来探讨一下如何简单的使用Mybatis这个框架 可能有的朋友知道,Mybatis中是通过配置文件来实现这个的,这里面有很多的东西,我们就一点一点的讲吧 我们想要配置成功,首要的就是jar包,先从官网下载相应的jar包作为程序的支撑 有了jar包之