SSM—mybatis框架-认识-认识架构-搭建

Mybatis

1.1、mybatis简介

mybatis原来是Apache公司的一个开源项目ibatis,2016年6月这个项目由Apache SoftWare Foundation迁移到了Google Code,,随着开发团队转投Google Code 旗下, iBatis3.x正式更名为MyBatis。是 一个基于Java的持久层框架。 iBatis提供的 持久层框架包括SQL Maps和Data Access Objects (DAO)。

官方文档:https://mybatis.org/mybatis-3/zh/index.html

  • MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映

    射。相比于Hibernate!

  • MyBatis 避免了几乎所有的 JDBC 代码手动设置参数以及获取结果集。

  • MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录,是 一种 ORM(ORM Object Relational Mapping 对象关系映射)实现.

  • Mybatis 将基本的 JDBC 常用接口封装,对外提供操作即可

其实啊,mybatis框架就是对JDBC的封装!

1.2、回顾JDBC

我们在JDBC编程时,是不是要写一大串代码!比如:

  1. 加载数据库驱动
  2. 建立数据库连接
  3. 创建prepareStatement对象
  4. sql语句
  5. 设置sql占位符的值
  6. 执行sql,获取结果
  7. 对结果解析处理
  8. 释放资源

比如:

        // 加载数据库驱动
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        // 连接到数据库
        try {
            String url = "jdbc:mysql://127.0.0.1:3306/yhlz_db?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC";
            // 连接到数据库
            Connection c = DriverManager.getConnection(url,"root","root");
            String name = "迪迦";
            String sex = "男";
            int phone = 911;
            int grade = 2;
            String time = "2021-01-12";
            // 添加数据
            // 将sql语句预编译到PreparedStatement,?是占位符,表示每个位置的值
            PreparedStatement p = c.prepareStatement("insert into t_student(t_student_name,t_student_sex,t_student_phone,t_student_grade_id,t_student_date) values(?,?,?,?,?)");
            // 然后通过指定方法向sql语句中的占位符赋值
            p.setString(1,name);
            p.setString(2,sex);
            p.setInt(3,phone);
            p.setInt(4,grade);
            p.setString(5,time);
            // 预编译好,数据赋值后,然后发送
            p.executeUpdate();
            // 关闭连接
            r.close();
            p2.close();
            c.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

是不是想想就头疼!代码不仅多,而且还暴露出很多问题!

1、 数据库连接的创建、释放频繁造成系统资源浪费从而影响系统性能,如果使

用数据库连接池可解决该问题。

2、 SQL 语句编写在 Java 代码中,这种硬编码造成代码不易维护,当 SQL 变动

时需要修改 java 源代码。

3、 使用 preparedStatement 向占位符传参数存在硬编码,因为 SQL 语句的

where 条件中占位符的个数可能会变化,修改 SQL 还要修改 Java 源代码,

系统不易维护。

4、 对结果集解析存在硬编码,SQL 语句变化导致解析代码变化,系统不易维护。

所以,这个时候mybatis站了出来,它是基于JDBC的优化!给我们带来了很多好处!

1.3、mybatis架构!

mybatis是最优秀的持久层框架,它能解决JDBC编程中存在的问题!

在这里插入图片描述

原理!

  1. mybatis-config.xml: 是mybatis的全局配置文件,配置了mybatis的运行环境等信息;
  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、基本 类型、PPOJO,Executor 通过Mapped Statement 在执行 sql 前将输入的 java 对象映射至 sql 中,输入参数映射就是 jdbc 编程中对 preparedStatement 设置参数。
  7. Mapped Statement 对 sql 执行输出结果进行定义,包括 HashMap、基本 类型、PPOJO,Executor 通过 Mapped Statement 在执行 sql 后将输出结 果映射至 java 对象中,输出结果映射过程相当于 jdbc 编程中对结果的解析 处理过程。

1.4、搭建mybatis!

1.4.1、创建Maven项目,导入第三方依赖jar包,

        <!-- 单元测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.7</version>
            <scope>test</scope>
        </dependency>

        <!-- mysql依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>

        <!-- mybatis依赖 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.2</version>
        </dependency>

为了避免一些静态资源(css,js……),我们加个过滤

<!-- 解决maven静态资源的过滤 -->
<build>
    <resources>
        <resource>
            <directory>src/main/java/</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>

        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

1.4.2、resources文件夹下创建mybatis-config.xml配置文件,

在配置之前,我们先来了解下要配置什么,怎样配置,这是配置的源码,必须按照人家的顺序来,否则报错!

<!ELEMENT 
	configuration (             // 配置
    	properties?,            // 属性
    	settings?,              // 设置
    	typeAliases?,           // 类型别名
    	typeHandlers?,          // 类型处理器
    	objectFactory?,         // 对象工厂
    	objectWrapperFactory?,  // 对象封装工厂
    	reflectorFactory?,      // 反射工厂
    	plugins?,               // 插件
    	environments?,          // 环境
    	databaseIdProvider?,    // 数据库厂商标识
    	mappers?                // 映射器
	)>

配置mysql,连接到mysql

<?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>

    <!-- mysql配置 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_db?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;serverTimezone=Asia/Shanghai"/>
                <property name="username" value="root"/>
                <property name="password" value="***"/>
            </dataSource>
        </environment>
    </environments>

</configuration>

1.4.3、创建pojo包,实体类Cars

这里偷了个懒,@Data表示自动生成set,get方法、@AllArgsConstructor表示生产有参构造、@NoArgsConstructor表示生产无参构造,想试试的小伙伴可以去settings中插件下载lombok插件,导入lombok依赖,

在这里插入图片描述

lombok依赖!

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
            <scope>provided</scope>
        </dependency>

Cars实体类!

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Cars {
    private int id;
    private String name;
    private String phone;
    private Date out_date;
}

1.4.4、创建mapper包,映射接口,CarsMapper

public interface CarsMapper {

    List<Cars> getCars();

}

1.4.5、创建sql映射文件,CarsMapper.xml

这里的id的值对应我们接口中的方法名

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tian.mapper.CarsMapper">
    <select id="getCars" resultType="cars">
        select * from cars
    </select>
</mapper>

1.4.6、在mybatis-config.xml中注册mapper映射器,并设置别名

注意mapper的位置!

<?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>

    <typeAliases>
        <package name="com.tian.pojo"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_db?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;serverTimezone=Asia/Shanghai"/>
                <property name="username" value="root"/>
                <property name="password" value="***"/>
            </dataSource>
        </environment>

    </environments>

    <mappers>
       <!-- <mapper class="com.tian.mapper.CarsMapper"/>-->
        <mapper resource="com/tian/mapper-conf/CarsMapper.xml"/>
    </mappers>

</configuration>

1.4.7、封装sqlSession

我们创建util包,将sqlSession封装!

public class MybatisUtil {
    private static SqlSessionFactory sqlSessionFactory;
    static String resource;
    static InputStream inputStream;
    static {
        try{
            resource = "mybatis-config.xml";
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }catch (IOException io){
            io.printStackTrace();
        }
    }

    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }

}

1.4.8、测试!

public class MyTest {

    SqlSession sqlSession = MybatisUtil.getSqlSession();
    CarsMapper mapper = sqlSession.getMapper(CarsMapper.class);

    @Test
    public void getCars(){
        System.out.println(mapper.getCars());
    }
}

1.4.9、结果!

[Cars(id=1, name=玛莎拉肚, phone=13611111111, out_date=Fri Apr 02 19:54:40 CST 2021), Cars(id=2, name=玛莎拉蒂, phone=11122233344, out_date=Mon Apr 05 15:18:56 CST 2021), Cars(id=3, name=朱丽叶, phone=11122233344, out_date=Mon Apr 05 15:21:48 CST 2021)]

注意

1、 Mapper.xml 文件中的 namespace 与 mapper 接口的类路径相同

2、 Mapper 接口方法名和 Mapper.xml 中定义的每个 statement 的 id 相同

3、 Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型相同

4、 Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值