Mybatis是什么?

发布时间 2024-01-11 23:46:41作者: chen平安在安平cheng

Mybatis简介

Mybatis官网:https://mybatis.net.cn/

mybatis是什么?

它是一款半自动的ORM持久层框架,具有较高的SQL灵活性,支持高级映射(一对一,一对多),动态SQL,延迟加载和缓存等特性,但它的数据库无关性较低。

mybatis是半自动的又该怎么理解呢?

用mybatis进行开发,需要手动编写SQL语句。而全自动的ORM框架,如hibernate,则不需要编写SQL语句。用hibernate开发,只需要定义好ORM映射关系,就可以直接进行CRUD操作了。由于mybatis需要手写SQL语句,所以它有较高的灵活性,可以根据需要,自由地对SQL进行定制,也因为要手写SQL,当要切换数据库时,SQL语句可能就要重写,因为不同的数据库有不同的方言(Dialect),所以mybatis的数据库无关性低。虽然mybatis需要手写SQL,但相比JDBC,它提供了输入映射和输出映射,可以很方便地进行SQL参数设置,以及结果集封装。并且还提供了关联查询和动态SQL等功能,极大地提升了开发的效率,并且它的学习成本也比hibernate低很多。

ORM又是什么?

ORM全称Object Relation Mapping,可以理解为对象关系映射。对象指的是Java对象,关系指的是数据库中的关系模型,对象关系映射,指的就是在Java对象和数据库的关系模型之间建立一种对应关系,比如用一个Java的Student类,去对应数据库中的一张student表,类中的属性和表中的列一一对应。Student类就对应student表,一个Student对象就对应student表中的一行数据。

持久层又该怎么理解呢?

在javaEE三层架构分别是表现层、业务层、持久层。为了保证代码的职责单一,我们将同数据库操作的代码称为持久层,持久层:对数据持久化,保存到数据库。

框架又怎么理解呢?

框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型。在框架的基础之上构建软件编写更加高效、规范、通用、可扩展。比如说:对一个石膏模子进行上色处理,石膏的大体模型已经雕刻好了,只需要对石膏模型进行上色处理即可。

Mybatis简化了JDBC操作

JDBC操作数据库的步骤请看[https://www.cnblogs.com/totora/p/17958845]

JDBC缺点:
1.硬编码(很多重复,且耦合性强的代码,注册驱动,获取连接、SQL语句)。
2.操作繁琐(手动设置参数,手动封装结果集及资源管理)。

注意:在使用jdbc或mybatis时,需要在mysql中先创建表和添加数据,并且需要创建实体类。

JDBC连接数据库的四个参数Driver、Url、userName、Password都是直接写进代码中,属于编码方式,这样维护起来非常麻烦。因为它们在代码编译后不可动态更改,也不利于安全管理和不同环境下的部署。

Myabtis将这些参数写进mybatis-config配置文件里面,以后直接在配置文件中修改即可。

点击查看代码
 <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/teest?useSSL=false&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>

JDBC中就是SQL语句也是直接嵌入在Java代码中,一旦表名或其结构发生变化,或者需要修改查询逻辑,都需要修改这段代码,不具备良好的可维护性和灵活性。

为了提高代码的可维护性和适应性,通常建议将此类SQL查询放入配置文件中,或者采用ORM(对象关系映射)框架,将数据库操作抽象化。

点击查看代码
<select id="selectAll" resultType="com.demo.pojo.User" >
        select * from user
</select>

JDBC需要手动设置参数,手动封装结果集及资源的关闭处理等

点击查看代码
 statement = connection.prepareStatement("select * from user where id=?");
            Statement statement2 = connection.createStatement();
            //4.执行SQL语句
            // resultSet = statement.executeQuery("select * from user ");//resultSet查询返回的结果集
            ((PreparedStatement) statement).setInt(1, 1);
            //5.处理SQL语句执行返回的结果
            List<User> userList = new ArrayList<User>();
            while (resultSet.next()){
                Integer id = resultSet.getInt(1);
                String loginName = resultSet.getString(2);
                String pwd = resultSet.getString(3);
                String name = resultSet.getString(4);
                User user = new User();
                user.setId(id);
                user.setLoginName(loginName);
                user.setName(name);
                user.setPwd(pwd);
                userList.add(user);
            }

可以使用mybatis简化JDBC操作

点击查看代码
public class mybatisTest {

    @Test
    public void testSelectAll() throws IOException {
        int id = 1;
        //加载Mybatis核心配置文件,获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //获取Sqlsession对象,用来执行sql语句
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.selectById(id);
        System.out.println(user);
        sqlSession.close();
    }
}
请各位大佬指正补充。