Mybatis

Mybatis

1. 关于Mybatis

Mybatis的主要作用是快速实现对关系型数据库中的数据进行访问的框架。

2. 创建整合了Spring与Mybatis的工程

Mybatis可以不依赖于Spring等框架直接使用的,但是,就需要进行大量的配置,前期配置工作量较大,基于Spring框架目前是业内使用的标准之一,所以,通常会整合Spring与Mybatis,以减少配置。

在创建工程时,创建普通的Maven工程即可(不需要选择特定的骨架)。

pom.xml中,需要添加几个依赖项,分别是:

Mybatis的依赖项:mybatis


<dependency>
    <groupId>org.mybatisgroupId>
    <artifactId>mybatisartifactId>
    <version>3.5.6version>
dependency>

Mybatis整合Spring的依赖项:mybatis-spring


<dependency>
    <groupId>org.mybatisgroupId>
    <artifactId>mybatis-springartifactId>
    <version>2.0.6version>
dependency>

Spring的依赖项:spring-context


<dependency>
    <groupId>org.springframeworkgroupId>
    <artifactId>spring-contextartifactId>
    <version>5.3.14version>
dependency>

Spring JDBC的依赖项:spring-jdbc

<dependency>
    <groupId>org.springframeworkgroupId>
    <artifactId>spring-jdbcartifactId>
    <version>5.3.14version>
dependency>

MySQL连接的依赖项:mysql-connector-java


<dependency>
    <groupId>mysqlgroupId>
    <artifactId>mysql-connector-javaartifactId>
    <version>8.0.21version>
dependency>

数据库连接池的依赖项:commons-dbcp


<dependency>
    <groupId>commons-dbcpgroupId>
    <artifactId>commons-dbcpartifactId>
    <version>1.4version>
dependency>

JUnit测试的依赖项:junit-jupiter-api


<dependency>
    <groupId>org.junit.jupitergroupId>
    <artifactId>junit-jupiter-apiartifactId>
    <version>5.7.0version>
    <scope>testscope>
dependency>

创建完成后,可以在src/test/java下创建测试类,并编写测试方法,例如:

package cn.tedu.mybatis;

import org.junit.jupiter.api.Test;

public class MybatisTests {

    @Test
    public void contextLoads() {
        System.out.println("MybatisTests.contextLoads()");
    }

}

由于目前尚未编写实质的代码,以上测试代码也非常简单,应该是可以成功通过测试的,如果不能通过测试,必然是开发工具、开发环境、依赖项、项目创建步骤等问题。

3. 配置Mybatis的开发环境

首先,登录MySQL控制台,创建名为mall_ams的数据库:

CREATE DATABASE mall_ams;

然后,在IntelliJ IDEA中配置数据库视图:http://doc.canglaoshi.org/doc/idea_database/index.html

然后,通过数据库视图的Console面板创建数据表:

create table ams_admin (
    id bigint unsigned auto_increment,
    username varchar(50) default null unique comment '用户名',
    password char(64) default null comment '密码(密文)',
    nickname varchar(50) default null comment '昵称',
    avatar varchar(255) default null comment '头像URL',
    phone varchar(50) default null unique comment '手机号码',
    email varchar(50) default null unique comment '电子邮箱',
    description varchar(255) default null comment '描述',
    is_enable tinyint unsigned default 0 comment '是否启用,1=启用,0=未启用',
    last_login_ip varchar(50) default null comment '最后登录IP地址(冗余)',
    login_count int unsigned default 0 comment '累计登录次数(冗余)',
    gmt_last_login datetime default null comment '最后登录时间(冗余)',
    gmt_create datetime default null comment '数据创建时间',
    gmt_modified datetime default null comment '数据最后修改时间',
    primary key (id)
) comment '管理员表' charset utf8mb4;

至此,本案例所需的数据库与数据表已经准备完毕。

src/main/resources下创建datasource.properties配置文件,用于配置连接数据库的参数,例如:

datasource.url=jdbc:mysql://localhost:3306/mall_ams?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
datasource.driver=com.mysql.cj.jdbc.Driver
datasource.username=root
datasource.password=root

并且,在cn.tedu.mybatis包下(不存在,则创建)创建SpringConfig类,读取以上配置文件:

@Configuration
@PropertySource("classpath:datasource.properties")
public class SpringConfig {
}

完成后,在测试方法中补充测试代码:

@Test
public void contextLoads() {
    System.out.println("MybatisTests.contextLoads()");
    AnnotationConfigApplicationContext ac
            = new AnnotationConfigApplicationContext(SpringConfig.class);

    ConfigurableEnvironment environment = ac.getEnvironment();

    System.out.println(environment.getProperty("datasource.url"));
    System.out.println(environment.getProperty("datasource.driver"));
    System.out.println(environment.getProperty("datasource.username"));
    System.out.println(environment.getProperty("datasource.password"));

    ac.close();
}

接下来,在SpringConfig中配置一个DataSource对象:

package cn.tedu.mybatis;

import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;

import javax.sql.DataSource;

@Configuration
@PropertySource("classpath:datasource.properties")
public class SpringConfig {

    @Bean
    public DataSource dataSource(Environment env) {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setUrl(env.getProperty("datasource.url"));
        dataSource.setDriverClassName(env.getProperty("datasource.driver"));
        dataSource.setUsername(env.getProperty("datasource.username"));
        dataSource.setPassword(env.getProperty("datasource.password"));
        return dataSource;
    }

}

并在测试类中添加新的测试方法,以尝试获取数据库的连接对象,检测是否可以正确连接到数据库:

