栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Mybatis学习

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Mybatis学习

1.概念

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

持久化:就是将程序的数据从瞬时状态向持久状态转化的过程;

瞬时状态:内存中的数据是瞬时状态的数据;

持久状态:数据库、io文件中的数据是持久状态的数据;

MyBatis SQL Mapper Framework for Java;

功能包括:

        sql映射:表中的一行数据映射为一个java对象;

数据访问(DAO):对数据库执行增删改查;

mybatis封装了connection,statement,resultset,及其关闭方法,提供了循环sql结果集的能力,开发人员只需要提供sql语句即可;

2.mapper文件

dao/接口名.xml







    
    
        select * from y_movie
    

    
        insert into y_movie(m_name,m_director,m_up_year,m_adddate) values(#{m_name},#{m_director},#{m_up_year},#{m_adddate})
    
3.主配置文件-初步

resources/mybatis.xml






    
    
        
        
            
            
            
            
                
                
                
                
                
            
        
    
    
    
        
        
    
4.查询/新增数据-初步
public static void main(String[] args) throws IOException {

        // 访问mappers文件读取student数据
        // 1.获取mybatis主配置文件的名称,从类文件的根目录开始(target/classes/)
        String config = "mybatis.xml";
        // 2.读取文件
        InputStream in = Resources.getResourceAsStream(config);
        // 3.创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        // 4.创建SqlSessionFactory对象
        SqlSessionFactory factory = builder.build(in);
        // 5.从SqlSessionFactory中获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        // 6.获取要执行的Sql语句的标识,sql映射文件的namespace+"."+标签id
        String sqlId = "org.mybatisTest.dao.MovieDAO.selectMovie";
        // 7.执行sql语句
        List listMovie = sqlSession.selectList(sqlId);
        // 输出结果
        listMovie.forEach(ms -> System.out.println(ms.getM_name()));
        sqlSession.close();
    };

//新增
public static void Add() throws IOException {
        // 访问mappers文件读取student数据
        // 1.获取mybatis主配置文件的名称,从类文件的根目录开始(target/classes/)
        String config = "mybatis.xml";
        // 2.读取文件
        InputStream in = Resources.getResourceAsStream(config);
        // 3.创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        // 4.创建SqlSessionFactory对象
        SqlSessionFactory factory = builder.build(in);
        // 5.从SqlSessionFactory中获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        // 6.获取要执行的Sql语句的标识,sql映射文件的namespace+"."+标签id
        String sqlId = "org.mybatisTest.dao.MovieDAO.insertMovie";
        // 7.执行sql语句
        Movie m = new Movie();
        Date m_adddate = new Date();
        m.setM_adddate(m_adddate);
        m.setM_name("战争之王2");
        m.setM_up_year(2016);
        m.setM_director("詹姆斯2");
        int count = sqlSession.insert(sqlId, m);
        // sqlSession默认不会自动提交,需要手动提交事务;
        sqlSession.commit();
        // 输出结果
        System.out.println(count);
    }
5.mybatis主配置文件设置日志

必须配置,对代码调试非常重要;

    
        
        
    
6.主要类的介绍

Resources: mybatis中的一个类,负责读取主配置文件

InputStream in = Resources.getResourceAsStream(config);

SqlSessionFactoryBuilder : 创建SqlSessionFactory对象

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);

SqlSessionFactory : 用来获取SqlSession对象,重量级对象,该对象创建耗时较长,占用资源较多,在整个项目中,有一个就够了;

SqlSession sqlSession = factory.openSession();

openSession方法:

//true表示获取自动提交事务的sqlSession,默认为false
factory.openSession(boolean);

SqlSession:接口,定义了操作数据库的方法,selectOne,selectList,insert,update....

SqlSession实现类:DefaultSqlSession;

SqlSession是非线程安全的,需要在方法内部使用,在执行sql语句之前,使用openSession获取SqlSession,在执行完sql语句之后需要关闭他,SqlSession.close();这样才能保证他是线程安全的;

7.封装SqlSession
public class MybatisUtils {

