MyBatis学习基础概述和入门操作

引言

mybatis框架是一个基于Java的持久层框架,支持自定义框架,本篇文章主要是了解mybatis框架,对mybatis框架做一个简单的入门,了解mybatis框架是如何实现java持久层的操作的,比对于传统的jdbc操作mybatis框架的优势在哪里

知识是用来共享的,但是希望转载的时候能注明原地址,本文作者雷雨

什么是框架?

软件的半成品,解决了软件过程当中的普适性问题,从而简化了开发步骤,提供了开发的效率

什么是ORM框架?

  • ORM(Object Relational Mapping)对象关系映射,将程序中一个对象和表中中的一行数据一一对应
  • ORM框架提供了持久化类与表的映射关系,在运行时参照文件的信息,把队象持久化到数据库中

使用JDBC完成ORM操作的缺点?

  • 存在大量的冗余代码(加载驱动,获取连接,释放连接)
  • 手工创建Connection.Statement等
  • 手工将结果集封装成实体队象
  • 查询效率低,没有对数据库访问进行过优化(Not Cache)

MyBatis框架

概念

  • MyBatis本是Apache软件基金会的一个开源项目iBatis,2010年这个项目由apache asoftware foundation 迁移到了Goole Code,并且改名为MyBatis,2013年11月迁移到GitHub
  • Mybatis是一个优秀的基于Java的持久层框架,支持自定义SQL,存储过程和高级映射
  • Mybatis对原有JDBC操作进行了封装,几乎消除了所有JDBC代码,使开发者只需关注SQL本身
  • MyBatis可以使用简单的XML或Annotation来配置执行SQL,并且自动完成ORM操作,将执行结果返回

mybatis的开发步骤

核心配置

构建好maven项目后再pom.xml的配置信息中

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>per.leiyu</groupId>
    <artifactId>Mybatis1</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <!--Mybatis的核心依赖 -->
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>


        <!-- 导入mysql的驱动依赖-->
        <!-- 因为我们的mybatis的框架就是对数据库操作的框架,因此需要导入我们所要操作的数据库的驱动依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.26</version>
        </dependency>


    </dependencies>

    <build>
        <plugins>
                <plugin>
                            <!--配置jdk -->
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-compiler-plugin</artifactId>
                            <configuration>
                                <target>1.8</target>
                                <source>1.8</source>
                                <encoding>UTF-8</encoding>
                            </configuration>
                </plugin>

        </plugins>


    </build>

</project>

除了在pom.xml中写相关配置,还需要在配置文件中提供一个mybatis的配置文件(写详细的关于数据库和mybatis的配置信息)一般为了见名知意—mybatis-config.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">
<!-- 上面是mybatis的配置文件的头-->




<configuration>
    <!--下面这些是对mybatis的核心配置
     层级和标签的名称是固定的,如果有需要就按照这个模板写就可以
     -->
    <environments default="leiyu_mybaits">
        <!-- 配置和数据库相关的信息-->
        <environment id="leiyu_mybaits"><!--相当于我们对我们在environment配置中起一个名字,然后我们可以再通过在上面的default中来默认使用我们配置好的信息 -->
            <!-- 事务控制类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置数据库连接信息 -->
            <!-- 这里通过配置type的类型,实现的连接池的引入,比之前方便很多-->
            <dataSource type="org.apache.ibatis.datasource.pooled.PooledDataSourceFactory">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <!--  转义字符&  方法在下面标签中有具体演示-->
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8"/>
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
<!-- 注册我们的mapper文件 -->
    <mappers>
        <mapper resource="UserDaoMapper.xml"/>
    </mappers>
</configuration>

创建数据库,创建表

create datebase mybatis default charset = uff8;
use mybatis;
create table t_user(
	id int parmary key auto_increment,
    username varchar(50),
    passward varchar(50),
    gender tinyint,
    regist_time datetime
)defaault charset=utf8;
在数据库可视化工具或者IDea中集成的mysql来创建数据库和表
image-20200611150539548

