zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Windows Phone 开发 MD5计算
    php 3des加密算法以及与java,.net,c#的交互的一致性
    <加密算法c#>——— 3DES加密之ECB模式 和 CBC模式
    Blend PathListBox 使用
    计算机的几种类型单词、快捷键
    【SQL Server】 数据定义语言(定义基本表、完整性约束实现、索引)
    【SQL Server】 数据查询语句
    【WindowsPhone】 独立存储
    终结,铭记
    Day 3,4,5
  • 原文地址:https://www.cnblogs.com/tangshengwei/p/6523644.html
Copyright © 2011-2022 走看看