    private static SqlSessionFactory factory = null;
    static {
        // mybatis主配置文件
        String config = "mybatis.xml";
        InputStream in;
        try {
            in = Resources.getResourceAsStream(config);
            factory = new SqlSessionFactoryBuilder().build(in);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public static SqlSession getSqlSession() {
        SqlSession sqlSession = null;
        if (factory != null) {
            sqlSession = factory.openSession();
        }
        return sqlSession;
    }
}
8.编写DAO接口与实现类与mybatis的动态代理
//接口操作Movie表
public interface MovieDAO {

    // 查询movie表所有数据
    public List selectMovie();

    
    public int insertMovie(Movie m);

}

//Movie实现接口
public class MovieDAOImp implements MovieDAO {

    @Override
    public List selectMovie() {
        // TODO Auto-generated method stub
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        String sqlId = "org.mybatisTest.dao.MovieDAO.selectMovie";
        List movieList = sqlSession.selectList(sqlId);
        sqlSession.close();
        return movieList;
    }

    @Override
    public int insertMovie(Movie m) {
        // TODO Auto-generated method stub
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        String sqlId = "org.mybatisTest.dao.MovieDAO.insertMovie";
        int c = sqlSession.insert(sqlId, m);
        sqlSession.commit();
        sqlSession.close();
        return c;
    }
}

最终简化查询与新增

    public static void Add() throws IOException {
        Movie m = new Movie();

        m.setM_name("那些年");
        m.setM_director("赵薇");
        m.setM_up_year(2011);
        m.setM_adddate(new Date());

        MovieDAO movieImp = new MovieDAOImp();
        int c = movieImp.insertMovie(m);
        // 输出结果

        System.out.println(c);
    }

    public static void Select() throws IOException {
        MovieDAO movieImp = new MovieDAOImp();
        List listMovie = movieImp.selectMovie();
        // 输出结果
        listMovie.forEach(ms -> System.out.println(ms.getM_name()));
    }

可以继续优化的地方:其实从调用方法语句中就可以通过反射获取两个信息:

//多态
MovieDAO movieImp = new MovieDAOImp();
movieImp.insertMovie(m);

 movieImp对象的全类名:org.mybatisTest.dao.MovieDAO,与之调用的方法对应的mapper.xml文件中的对应的sql语句的id值(通过全类名与sqlID就能确定一条唯一的sql语句);所以实现类内部中的sqlId代码是可以被省略的,是冗余的;

String sqlId = "org.mybatisTest.dao.MovieDAO.insertMovie";

同时实现类内部的获取sqlSession,close、commit都是可以被提取出来简化的,所以这部分代码也是可以省略的;

以上可知dao接口的实现类是可以省略的,所以mybatis的动态代理就帮我们省略了DAO接口的实现类,并帮我们创建了DAO实现类的对象;

mybatis的动态代理:

    public static void Test2() {

        SqlSession sqlSession = MybatisUtils.getSqlSession();
        MovieDAO movieDAO = sqlSession.getMapper(MovieDAO.class);
        List movieList = movieDAO.selectMovie();
        for (Movie movie : movieList) {
            System.out.println(movie.getM_name());
        }

        //添加
        Movie m = new Movie();
        System.out.println(movieDAO.getClass().getName());

        m.setM_name("大红灯笼高高挂");
        m.setM_director("张艺谋");
        m.setM_up_year(1995);
        int c = movieDAO.insertMovie(m);
        sqlSession.commit();
        sqlSession.close();
    }

 mybatis动态代理可以帮我们创建DAO接口的实现类,在实现类中调用sqlSession的方法执行sql语句;

实现动态代理的要求:

        ①mapper文件的namespace是DAO接口的全类名;

        ②mapper文件的标签id是DAO接口的方法名;

        ③mapper文件名与DAO接口文件名一致;

        ④DAO接口中不能使用重载方法,即不能使用同方法名,参数不同的方法;

9.简单参数
//mapper文件

        select * from y_movie order by ${orderParam} 
    
12.ResultType结果类型

ResultType指定sql语句执行完毕后,数据转换的java对象;

处理过程:

        ①mybatis执行sql语句,然后调用类的无参构造对象,创建对象;

        ②mybatis根据ResultSet的列名,赋值给与列名相同名称的对象属性;

ResultType可以不是实体类,比如返回视图对象;

//ViewMovie
public class MovieView {
    private int m_id;

    private String m_name;

    private String m_director;

    public int getM_id() {
        return m_id;
    }

    public void setM_id(int m_id) {
        this.m_id = m_id;
    }

    public String getM_name() {
        return m_name;

    }

    public void setM_name(String m_name) {
        this.m_name = m_name;
    }

    public String getM_director() {
        return m_director;
    }

    public void setM_director(String m_director) {
        this.m_director = m_director;
    }
}

//DAO方法
public List selectMovie3();

//mapper文件


//调用
public static void Test9() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        MovieDAO m = sqlSession.getMapper(MovieDAO.class);
        List movies = m.selectMovie3();
        movies.forEach(ms -> System.out.println(ms.getM_name()));
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/843270.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号