mybatis 基础

1.mybatis是什么?

开源的持久层框架。
 jdbc     代码繁琐     sql        性能好
 hibernate  代码简洁   不用写sql   性能不好
 mybatis   代码简洁    要写sql     性能一般

2.mybatis编程步骤:

a.导包,mybatis mysqljdbc junit
b.添加mybatis配置文件
c.写实体类,实体类的属性名与表的字段名要求一致,大小写无所谓
d.写映射文件,修改配置文件,指定映射文件的位置。
e.调用SqlSession提供的方法来访问数据库。

maven 导包

  
    
        mysql
        mysql-connector-java
        5.1.46
    
    
        junit
        junit
        4.12
        test
    
    
        org.mybatis
        mybatis
        3.2.8
    
  

实例:对Emp表的增删改查

首先是在包entity下建立实体类Emp

package entity;

public class Emp {
    private Integer id;
    private String name;
    private Double age;
}
省略一堆的get/set方法

在entity中建立EmpMapper.xml文件




!-- namespace 的值是 DeptMapper 接口
  每个Mapper 接口对应一个配置文件  -->

        id:要求唯一
        resultType:返回结果的类型
        parameterType:参数类型
    
        INSERT INTO emp(name, age) VALUES(#{name},#{age})
    
    

    

    
        UPDATE emp SET name=#{name}, age=#{age} WHERE id=#{id}
    

    
        DELETE FROM emp WHERE id=#{id}
       

在resource文件夹中建立SqlMapConfig.xml文件,作为mybatis的配置文件

  

 -- 数据库连接参数配置

    
        
            
            
                
                
                
                
            
        
    
    
    
        
    
 

测试对数据库的增删改查操作,在test文件夹中建包test,创建类TestCase,mybatis默认不自动提交,需要commit(有些数据库不支持事务)

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 entity.Emp;

public class TestCase {
    private SqlSession session;
    
    @Before
    public void init() {
        SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
        SqlSessionFactory ssf = ssfb.build(TestCase.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml"));
        session = ssf.openSession();
    }
    
    @Test
    public void test1() {
        Emp emp = new Emp();
        emp.setName("wolf");
        emp.setAge(22.0);
        session.insert("test.save", emp);
        session.commit();
        session.close();
    }
    
    @Test
    public void test2() {
        List emps = session.selectList("test.findAll");
        System.out.println(emps);
        session.close();
    }
    
    @Test
    public void test3() {
        Emp emp = session.selectOne("test.findById", 4);
        System.out.println(emp);
        session.close();
    }
    
    @Test
    public void test4() {
        Emp emp = session.selectOne("test.findById", 4);
        System.out.println(emp);
        emp.setName("never stop");
        emp.setAge(38.0);
        System.out.println(emp);
        session.update("test.modify", emp);
        session.commit();
        session.close();
    }
    
    @Test
    public void test5() {
        session.delete("test.delete",7);
        session.commit();
        session.close();
    }
}

3.mybatis的基本原理

mybatis 基础_第1张图片
mybatis基本原理.png

4.返回Map类型的结果

mybatis会将查询结果先封装到一个Map对象里面(以字段名作为key,
以字段值作为vlaue),然后再将Map对象中的数据添加到实体对象里面。

在EmpMapper.xml文件中添加一段(只需要修改返回值类型即可)

    !-- 返回Map类型的结果 -->
    

TestCase测试类中测试代码

    @Test
    public void test6() {
        Map map = session.selectOne("test.findById2", 6);
        System.out.println(map);
        System.out.println(map.get("name"));    
    }

打印:
{name=white wolf, id=6, age=22}
white wolf

5.使用ResultMap,解决实体类的属性名与表的字段名不一致的情况。

    !-- 使用ResultMap解决表的字段名与实体类的属性名不一致的情况 -->
    
    
    !-- 处理表的字段名与实体类的属性名的对应关系,列出不一样的即可 -->
    
        
        
    

实体类参数
    private Integer eno;
    private String ename;
    private Double age;

数据库表字段:id,name,age

利用Mapper映射器接口

(1)什么是Mapper映射器?
符合映射文件的接口,mybatis会自动实现一个符合该接口要求的对象。

(2)Mapper映射器的要求:
    a.接口方法的名称与映射文件中的sql的id要一样。
    b.方法的参数类型要与映射文件当中的parameterType一致。
    c.方法的返回类型要与映射文件当中的resultType一致。
    此外,映射文件的namespace必须等于Mapper映射器的权限定名。
    
(3)编程步骤
    a.写一个映射器(即一个接口)
    b.调用SqlSession提供的getMapper方法。
    注:该方法会返回一个符合映射器要求的对象。

使用的还是上面的EmpMapper.xml文件

package dao;

import java.util.List;
import entity.Emp;

 * Mapper映射器
public interface EmpDAO {
    public void save(Emp emp);
    
    public List findAll();
    
    public Emp findById(int id);
    
    public void modify(Emp emp);
    
    public void delete(int id); 
}
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.EmpDAO;
import entity.Emp;

public class TestCase {
    private SqlSession session;
    
    @Before
    public void init() {
        SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
        SqlSessionFactory ssf = ssfb.build(TestCase.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml"));
        session = ssf.openSession();
    }
    
    @Test
    public void test1() {

         * getMapper方法返回一个符合Mapper映射器(EmpDAO)要求的对象。
         * 动态代理
        EmpDAO dao = session.getMapper(EmpDAO.class);
        Emp emp = new Emp();
        emp.setName("json");
        emp.setAge(66.0);
        dao.save(emp);
         * 任然需要提交事务
        session.commit();
        session.close();
    }
    
    @Test
    public void test2() {
        EmpDAO dao = session.getMapper(EmpDAO.class);
        List emps = dao.findAll();
        System.out.println(emps);
        session.close();
    }
    
    @Test
    public void test3() {
        EmpDAO dao = session.getMapper(EmpDAO.class);
        Emp emp = dao.findById(2);
        System.out.println(emp);
        session.close();
    }
    
    @Test
    public void test4() {
        EmpDAO dao = session.getMapper(EmpDAO.class);
        Emp emp = dao.findById(2);
        emp.setAge(22.0);
        dao.modify(emp);
        session.commit();
        session.close();
    }
    
    @Test
    public void test5() {
        EmpDAO dao = session.getMapper(EmpDAO.class);
        dao.delete(8);
        session.commit();
        session.close();
    }
}

你可能感兴趣的:(mybatis 基础)