@Test
public void testConnection() throws Exception {
    AnnotationConfigApplicationContext ac
            = new AnnotationConfigApplicationContext(SpringConfig.class);

    DataSource dataSource = ac.getBean("dataSource", DataSource.class);

    Connection connection = dataSource.getConnection();
    System.out.println(connection);

    ac.close();
}

至此,项目的数据库编程的准备完毕。

4. Mybatis的基本使用

当使用Mybatis实现数据访问时,主要:

  • 编写数据访问的抽象方法
  • 配置抽象方法对应的SQL语句

关于抽象方法:

  • 必须定义在某个接口中,这样的接口通常使用Mapper作为名称的后缀,例如AdminMapper
    • Mybatis框架底层将通过接口代理模式来实现
  • 方法的返回值类型:如果要执行的数据操作是增、删、改类型的,统一使用int作为返回值类型,表示“受影响的行数”,也可以使用void,但是不推荐
  • 方法的名称:自定义,不要重载,建议风格如下:
    • 插入数据使用insert作为方法名称中的前缀或关键字
    • 删除数据使用delete作为方法名称中的前缀或关键字
    • 更新数据使用update作为方法名称中的前缀或关键字
    • 查询数据时:
      • 如果是统计,使用count作为方法名称中的前缀或关键字
      • 如果是单个数据,使用getfind作为方法名称中的前缀或关键字
      • 如果是列表,使用list作为方法名称中的前缀或关键字
    • 如果操作数据时有条件,可在以上前缀或关键字右侧添加by字段名,例如deleteById
  • 方法的参数列表:取决于需要执行的SQL语句中有哪些参数,如果有多个参数,可将这些参数封装到同一个类型中,使用封装的类型作为方法的参数类型

假设当需要实现“插入一条管理员数据”,则需要执行的SQL语句大致是:

insert into ams_admin (username, password, nickname, avatar, phone, email, description, is_enable, last_login_ip, login_count, gmt_last_login, gmt_create, gmt_modified) values (?,?,? ... ?);

由于以上SQL语句中的参数数量较多,则应该将它们封装起来,则在cn.tedu.mybatis包下创建Admin类,声明一系列的属性,对应以上各参数值:

package cn.tedu.mybatis;

import java.time.LocalDateTime;

public class Admin {
    
    private String username;
    private String password;
    private String nickname;
    private String avatar;
    private String phone;
    private String email;
    private String description;
    private Integer isEnable;
    private String lastLoginIp;
    private Integer loginCount;
    private LocalDateTime gmtLastLogin;
    private LocalDateTime gmtCreate;
    private LocalDateTime gmtModified;
    
 	// Setters & Getters
    // toString()
}

接下来,在cn.tedu.mybatis包下创建mapper.AdminMapper接口,并在接口中添加“插入1条管理员数据”的抽象方法:

package cn.tedu.mybatis.mapper;

import cn.tedu.mybatis.Admin;

public interface AdminMapper {

    int insert(Admin admin);

}

所有用于Mybatis处理数据的接口都必须被Mybatis识别,有2种做法:

  • 在每个接口上添加@Mapper注解
  • 推荐:在配置类上添加@MapperScan注解,指定接口所在的根包

例如,在SpringConfig上添加配置@MapperScan

@Configuration
@PropertySource("classpath:datasource.properties")
@MapperScan("cn.tedu.mybatis.mapper")
public class SpringConfig {

    // ... ...
    
}

注意:因为Mybatis会扫描以上配置的包,并自动生成包中各接口中的代理对象,所以,千万不要放其它接口文件!

接下来,需要配置抽象方法对应的SQL语句,这些SQL语句推荐配置在XML文件中,可以从 http://doc.canglaoshi.org/config/Mapper.xml.zip 下载到XML文件。在项目的src/main/resources下创建mapper文件夹,并将下载得到的XML文件复制到此文件夹中,重命名为AdminMapper.xml

打开XML文件夹,进行配置:


DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">



<mapper namespace="cn.tedu.mybatis.mapper.AdminMapper">

    
    
    
    
    <insert id="insert">
        insert into ams_admin (
            username, password, nickname, avatar, 
            phone, email, description, is_enable, 
            last_login_ip, login_count, gmt_last_login, gmt_create, 
            gmt_modified
        ) values (
            #{username}, #{password}, #{nickname}, #{avatar}, 
            #{phone}, #{email}, #{description}, #{isEnable}, 
            #{lastLoginIp}, #{loginCount}, #{gmtLastLogin}, #{gmtCreate}, 
            #{gmtModified}
        )
    insert>

mapper>

最后,还需要将DataSource配置给Mybatis框架,并且,为Mybatis配置这些XML文件的路径,这2项配置都将通过配置SqlSessionFactoryBean来完成。

先在datasource.properties中补充一条配置:

mybatis.mapper-locations=classpath:mapper/AdminMapper.xml

然后在配置类中创建SqlSessionFactoryBean类型的对象:

@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource,
        @Value("${mybatis.mapper-locations}") Resource mapperLocations) {
    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(dataSource);
    sqlSessionFactoryBean.setMapperLocations(mapperLocations);
    return sqlSessionFactoryBean;
}

最后,在测试类中补充测试方法,以检验是否可以通过调用AdminMapperinsert()方法插入数据:

@Test
public void testInsert() {
    AnnotationConfigApplicationContext ac
            = new AnnotationConfigApplicationContext(SpringConfig.class);

    AdminMapper adminMapper = ac.getBean(AdminMapper.class);

    Admin admin = new Admin();
    admin.setUsername("admin001");
    admin.setPassword("12345678");
    adminMapper.insert(admin);

    ac.close();
}

你可能感兴趣的:(mysql)