美文网首页
mybatis 基础

mybatis 基础

作者: 两分与桥 | 来源:发表于2018-09-02 19:28 被阅读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();
        }
    }
    

    相关文章

      网友评论

          本文标题:mybatis 基础

          本文链接:https://www.haomeiwen.com/subject/phomwftx.html