MyBatis初始

来源:互联网 发布:怎么申请开通80端口 编辑:程序博客网 时间:2024/06/04 18:54

  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接口和映射文件

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

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

原创粉丝点击