mybatis

Mybatis是什么?
Mybatis是一个框架,最开始源自Apache的一个开源的项目ibatis,在2010年6月这个项目将由由Apache Software Foundation 迁移到了 Google Code,随着开发团队转投到 Google Code 旗下,iBatis3.x正式更名为MyBatis。

Mybatis是一个基于Java的持久层的框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects (DAO)。
持久层,就是数据访问层,就是后端对数据库的访问,数据的交互。

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

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

MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJO (Plain Old Java Objects,普通的Java对象) 映射成数据库中的记录。

是一种 ORM(ORM Object Relational Mapping 对象关系映射)实现.
Object==>就是java对象、Relational==>就是数据库表,Mapping==>映射
就是让java对象与数据库的表之间产生一种映射。

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

Mybatis封装了一些对数据操作的一些接口,来代替jdbc。Mybatis就是对jdbc进行的一种轻量级的封装,简化了操作

Mybatis 中文官网 https://mybatis.org/mybatis-3/zh/getting-started.html

传统jdbc编程历程
加载数据库驱动
创建并获取数据库链接
创建 statement 对象
拼写 sql 语句
设置 sql 语句中的占位符的值
执行 sql 语句并获取结果
对 sql 执行结果进行解析处理
释放资源
经过一系列复杂的过程才能创建使用后端对数据库的使用
jdbc在编程中所遇到的问题
数据库连接的创建、释放频繁造成系统资源浪费从而影响系统性能,如果使 用数据库连接池可解决该问题。
SQL 语句编写在 Java 代码中,这种硬编码造成代码不易维护,当 SQL 变动时需要修改 java 源代码。
使用 preparedStatement 向占位符传参数存在硬编码,因为 SQL 语句的 where 条件中占位符的个数可能会变化,修改 SQL 还要修改 Java 源代码, 系统不易维护。
对结果集解析存在硬编码,SQL 语句变化导致解析代码变化,系统不易维护。
总之就是特别麻烦

MyBatis 架构
MyBatis 环境的搭建
导入MyBatis 的jar包和mysql的驱动
导入mysql的驱动是因为要和数据库做连接,这里使用的数据库是mysql。

打开idea先要创建一个maven项目
Maven是什么,详细了解>>>

创建好Maven后,就要导入所需要的Mybatis所依赖的jar的驱动包

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

再导进mysql所需要的jar包

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

也可以去maven 仓库官网http://mvnrepository.com/
在此官网寻找自己所需开发jar包

<?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>com.demo</groupId>
<artifactId>mybatispro</artifactId>
<version>1.0-SNAPSHOT</version>
<name>mybatispro</name>
<packaging>war</packaging>

<properties>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.source>1.8</maven.compiler.source>
</properties>

<dependencies>
    <!--Mybatis的jar包-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.2</version>
    </dependency>
    <!--mysql的jar包-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.16</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.3.0</version>
        </plugin>
    </plugins>
</build>

创建 MyBatis 全局核心配置文件
MyBatis 的配置文件包含了对 MyBatis 行为的设置信息。

配置文档的顶层,结构如下(标签需要按照特定顺序排放):
configuration(根标签,配置的意思)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(配置与数据库连接的相关信息)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
这些标签是有顺序的,必须按照这个顺序走的

这是mybatis的核心配置文件约束,加在开头位置,是必须加上的

<?xml version="1.0" encoding="UTF-8" ?><!--添加约束-->
<!--environments配置与数据库连接的相关信息-->
<environments default="development">
    <!--environments中可以创建多个environment,environments中的default名字是什么,
    就执行id是什么的environment-->

    <!--id = development中配置的就是本地开发的相关信息-->
    <environment id="development">

        <!--配置事务管理类型,使用JDBC事务管理-->
        <transactionManager type="JDBC"></transactionManager>

        <!--数据源-->
        <dataSource type="UNPOOLED">

            <!--数据库的驱动-->
            <property name="driver" value="com.mysql.cj.jdbc.Driver"/>

            <!--数据库地址-->
            <property name="url"
                      value="jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=Asia/Shanghai"/>
            <property name="username" value="root"/>
            <property name="password" value="wasd"/>
        </dataSource>
    </environment>

    <!--        例如id = "work" 的environment中配置的就是生产相关的环境信息-->
    <!--        <environment id="work">-->
    <!--            <transactionManager type=""></transactionManager>-->
    <!--            <dataSource type=""></dataSource>-->
    <!--        </environment>-->
</environments>

<!--添加映射文件-->
<!--我们开发了一个AdminMapper.xml的映射文件,就需要把这个映射文件给配置过来-->
<mappers>
    <mapper resource="mapper/AdminMapper.xml"/>
</mappers>
</configuration>

创建数据库的表和对应的类
数据库的创建和表的创建

CREATE DATABASE demo CHARSET utf8;
1
CREATE TABLE admin(
id INT PRIMARY KEY AUTO_INCREMENT,
account VARCHAR(10),
PASSWORD VARCHAR(10),
sex VARCHAR(1)
)

创建出数据库对应的类