创建实体类

  • 创建实体类User对应着数据库中的t_user表
package per.leiyu;

import java.util.Date;

/**
 * @author 雷雨
 * @date 2020/6/11 10:03
 */
public class User {
    private  Integer id;
    private  String username;
    private String passward;
    private Boolean gender;
    private Date registTime;

    public User() {
        super();
    }

    public User(Integer id, String username, String passward, Boolean gender, Date registTime) {
        this.id = id;
        this.username = username;
        this.passward = passward;
        this.gender = gender;
        this.registTime = registTime;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", passward='" + passward + '\'' +
                ", gender=" + gender +
                ", registTime=" + registTime +
                '}';
    }

    public Integer getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassward() {
        return passward;
    }

    public void setPassward(String passward) {
        this.passward = passward;
    }

    public Boolean getGender() {
        return gender;
    }

    public void setGender(Boolean gender) {
        this.gender = gender;
    }

    public Date getRegistTime() {
        return registTime;
    }

    public void setRegistTime(Date registTime) {
        this.registTime = registTime;
    }
}

定义Dao接口

  • 也就是我们要执行的sql语句的接口
package per.Dao;

import per.leiyu.User;

/**
 * @author 雷雨
 * @date 2020/6/11 10:06
 */
public interface UserDao {
    User queryUserById(Integer id);

}

创建UserDaoMapper.xml

  • 告诉mybatis中的UserDao接口中方法执行的sql语句是什么,返回值是什么,需要的参数怎么提供给mybatis

  • mybatis框架中我们不再需要为dao层的抽象的接口创建实体类,而是使用xml文件来管理jdbc的操作

  • mybatis框架为我们把原本的注册驱动,获取连接,释放资源等等的方法进行了封装,简化我们的开发,我们只需要通过配置和调用封装好的方法就可以实现对jdbc的操作(内含了对数据库操作的优化)

<?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">
<!-- 指明该xml文件时用来描述那个dao接口的-->
<mapper namespace="per.Dao.UserDao">
    <!-- 描述方法  -->
    <!-- 
        id:描述的是那个接口中的那个方法
        resultType:描述的方法的放回结果的类型
        #{arg0}:表示的是接口中的第一个参数,那么接口中的形参的第二个参数就用#{arg1}表示
     -->
    <select id="queryUserById" resultType="per.leiyu.User">
        select * from t_user where id =#{arg0}
    </select>


</mapper>
  • 仔细观察这个配置文件,你会发现我们把创建dao实现类,执行sql语句,把结果集封装为用户对象都交给mybatis为我们解决

  • 我们写好了mapper的配置文件需要在mybatis-config的配置文件中对我们写好的mapper的配置文件启用

创建测试类

package per.leiyu.UserDao;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import per.Dao.UserDao;
import per.leiyu.User;

import java.io.IOException;
import java.io.InputStream;

/**
 * @author 雷雨
 * @date 2020/6/11 10:21
 */
public class TestUserDao {
    public static void main(String[] args) throws IOException {
        //1.加载配置文件
        InputStream inputStream= Resources.getResourceAsStream("mybatis-config.xml");
        //2.构建 SqlSessionFactory的对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //3.创建SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //4.通过SqlSession获取DAO实现类对象
        //之前我们讲DAO的实现类不是我们亲自做的做的,是mybatis通过配置文件动态的早内存中通过反射为我们做动态的,
        //我们看不到这个类,但是需要这个类完成我么的DAO的功能
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        User user1 = mapper.queryUserById(1);

        User user2 = mapper.queryUserById(1);
        System.out.println(user1);
        System.out.println(user2);

    }
}

获取到了数据库中的结果 (说明我们通过mybatis对数据库操作成功)
image-20200611153359018

从上面测试类,我们可以看出,我们通过id值获取到了一个User对象,那么mybatis是如何将结果集封装为User对象的呢?

问题:mybatis是如何将结果集封装为对象呢?

  • 使用的是同名策略
