mybatis iBatis

(1)mybatis是什么?

开源的持久层框架。
jdbc        代码繁琐                sql 性能好<br/>
hibernate   代码简洁 不用写sql 性能不好<br/>
mybatis     代码较简洁 要写sql 性能可以

(2)使用mybatis

1.导包。 mybatis,ojdbc
2.添加mybatis配置文件。
3.写实体类。
注:实体类的属性名与表的字段表要求一样。大小写不做要求。
4.写映射文件。
注:修改配置文件,指定映射文件的位置。
5.调用SqlSession提供的方法来访问数据库。

(3)基本原理

11

------------------------------------------------------------------------------------

<?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="oracle.jdbc.OracleDriver" />
                <property name="url"
                    value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
                <property name="username" value="scott" />
                <property name="password" value="tiger" />
            </dataSource>
        </environment>
    </environments>
    
    <!-- 映射文件的位置 -->
    <mappers>
        <mapper resource="entity/EmpMapper.xml" />

    </mappers>
</configuration>
package entity;

public class Emp {
    private Integer id;
    private String name;
    private Double 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 Double getAge() {
        return age;
    }
    public void setAge(Double age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Emp [id=" + id + ", name=" + name + ", age=" + age + "]";
    }
    
    
}
<?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="test">
    <insert id="save" parameterType="entity.Emp">
        insert into emps values(seq_emps.nextval,#{name},#{age})
    </insert>
    
    <!-- id:要求唯一。resultType:返回的数据类型。parameterType:参数类型 -->
    <select id="findAll" resultType="entity.Emp">
        select * from emps
    </select>
    
    <select id="findById" parameterType="int" resultType="entity.Emp">
        select * from emps where id = #{id1}
    </select>

</mapper>
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("Eric");
        emp.setAge(new Double(22));
        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() {
        List<Emp> emps = session.selectList("test.findById",2);
        System.out.println(emps);
        session.close();
    }
}

(4)返回Map类型的结果

13

1314

(5)实体类的

方法1. select id empId from emps
方法2.使用resultMap

package entity;

public class Emp2 {
    private Integer empId;
    private String name;
    private Double age;
    public Integer getEmpId() {
        return empId;
    }
    public void setEmpId(Integer empId) {
        this.empId = empId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Double getAge() {
        return age;
    }
    public void setAge(Double age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Emp2 [empId=" + empId + ", name=" + name + ", age=" + age + "]";
    }
    
}
<!-- 使用ResultMap解决表的字段名和实体类属性名不一致的情况 -->
    <select id="findById3" parameterType="int" resultMap="emp2Map">
        select * from emps where id = #{id1}
    </select>
    <!-- 处理表的字段名与实体类的属性名的对应关系。 -->
    <resultMap type="entity.Emp2" id="emp2Map">
        <result property="empId" column="id"/>
    </resultMap>
@Test
    public void test7() {
        List<Emp> emps = session.selectList("test.findById3",2);
        System.out.println(emps);
        session.close();
    }

(1)Mapper映射器

符合映射文件的接口。
注:mybatis会自动实现一个符合该接口要求的对象。

要求:

a.接口方法的名称与映射文件中的sql的id要一致。
b.方法的参数类型要与映射文件中的parameterType一致。
c.方法的返回类型要与映射文件当中的resultType一致。
此外,映射文件的namespace必须等于Mapper映射器的全限定名。

(1)Mapper映射器

符合映射文件的接口。
注:mybatis会自动实现一个符合该接口要求的对象。

要求:

a.接口方法的名称与映射文件中的sql的id要一致。
b.方法的参数类型要与映射文件中的parameterType一致。
c.方法的返回类型要与映射文件当中的resultType一致。
此外,映射文件的namespace必须等于Mapper映射器的全限定名。

<?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="oracle.jdbc.OracleDriver" />
                <property name="url"
                    value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
                <property name="username" value="scott" />
                <property name="password" value="tiger" />
            </dataSource>
        </environment>
    </environments>
    
    <!-- 映射文件的位置 -->
    <mappers>
        <mapper resource="entity/EmpMapper.xml" />

    </mappers>
</configuration>
package dao;

import entity.Emp;

/**
 * Mapper映射器。
 *
 */
public interface EmpDAO {
    public void save(Emp emp);
    public Emp findById(int id);
}
<?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.EmpDAO">
    <insert id="save" parameterType="entity.Emp">
        insert into emps values(seq_emps.nextval,#{name},#{age})
    </insert>
    
    <!-- id:要求唯一。resultType:返回的数据类型。parameterType:参数类型 -->
    <select id="findAll" resultType="entity.Emp">
        select * from emps
    </select>
    
    <select id="findById" parameterType="int" resultType="entity.Emp">
        select * from emps where id = #{id1}
    </select>
    
    <!-- 使用ResultMap解决表的字段名和实体类属性名不一致的情况 -->
    <select id="findById3" parameterType="int" resultMap="emp2Map">
        select * from emps where id = #{id1}
    </select>
    <!-- 处理表的字段名与实体类的属性名的对应关系。 -->
    <resultMap type="entity.Emp2" id="emp2Map">
        <result property="empId" column="id"/>
    </resultMap>

</mapper>
package test;

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
    /**
     * getMapper方法返回一个符合Mapper映射器(EmpDAO)要求的对象。
     */
    public void test1() {
        EmpDAO dao = session.getMapper(EmpDAO.class);
        Emp emp = new Emp();
        emp.setName("Johnson");
        emp.setAge(new Double(22));
        dao.save(emp);
        session.commit();
        session.close();
    }
    
    @Test
    public void test2() {
        EmpDAO dao = session.getMapper(EmpDAO.class);
        Emp emp = dao.findById(4);
        System.out.println(emp);
    }
    
}
posted @ 2019-09-09 01:18  menbozg  阅读(218)  评论(0编辑  收藏  举报