mybatis学习记录-----1

147 阅读3分钟

什么是MyBatis

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

MyBatis 是一款优秀的半自动的ORM持久层框架,它支持自定义 SQL、存储过程以及高级映射

持久层:可以立刻保存在磁盘上,这里可以理解为与数据库相关的操作。

什么是ORM:OBject Relation Mapping 对象关系映射

对象指的是面向面向对象,关系指的是数据库中的表,

例如Java语言中的POJO类与数据库模型之间的对应关系。

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

image.png

JDBC和MyBatis的主要角色

JDBC

  1. DriverManager,数据库驱动管理对象
  2. Connection,数据库连接对象
  3. Statement | PrepareStatement ,操作数据库SQL语句对象
  4. ResultSet,结果集对象

Mysbatis

  1. SqlSession对象,该对象包含了执行SQL语句的所有方法,例如JDBC里面Connection
  2. Executor接口,将传递过来的参数动态生成SQL语句,负责查询缓存。
  3. MappedStatement对象,该对象负责对SQL封装,用于存储需要映射的SQL语句及参数等信息
  4. ResultHandler对象,用户返回结果集合,封装成最红想要的数据类型,可以自定义返回类型

开发流程

image.png

1、在xml文件中添加mybatis相关的依赖

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.3</version>
</dependency>

2、配置核心文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
<!--    给数据源起别名,当使用dev数据源时就是使用该数据源-->
    <environments default="dev">
        <environment id="dev">
<!--            采用什么方法对数据库事务进行管理-->
            <transactionManager type="JDBC"></transactionManager>
<!--            使用什么方法对数据源进行管理-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/database?......"/>
                <property name="username" value=""/>
                <property name="password" value=""/>
            </dataSource>
        </environment>
    </environments>
</configuration>

3、创建实体类。实体类就是和数据库表中相对应的java类,类中的属性就表中的字段。

实体类实例:

public class goods {

    private Integer goodsId;
    private String title;
    private String subtitle;
//getset方法
.......
}

4、Mapper映射文件 mapper是映射文件,都是xml类型的文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="goods">
<!--    namespace:命名空间,用于区分不同的sql语句,因为不同的表可能会有想同的查询名称-->
<!--    id相当于sql语句的名称,resultType相当于查询返回的结果-->
    <select id="selectAll" resultType="mybatis/entity/goods">
-- 正常的sql语句
        select * from ....
    </select>
</mapper>

使用mapper映射时要在config最后中添加记录,否则不会将该mapper作为映射文件。

<mappers>
    <mapper resource="mapper/goods.xml"></mapper>
</mappers>

5、初始化sessionfactory。

  //利用reader加载配置文件
        Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
//        初始化sqlsessionfactor对象,并解析mybatis-config
        SqlSessionFactory sqlSessionFactory =  new SqlSessionFactoryBuilder().build(reader);
        //获取sqlsession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

6、利用sqlsqession操作数据

 //使用命名空间加方法名来定位具体的sql语句并执行。
List<goods> list = sqlSession.selectList("goods.selectAll");
//关闭,释放资源
sqlSession.close();

总共的大体流程

    public void testsqlsessionfactory() throws IOException {
        //利用reader加载配置文件
        Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
//        初始化sqlsessionfactor对象,并解析mybatis-config
        SqlSessionFactory sqlSessionFactory =  new SqlSessionFactoryBuilder().build(reader);
        //获取sqlsession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //使用命名空间加方法名来定位具体的sql语句并执行。
       List<goods> list = sqlSession.selectList("goods.selectAll");
       //关闭,释放资源
       sqlSession.close();
    }

在看网上的学习资料的时候发现可以写一个mapper接口,里面是方法的名称,然后再mapper的xml文件中namespace替换为接口,xml中的sql语句就和接口中的方法一一对应。

public interface interfacetest {

    List<goods> selectAll;
}
//位置写的不太对,但可以这样实现
<mapper namespace="src/main/java/mybatis/mapper/interfacetest">
    <select id="selectAll" resultType="mybatis/entity/goods">
        select * from ....
    </select>
</mapper>

学习参考: MyBatis从入门到精通_李昊哲小课的博客-CSDN博客
blog.csdn.net/vcj10097848…