mybatis是如何将结果集封装为对象?
image-20200611160559701

由于regist_time和registTime的属性名,列名不相同,导致了没有将查询结果集中的相关数据进行赋值.

解决方式可以在查询时使用别名,别名为在java类中想要对应的属性名.

select id,username,passward,gender,regist_time as registTime from t_user where id=#{arg0}

mybatis开发步骤补充

解决mapper.xml存放在resources以外路径中的读取问题

在mybatis-config.xml文件中修改mapper文件的路径

在pom.xml文件最后追加标签,以便可以将文件复制到classes中,并在程序运行时正常读取

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

解决数据库相关配置的问题

之前我们把数据库相关的配置封装在了mybatis的配置文件中,因为mybatis的确是要来帮助我们操作数据库,但是关于数据库的账号密码这些关于数据库的细节配置是时常会修改的,因此期望能把数据库的细节配置和mybatis的配置分离开.

在配置文件中添加数据库的配置:jdbc.properties

#jdbc.properties
jdbc.driver =com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true
jdbc.username=root
jdbc.passward=123456

修改后的mybatis-config.xml的配置

需要引入数据的配置文件jdbc.properties并且把其中的值赋给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">
<!-- 上面是mybatis的配置文件的头-->




<configuration>
    <!--下面这些是对mybatis的核心配置
     层级和标签的名称是固定的,如果有需要就按照这个模板写就可以
     -->
    <!-- 引入资源文件jdbc.properties-->
    <properties resource="jdbc.properties" />
    <environments default="leiyu_mybaits">
        <!-- 配置和数据库相关的信息-->
        <environment id="leiyu_mybaits"><!--相当于我们对我们在environment配置中起一个名字,然后我们可以再通过在上面的default中来默认使用我们配置好的信息 -->
            <!-- 事务控制类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置数据库连接信息 -->
            <!-- 这里通过配置type的类型,实现的连接池的引入,比之前方便很多-->
            <dataSource type="org.apache.ibatis.datasource.pooled.PooledDataSourceFactory">
                <!--使用$占位符索引到jdbc.properties配置文件中的具体内容-->
                <property name="driver" value="${jdbc.driver}" />
                <!--  转义字符&  方法在下面标签中有具体演示-->
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.passward}" />
            </dataSource>
        </environment>
    </environments>
<!-- 注册我们的mapper文件 -->
    <mappers>
        <mapper resource="per/Dao/UserDaoMapper.xml"/>
    </mappers>
</configuration>

这样mybatis-config.xml中相关于数据库的配置就和数据库的配置jdbc.proerties相关联了,jdbc.properties的配置发生改变,在mybatis-config.xml中相关的配置也会发生改变

类型别名(给实体类起一个别名)

我们之前要通过mybatis操作数据库在结果集的返回类型,我们将其包装为我们的一个实体类的类型

没起别名之前,我们需要写这个实体类的全路径
image-20200612083848773

每次都写实体类的全路径避免不要写写很多热冗余的代码,我们期望给实体类起一个别名,那么就需要在mybatis-config.xml中进行配置

<configuration>
	             
	<typeAliases>
        <!-- 这里种定义方式选择一种 -->
<!--        <typeAlias type="per.leiyu.User" alias="User" />-->
        <!-- 自动扫描包名,默认该包中的所有实体类的自己本身的名字作为原来的全路径的别名-->
        <package name="per.leiyu"/>
        
    </typeAliases>
</configuration>

创建log4j配置文件(创建日志文件)

在pom.xml中导入依赖

 <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
</dependency>

给log4j创建一个配置文件:名字必须为log4j.properties

#Global logging configuration
log4j.rootLogger=DEBUG,stdout
#Mybatis logging configuration
log4j.logger.org.mybatis.example.BlogMapper=TRACE
#Console output
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p[%t] - %m%n

最后附上项目结构

项目结构
image-20200613085144295

猜你喜欢

转载自blog.csdn.net/qq_40742223/article/details/106727641