JAVA从入门到精通之MyBatis入门
沉沙 2019-08-07 来源 : 阅读 808 评论 0

摘要:本篇文章探讨了JAVA从入门到精通之MyBatis入门,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

本篇文章探讨了JAVA从入门到精通之MyBatis入门,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

JAVA从入门到精通之MyBatis入门

"

1、MyBatis的介绍

  1. MyBatis 是一个支持普通SQL查询,存储过程和高级映射的优秀持久层(Dao)框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。

  2. MyBatis 消除了几乎所有的JDBC代码和手工设置参数以及结果集的检索。

  3. MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

  4. 一个MyBatis的应用程序都以一个SqlSessionFactory 对象(单例)的实例为核心;

    SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法。

  5. MyBatis是针对数据库交互的一个辅助框架,也是对jdbc做了的简单封装,以xml配置代替Java代码来管理数据库的交互细节!!

  注意:

    JPA 可以自动建表。

    MyBatis不能自动创建表,如果要建表,必须自己先准备好建表的sql语句。

MyBatis三大核心对象
    1. SqlSessionFactoryBuilder
          目的是创建SqlSessionFactory  ,  用完就扔  , 写在方法内部 , 作为局部变量 , 建造者模式。
    2. SqlSessionFactory
          重量级对象 , 作用域整个应用  , 单例模式使用  , 有二级缓存。
    3. SqlSession
        轻量级的  ,  请求作用域,一个请求对应一个SqlSession对象 , 线程不安全的 , 有一级缓存。
    4. (扩展)Executor 数据库的操作都是调用的Executor接口的方法
                update:增、删、改所用方法。
                query:查询所用方法。

MyBatis执行流程: 

  ①:我们需要核心文件(提供联系数据库的环境)

  ②:需要映射文件(提供ORM与运行的SQL语句)

  ③:拿到SqlSession对象,用于执行SQL

2、MyBatis的入门使用

  注意:

    使用Mybatis的方式用两种,一种是xml配置的方式,一种是接口+注解的方式。

    这里主要是介绍xml配置方式。

  1.导入相应的jar包

    核心包:mybatis-3.2.1.jar

    数据库驱动包:mysql-connector-java-5.1.26-bin.jar

    依赖包:
           
asm-3.3.1.jar
            cglib-2.2.2.jar
            commons-logging-1.1.1.jar
            javassist-3.17.1-GA.jar
            log4j-1.2.17.jar
            slf4j-api-1.7.2.jar
            slf4j-log4j12-1.7.2.jar

  2.准备相应的数据

数据库-->新建数据库-->新建表-->插入测试数据

   3.准备domain实体类、dao和测试类

    注意:类的名称和类型都和我们的product表相对应匹配

  案例:

domain实体类

                              Long dir_id;
  
}

dao层接口

public interface IProductDao {    /**
     * 添加一个商品     */    void save(Product p);    /**
     * 更新一个商品     */    void update(Product product);    /**
     * 删除一个商品     */    void delete(Long id);    /**
     * 查询一个商品     */
    Product findOne(Long id);    /**
     * 查询所有商品     */
    List findAll();
}

dao层接口实现类 

  注:添加、修改、删除的时候一定要记住提交事务(配置事务、表结构支持事务)。

    JDBC的事务是自动提交的,而JPA、Hibernate、MyBatis事务都是需要手动提交的。

