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
原文地址:https://www.cnblogs.com/tangshengwei/p/6523644.html