MyBatis01

1.理论

1.1历史

1)MyBatis是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation 迁移到了Google Code,随着开发团队转投Google Code旗下, iBatis3.x 正式更名为MyBatis ,代码于2013年11月迁移到Github
2)iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 iBatis 提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
3) 什么是持久层框架?
看到持久层--> 保存到磁盘的技术。
持久层的框架很多很多: jdbc-->jdbcTemplate-->mybatis\jpa\Hibernate......

1.2简介

1) MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
2) MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
3) MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
4) Mybatis 是一个半自动的ORM(Object Relation Mapping)框架,Hibernate 完全的ORM
数据库 -----映射关系----- java实体
因为mybatis 还需要编写sql语句才能操作数据库,Hibernate无需操作数据库,直接操作java代码即可实现增删改查 from User

1.3为什么选择MyBatis?

越接近底层的技术,运行速度越快,编写的代码越困难
JDBC ---> Hibernate (封装的有点狠)
随着互联网的发展,我们要求编码速度要快,运行速度也要快,就选择了一个折中的方案--MyBatis
随着MyBatis越来越流行,开发人员觉得MyBatis也有一些编码上的问题---MyBatis-Plus

2.入门案例

第一步:新建一个java的maven项目。打包方式写成 jar

第二步:导入依赖的jar包

<dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

第三步:导入log4j的配置文件,因为我们将来想在控制台打印日志

在resources 文件夹下,放log4j.properties
关于Log4J的内容说明
五种日志级别 debug info warn error fatal 级别依次提高,级别越低,打印出来的日志越多

第四步:数据库中建立相应的表格customer

第五步:编写Customer对应的实体 POJO

package com.qfedu.pojo;

import java.util.Date;

public class Customer {
    private int id;
    private String name;
    private String phone;
    private String email;
    private String level;
    private Date createTime;
    private Date endTime;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getLevel() {
        return level;
    }

    public void setLevel(String level) {
        this.level = level;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getEndTime() {
        return endTime;
    }

    public void setEndTime(Date endTime) {
        this.endTime = endTime;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", phone='" + phone + '\'' +
                ", email='" + email + '\'' +
                ", level='" + level + '\'' +
                ", createTime=" + createTime +
                ", endTime=" + endTime +
                '}';
    }
}

第六步:创建一个全局的配置文件(mybatis 有两种配置文件,一种是总配置,一种是小配置文件)
创建一个SqlMapConfig.xml

<?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>
    <!--配置数据库连接的环境-->
    <environments default="development">
        <environment id="development">
            <!--使用jdbc默认的事务-->
            <transactionManager type="JDBC"></transactionManager>
            <!--使用默认的数据库连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/hqll"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

第七步:创建接口文件
com.qfedu.mapper包下,创建CustomerMapper.java 接口

package com.qfedu.mapper;

import com.qfedu.pojo.Customer;

public interface CustomerMapper {

    public Customer getCustomerById(int id);
}

第八步:创建小配置文件-- CustomerMapper.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="com.qfedu.mapper.CustomerMapper">
    <select id="getCustomerById" resultType="com.qfedu.pojo.Customer">
        select * from customer where id=#{id}
    </select>
</mapper>

第九步:将小配置文件,告知给主配置文件

第十步:测试

@Test
    public void testSelect01() throws IOException {
        //测试mybatis
        String resource="SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sessionFactory.openSession();
        CustomerMapper customerMapper = sqlSession.getMapper(CustomerMapper.class);
        Customer customer = customerMapper.getCustomerById(14);
        System.out.println(customer);
    }

以上方案--mapper接口编程,讲究以下几点照应:

1、接口名称和xml的配置文件名称一致,路径一致。

2、CustomerMapper.xml中的namespace 必须是接口的全路径

3、sql 中的id 必须是接口的方法名

4、SQL中的resultType必须和方法名的返回值一致。

2.三、一些细节上的配置

1、如果配置了log4j 日志不输出

<!--解决一些同学控制台日志不打印的问题-->
<settings>
    <setting name="logImpl" value="log4j"/>
</settings>

SqlMapConfig.xml中各种标签是有先后书写顺序的,顺序不对就报错。

2、能不能给各个实体起别名?

<!--起别名-->
    <typeAliases>
        <!--给某个实体起别名-->
       <!--<typeAlias type="com.qfedu.pojo.Customer" alias="customer"/>-->
        <!--指定一个包,该包下的所有的实体全部起别名,别名就是自己的类名,不区分大小写-->
        <!--
           Customer   customer
                      cUstomer
        -->
        <package name="com.qfedu.pojo"/>
    </typeAliases>

mybatis自身也给一个数据类型起了别名,别名如下:

3、每次编写一个mapper .xml都需要在SqlMapConfig.xml中进行报备,能不能有种简写的方式

<mappers>
        <!--告知主配置文件,我的配置文件在哪里-->
        <!--指定一个配置文件-->
        <!--<mapper resource="com/qfedu/mapper/CustomerMapper.xml"/>-->
        <!--指定一个包名,该包名下所有的xxxxMapper.xml全部加载进来-->
        <package name="com.qfedu.mapper"/>
    </mappers>

4、之前我们使用jdbc.properties来配置数据源,现在能够还使用这种方式吗?

<properties resource="db.properties"/>
<environments default="development">
    <environment id="development">
        <!--使用jdbc默认的事务-->
        <transactionManager type="JDBC"></transactionManager>
        <!--使用默认的数据库连接池-->
        <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>
</environments>

标签中的顺序如下: properties < settings < typeAliases < environments < mappers
官方给出的标签顺序如下:

完整的SqlMapConfig.xml配置

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

    <!--通过该标签,将db.properties文件给加载过来-->
    <properties resource="db.properties"/>

    <!--解决一些同学控制台日志不打印的问题-->
    <settings>
        <setting name="logImpl" value="log4j"/>
    </settings>

    <!--起别名-->
    <typeAliases>
        <!--给某个实体起别名-->
       <!--<typeAlias type="com.qfedu.pojo.Customer" alias="customer"/>-->
        <!--指定一个包,该包下的所有的实体全部起别名,别名就是自己的类名,不区分大小写-->
        <!--
           Customer   customer
                      cUstomer
        -->
        <package name="com.qfedu.pojo"/>
    </typeAliases>
    <!--配置数据库连接的环境-->
    <environments default="development">
        <environment id="development">
            <!--使用jdbc默认的事务-->
            <transactionManager type="JDBC"></transactionManager>
            <!--使用默认的数据库连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>



    <mappers>
        <!--告知主配置文件,我的配置文件在哪里-->
        <!--指定一个配置文件-->
        <!--<mapper resource="com/qfedu/mapper/CustomerMapper.xml"/>-->
        <!--指定一个包名,该包名下所有的xxxxMapper.xml全部加载进来-->
        <package name="com.qfedu.mapper"/>
    </mappers>

</configuration>
posted @ 2021-09-24 20:52  码丁XIA  阅读(30)  评论(0)    收藏  举报