package cn.wang.dao.daoImpl;import cn.wang.Utils.MyBatisUtils;import cn.wang.dao.IProductDao;import cn.wang.domain.Product;import org.apache.ibatis.session.SqlSession;import java.util.ArrayList;import java.util.List;public class ProductDaoImpl implements IProductDao {    //抽取sql命名空间名字的值    private final String NAMESPACE = ""cn.wang.domain.ProductMapper."";    //添加方法    @Override    public void save(Product p) {
        SqlSession sqlSession =null;        try {            //获取SqlSession对象(MyBatisUtils是为了方便专门抽取出来的工具类)
            sqlSession = MyBatisUtils.getSession();            //第一个参数:sql命名空间名字的值+对应sql语句映射的id,第二个参数:传入的值
            sqlSession.insert(NAMESPACE+""insert"",p);            //提交事务            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {            //关闭sqlSession,释放资源(很重要,不然项目上线后会造成内存溢出)            MyBatisUtils.colseSession(sqlSession);
        }
    }    //修改方法    @Override    public void update(Product product) {
        SqlSession sqlSession = null;        try {            //获取SqlSession对象(MyBatisUtils是为了方便专门抽取出来的工具类)
            sqlSession = MyBatisUtils.getSession();            //第一个参数:sql命名空间名字的值+对应sql语句映射的id,第二个参数:传入的值
            sqlSession.update(NAMESPACE+""update"", product);            //提交事务            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {            //关闭sqlSession,释放资源(很重要,不然项目上线后会造成内存溢出)            MyBatisUtils.colseSession(sqlSession);
        }
    }    //删除方法    @Override    public void delete(Long id) {
        SqlSession sqlSession=null;        try {            //获取SqlSession对象(MyBatisUtils是为了方便专门抽取出来的工具类)
            sqlSession = MyBatisUtils.getSession();            //第一个参数是获取查询语句:sql命名空间名字的值+对应sql语句映射的id
            sqlSession.delete(NAMESPACE+""delete"", id);            //提交事务            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {            //关闭sqlSession,释放资源(很重要,不然项目上线后会造成内存溢出)            MyBatisUtils.colseSession(sqlSession);
        }
    }    //查询一条数据    @Override    public Product findOne(Long id) {
        SqlSession sqlSession = null;
        Product product= null;        try {            //获取SqlSession对象(MyBatisUtils是为了方便专门抽取出来的工具类)
            sqlSession = MyBatisUtils.getSession();            //第一个参数是获取查询语句:sql命名空间名字的值+对应sql语句映射的id
            product = sqlSession.selectOne(NAMESPACE+""findOne"", id);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {            //关闭sqlSession,释放资源(很重要,不然项目上线后会造成内存溢出)            MyBatisUtils.colseSession(sqlSession);
        }        return product;
    }    //查询所有数据    @Override    public List findAll() {
        SqlSession sqlSession=null;
        List list=new ArrayList<>();        try {            //获取SqlSession对象(MyBatisUtils是为了方便专门抽取出来的工具类)
            sqlSession = MyBatisUtils.getSession();            //第一个参数是获取查询语句:sql命名空间名字的值+对应sql语句映射的id
            list=sqlSession.selectList(NAMESPACE+""findAll"");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {            //关闭sqlSession,释放资源(很重要,不然项目上线后会造成内存溢出)            MyBatisUtils.colseSession(sqlSession);
        }        return list;
    }
}

抽取出来的MyBatisUtils工具

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 java.io.Reader;public class MyBatisUtils {    //保证sqlSessionFactory是单例    private static SqlSessionFactory sqlSessionFactory;    // SqlSessionFactory类似于JPA的EntityManagerFactory,Hibernate的SessionFactory    // SqlSession 类似于JPA的EntityManager,Hibernate的Session    //该类被加载的时候就执行该静态代码块    static {        try {
            Reader reader = Resources.getResourceAsReader(""MyBatis-Config.xml"");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (Exception e) {//异常的类型要写大一些,才能够看到具体的报错            e.printStackTrace();
        }
    }    //提供一个外界调用的类    public static SqlSession getSession(){        //创建并返回SqlSession对象        return sqlSessionFactory.openSession();
    }    //关闭sqlSession,释放资源(很重要,不然项目上线后会造成内存溢出)    public static void colseSession(SqlSession sqlSession){        if(sqlSession !=null){
            sqlSession.close();
        }
    }
}

jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///数据库名称jdbc.username=用户名
jdbc.password=密码

  3.MyBatis核心配置文件(mybatis-config.xml

                                    -->

  4.配置映射文件(命名方式:domain实体类名称+Mapper.xml

   注意:

    ① 我们的映射文件在这里是和它对应的domain实体类在同一个层级
        ② 这个映射文件的名称一般叫做 XxxMapper.xml (Xxx代表的是实体类名称)
        ③ namespace的名称为了确定唯一性,请大家根据我的要求取名
            如我们有一个类:
            cn.itsource.domain.Product / cn.itsource.domain.Student
            那这里取名应该是:
            cn.itsource.domain.ProductMapper /cn.itsource.domain.StudentMapper
        ④ 类型都通通使用全限定名

      本文由职坐标整理发布,学习更多的相关知识,请关注职坐标IT知识库!

本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程