MyBatis初始

  MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis MyBatis是一个基于Java持久层框架。iBATIS提供的持久层框架包括SQL MapsData Access ObjectsDAOMyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java POJOsPlain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

  1. 框架:

       应用的半成品

    一个框架程序员可以配置的选择/选项越多,认为这款框架的可扩展性强。

    面向SQL的一个框架  SQL程序员入参自动装配返回值自动装配

       可重用的公共结构

       按一定规则组织的一组组件

  2. 组件

      Component

       对数据和方法的简单封装

       封装了特定功能和属性的一个对象

  3. 持久化,ORM

       持久化是程序数据在瞬时状态和持久状态间转换的过程

    ORM:(Object Relational Mapping)对象关系映射

     

    第一步创建核心配置文件

    第二步创建数据库表对应的实体类

    第三步创建Mapper配置文件,再加入核心配置文件

    第四步加载核心配置文件,创建SqlSessionFactory,使用工厂产生SqlSession

    第五步使用MyBatis的各种方法完成增删查改操作

     

     所使用的jar包需要:

    Idea创建maven工程慢的解决方案:

    -DarchetypeCatalog=internal:

    第一步:

    创建项目,我的完整版如下:

    大配置(mybatis-config.xml)里面写连接数据库的字符串:

package cn.ljl.test;