package com.demo.mybatispro.model;

public class Admin {private int id;
private String account;
private String password;
private String sex;

public int getId() {
    return id;
}

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

public String getAccount() {
    return account;
}

public void setAccount(String account) {
    this.account = account;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public String getSex() {
    return sex;
}

public void setSex(String sex) {
    this.sex = sex;
}
创建映射的接口
首先就要在Dao层定义一个Mapper接口

Mapper 接口开发方法只需要程序员编写 Mapper 接口(相当于 Dao 接口),由 Mybatis 框架根据接口定义创建接口的动态代理对象.

ackage com.demo.mybatispro.mapper;

import com.demo.mybatispro.model.Admin;

public interface AdminMapper {
/*这个就相当于之前写的dao文件,只写是在dao文件中,写好mysql所需要的方法,并且实现它

  • 现在的这里只写方法名,定义功能 , 具体的实现是在sql的映射文件当中*/
    void saveAdmin(Admin admin);
    }
    创建sql映射配置的文件(sql实现)
    之前dao里面对数据库的调用和实现,现在在对应的映射中来实现

Mapper 接口在开发时需要遵循以下规范:

Mapper.xml 文件中的 namespace 与 mapper 接口的类路径相同。
Mapper 接口方法名和 Mapper.xml 中定义的每个 statement 的 id 相同
Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 ==parameterType 的类型相同 ==
Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同

<?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.demo.mybatispro.mapper.AdminMapper">
    <!--namespace对应的地址就是我们创建好的接口的位置的地址--><!--insert中的id名就要和我们创建好的接口中的方法名一致-->
<!--parameterType中写参数的全类名-->
<!--在这个里面就可以写sql的语句了,例如这里写的是一个新增的sql语句-->
<insert id="saveAdmin" parameterType="com.demo.mybatispro.model.Admin">
    insert into admin (account,password,sex)values(#{account},#{password},#{sex})
</insert>
<!--#{}里面写内容的属性名-->
</mapper>

创建好的对象用来封装数据

测设
读取核心配置问题
创建SqlSessionFactory
创建SqlSession
获得接口代理的对象
使用代理对象调用接口中的方法(实则调用的是sql映射的实现)
main方法来总起使用调用起来,将数据保存到数据库当中去

使用getMapper(接口.class);获得代理对象

  
package com.demo.mybatispro.test;

import com.demo.mybatispro.mapper.AdminMapper;
import com.demo.mybatispro.model.Admin;
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 java.io.IOException;
import java.io.Reader;

public class Test1 {
    public static void main(String[] args) throws IOException {
        Admin admin = new Admin();
        admin.setAccount("qwer");
        admin.setPassword("111");
        admin.setSex("男");/*从main方法中调用配置好的mybatis将sql语句执行,并保存到数据库当中*/

    //读取mybatis中的核心配置文件
    //getResourceAsReader读取到信息,将信息封装到resourceAsReader当中去
    Reader resourceAsReader = Resources.getResourceAsReader("mybtis.xml");

    //创建SqlSessionFactory这样的一个工厂,
    // 传入的第二个参数就是在mybtis.xml中选择对应的environment id
    //也是可以不用写的,如果不写的话,就会调用mybti.xml中的environments default的值
    SqlSessionFactory development = new SqlSessionFactoryBuilder().build(resourceAsReader);

    //创建SqlSession对象  表示一次与数据库的连接。类似于JDBC中的Connection
    SqlSession sqlSession = development.openSession();

    //获得映射接口的代理对象
    AdminMapper mapper = sqlSession.getMapper(AdminMapper.class);//将接口的Class对象传输过来

    mapper.saveAdmin(admin);
    //这个是根据代理对象找到的是AdminMapper.xml文件中所对应的insert的id
    // 这行代码执行后会调用到数据库的语句,但是数据是不会存储到数据库当中去

    sqlSession.commit();//提交事务,执行这条语句,才会将数据语句在数据库当中去执行

    sqlSession.close();//关闭与数据库的会话连接
}

Mybatis框架搭建内的详解
核心配置中的标签内容
在学习了Spring框架后,Mybatis中的核心配置就会发生大量的变化,就对每一个标签的意思做详细解释。

environments
<environments default="">
        <environment id="">
            <transactionManager type=""></transactionManager>
            <dataSource type=""></dataSource>
        </environment>
        <environment id="">
            <transactionManager type=""></transactionManager>
            <dataSource type=""></dataSource>
        </environment>
    </environments>

environments 是配置与数据库连接的相关信息,environments中可以写多个environment,environments中的 default 的属性决定出到底使用的是哪一个environment。

transactionManager元素
transactionManager是在配置对应的事务

事务是什么?

事务是属于数据库的,它就是一次对数据库操作的若干个流程的管理,因为对数据库的请求有时不是那么一条语句的,要执行完所有的请求,再最后提交事务。将这一大串的流程就叫做事务。

	mapper.saveAdmin(admin);
    //这个是根据代理对象找到的是AdminMapper.xml文件中所对应的insert的id
    // 这行代码执行后会调用到数据库的语句,但是数据是不会存储到数据库当中去

    sqlSession.commit();//提交事务,执行这条语句,才会将数据语句在数据库当中去执行
这就是一段的事务

dataSource元素
dataSource是数据源的意思

dataSource标签上的 type="UNPOOLED"是什么意思?
它表达的是数据源类型,一共有三种(UNPOOLED,POOLED,JNDI)

UNPOOLED:不使用数据库连接池

这个类型的数据源实现只是在每次需要的时候简单地打开和关闭连接。虽然有点慢,但是对于不需要立即响应的简单的应用来说,不失为一种好的选择。不同的数据库在性能方面也会有所不同,因此对于一些数据库,不使用连接池时,这个配置就是比较理想的。
UNPOOLED 数据源有四个配置属性:

• driver – 指定 JDBC 驱动器。
• url – 连接数据库实例的 JDBC URL。
• username –登陆数据库的用户名。
• password - 登陆数据库的密码。

POOLED:使用数据库连接池

properties 元素
它们都是外部化,可替代的属性。可以配置在一个典型的 Java 属性文件中,或者通过properties 元素的子元素进行配置。

就是将配置的信息抽取出来到.properties的文件中,最终达到对所有的配置信息全部放在这一个文件中,以达到方便管理。

<configuration>
	<!--引入存放值的属性文件-->
    <properties resource="config.properties"></properties>
    <environments default="development">
    	<environment id="development">
    	<transactionManager type="JDBC"></transactionManager>
    		<dataSource type="UNPOOLED">
                <!--数据库的驱动-->
                <property name="driver" value="${driverClassName}"/>
                <!--数据库地址-->
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
	</environments>
</configuration>

将提取到的信息就保存在这个.properties的文件当中去

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username=root
password=wasd

typeAliases元素
别名是一个较短的 Java 类型的名称。这只是与 XML 配置文件相关联,减少输入多余的完整类名。

映射文件中的类名本来是这样写的
在核心配置文件中的configuration标签中写入typeAliases,就是对全类名起了一个别名。在映射文件中的namespace中写别名就可以了。
运行结果没有任何的问题

Mappers元素
Mapper 接口开发方法只需要程序员编写 Mapper 接口(相当于 Dao 接口), 由 Mybatis 框架根据接口定义创建接口的动态代理对象.

使用 session.getMapper(接口.class);获得代理对象

Mapper 接口在开发时需要遵循以下规范:

Mapper.xml 文件中的 namespace 与 mapper 接口的类路径相同。
Mapper 接口方法名和 Mapper.xml 中定义的每个 statement 的 id 相同
Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 ==parameterType 的类型相同 ==
Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同。

SqlSessionFactory和SqlSession元素
SqlSessionFactory
Factory是工厂的意思。

SqlSessionFactory中包含了核心配置信息

由于SqlSessionFactory对象创建开销较大,所以一旦创建就不用销毁,一个应用程序中只有一个SqlSessionFactory即可

SqlSession
SqlSession对象 表示一次与数据库的连接。类似于JDBC中的Connection

每次与数据库交互一次,都会创建一个SqlSession对象(openSession()),用完之后,就会销毁释放掉

Mybatis的日志功能
Mybatis 内置的日志工厂提供日志功能,具体的日志实现有以下几种方式:
SLF4J
LOG4J
LOG4J2
JDK_LOGGING
COMMONS_LOGGING
STDOUT_LOGGING
NO_LOGGING
具体选择哪个日志实现由 MyBatis 的内置日志工厂确定。它会使用最先找到的。

我这里采用log4g来说明
先在Maven的中心仓库找到对应的坐标,然后导入到Maven的本地仓库使用

    <!-- https://mvnrepository.com/artifact/log4j/log4j -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

然后将log4j的配置文件导入进来,直接在resources下创建

log4j.rootLogger = debug,stdout,D
#System out Console
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%p] %d{yyyy-MM-dd HH:mm:ss,SSS} %m%n

#System out File
log4j.appender.D = org.apache.log4j.FileAppender
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ] -[%l] %m%n

想要具体使用这个日志还要配置日志

<settings> 
	<setting name="logImpl" value="LOG4J"/> 
</settings>

seetings的配置是在properties紧跟的标签之下。

配置在核心配置文件中。

<settings>
	<setting name="logImpl" value="LOG4J"/>
</settings>

name中的名字是不能改变的,意为log的实现,value选择具体实现的是哪一种的日志,这里选择的是LOG4J

再次执行,控制台里就有了对应的日志输出

在log4j的配置里根据自己选择的路径在文档中也是可以查看到的。

Mybatis中的单元测试
单元测设也是需要jar包的
添加用来测试的jar包

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>provided</scope><!--test 也是不会被打包 到war包-->
    </dependency>

加进来以后,想要单独的执行测设一个方法,就在这个方法上面加一个注解标签@Test
单元测试就是可以使我们单独独立的去执行一段方法,就是在没有main方法的情况下也是可以执行的

一个类中可以写多个方法,要执行那个测试代码就点击该方法前面的小箭头执行该方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值