mybatis 基础

2018-09-02  本文已影响16人  两分与桥

1.mybatis是什么?

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

2.mybatis编程步骤:

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

maven 导包

  <dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.46</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.2.8</version>
    </dependency>
  </dependencies>

实例:对Emp表的增删改查

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

package entity;

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

在entity中建立EmpMapper.xml文件

<?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">

!-- namespace 的值是 DeptMapper 接口
  每个Mapper 接口对应一个配置文件  -->
<mapper namespace="test">
        id:要求唯一
        resultType:返回结果的类型
        parameterType:参数类型
    <insert id="save" parameterType="entity.Emp">
        INSERT INTO emp(name, age) VALUES(#{name},#{age})
    </insert>
    <select id="findAll" resultType="entity.Emp">
        SELECT * FROM emp
    </select>

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

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

    <delete id="delete" parameterType="int">
        DELETE FROM emp WHERE id=#{id}
    </delete>   
</mapper>

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

<?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" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url"
                    value="jdbc:mysql://localhost:3306/test" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
    <!-- 映射文件的位置,对应上面的-->
    <mappers>
        <mapper resource="entity/EmpMapper.xml" />
    </mappers>
</configuration> 

测试对数据库的增删改查操作,在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<Emp> 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基本原理.png

4.返回Map类型的结果

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

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

    !-- 返回Map类型的结果 -->
    <select id="findById2" parameterType="int" resultType="map">
        SELECT * FROM emp WHERE id=#{id}
    </select>

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解决表的字段名与实体类的属性名不一致的情况 -->
    <select id="findById3" parameterType="int" resultMap="emp2Map">
        SELECT * FROM emp WHERE id=#{id}
    </select>
    
    !-- 处理表的字段名与实体类的属性名的对应关系,列出不一样的即可 -->
    <resultMap type="entity.Emp2" id="emp2Map">
        <result property="eno" column="id"></result>
        <result property="ename" column="name"></result>
    </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<Emp> 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<Emp> 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();
    }
}
上一篇 下一篇

猜你喜欢

热点阅读