import cn.ljl.dao.DeptDao;
import cn.ljl.entity.Dept;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatisTest01 {
    /*查询所有*/
    @Test
    public void testall() {
        String path = "mybatis-config.xml";
        try {
            InputStream is = Resources.getResourceAsStream(path);
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
            SqlSession session = factory.openSession();
            List<Dept> list = session.selectList("cn.ljl.dao.DeptDao.getAllList");
            for (Dept dept : list) {
                System.out.println(dept.getUname());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /*按照id查询姓名*/
    @Test
    public void testgetMapper() {
        System.out.println("mapper");
        String path = "mybatis-config.xml";
        try {
            InputStream is = Resources.getResourceAsStream(path);
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
            SqlSession session = factory.openSession();
            DeptDao dao = session.getMapper(DeptDao.class);
            List<Dept> list = dao.getAllList();
            for (Dept dept : list) {
                System.out.println(dept.getUname());
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //02.带条件查询  resultMap的使用
    @Test
    public void testGetOneDeptResultMap() {
        System.out.println("resultMap");
        String path = "mybatis-config.xml";
        try {
            InputStream is = Resources.getResourceAsStream(path);
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
            SqlSession session = factory.openSession();
            DeptDao dao = session.getMapper(DeptDao.class);
            Dept dept = dao.getDeptResultMapById(1);
            System.out.println(dept.getUname());

        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

 

第二步:

  1. 编写MyBatis配置文件 mybatis-config.xml(以下是我的mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--根节点-->
    <typeAliases>
        <package name="cn.ljl.entity" ></package>
    </typeAliases>
    <environments default="development">  <!--环境-->
        <environment id="development">
            <transactionManager type="JDBC"/><!--事务管理机制:JDBC|Managed-->
            <dataSource type="POOLED">  <!--UNPooled,JNDI-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mybatiits"/>
                <property name="username" value="sa"/>
                <property name="password" value="ljl19980427"/>
            </dataSource>
        </environment>

    </environments>
    <mappers>
        <mapper resource="cn/ljl/dao/DeptDao.xml"/>
    </mappers>
</configuration>
  1. 创建实体类:(Dept

 public class Dept {
    private Integer uid;
    private String uname;
(不要忘记属性封装getset
    }
  1. 创建SQL映射文件 DeptDao.xml

    (我这里是三个方法)(这个是小配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPEmapper
        PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.ljl.dao.DeptDao">
    <!--resultMap-->
    <resultMap id="deptResultMap" type="Dept">
        <id property="uid" column="uid"></id>
        <result property="uname" column="uname"></result>
    </resultMap>
    <!--查询所有-->
    <select id="getAllList" resultType="Dept">
       select * from userinfo
</select>
    <!--按照id查询姓名-->
    <select id="getDeptById" parameterType="int" resultType="Dept">
          select * from userinfo where uid=#{uid}
</select>
    <!--按照id查询姓名 返回resultMap-->
    <select id="getDeptResultMapById" parameterType="int" resultMap="deptResultMap">
           select * from userinfo where uid=#{uid}
</select>
</mapper>
  1. 书写测试类

  package cn.ljl.test;

import cn.ljl.dao.DeptDao;
import cn.ljl.entity.Dept;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatisTest01 {
    /*查询所有*/
    @Test
    public void testall() {
        String path = "mybatis-config.xml";
        try {
            InputStream is = Resources.getResourceAsStream(path);
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSessionFactoryBuilderSqlSessionFactory没有关系,但是要用到)
            SqlSession session = factory.openSession();
            List<Dept> list = session.selectList("cn.ljl.dao.DeptDao.getAllList");
            for (Dept dept : list) {
                System.out.println(dept.getUname());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /*按照id查询姓名*/
    @Test
    public void testgetMapper() {
        System.out.println("mapper");
        String path = "mybatis-config.xml";
        try {
            InputStream is = Resources.getResourceAsStream(path);
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
            SqlSession session = factory.openSession();
            DeptDao dao = session.getMapper(DeptDao.class);
            List<Dept> list = dao.getAllList();
            for (Dept dept : list) {
                System.out.println(dept.getUname());
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //02.带条件查询  resultMap的使用
    @Test
    public void testGetOneDeptResultMap() {
        System.out.println("resultMap");
        String path = "mybatis-config.xml";
        try {
            InputStream is = Resources.getResourceAsStream(path);
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
            SqlSession session = factory.openSession();
            DeptDao dao = session.getMapper(DeptDao.class);
            Dept dept = dao.getDeptResultMapById(1);
            System.out.println(dept.getUname());

        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}
这里需要注意一个知识点:
 
 * MyBatis中执行事务的方式(执行完毕某个操作成功后以后不进行数据回滚)
 * 第一种方式:直接在openSession方法中添加参数true,自动提交的方式
 * 第二种方式:在完成整个逻辑操作后,添加代码session.commit();,完成事务的手动提交

以上就是上课的时候的一个小例子,下面介绍MyBatis的其他:

1、 mybatis配置 
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。 
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。

2、 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂 
3、 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。 
4、 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。 
5、 Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。 
6、 Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的Java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。 
7、 Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

输出映射(返回的结果集可以有哪些类型)

1)基本类型

2)pojo类型

3)List类型

动态sql:动态的拼接sql语句,因为sqlwhere条件有可能多也有可能少

1)where:可以自动添加where关键字,还可以去掉第一个条件的and关键字

2)if:判断传入的参数是否为空

3)foreach:循环遍历传入的集合参数

4)sql:封装查询条件,以达到重用的目的

 

对单个对象的映射关系:

1)自动关联(偷懒的办法):可以自定义一个大而全的pojo,然后自动映射其实是根据数据库总的字段名称和

pojo中的属性名称对应.

2)手动关联: 需要指定数据库中表的字段名称和javapojo类中的属性名称的对应关系.

使用association标签

 

对集合对象的映射关系

只能使用手动映射:指定表中字段名称和pojo中属性名称的对应关系

使用collection标签

springmybatis整合

整合后会话工厂都归spring管理

1)原生Dao实现:

需要在spring配置文件中指定dao实现类

dao实现类需要继承SqlSessionDaoSupport超类

dao实现类中不要手动关闭会话,不要自己提交事务.

2)Mapper接口代理实现:

spring配置文件中可以使用包扫描的方式,一次性的将所有mapper加载

 

逆向工程:自动生成Pojo,还可以自动生成Mapper接口和映射文件

注意:生成的方式是追加而不是覆盖,所以不可以重复生成,重复生成的文件有问题.

如果想重复生成将原来生成的文件删除

发布了31 篇原创文章 · 获赞 0 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章