mybatis入门+快速上手(面向官网编程)

什么是 MyBatis?

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
回答得这么官方一看就是官网(https://mybatis.org/mybatis-3/zh/index.html)拷贝过来的啦。

根据官网的描述来看,Mybatis是基于持久层(DAO)的一个框架,然后就是mybatis对传统JDBC操作进行了封装和简化(划重点)。

MyBatis有什么用?

既然是对jdbc的简化封装,当然是为了更方便地对数据库进行操作啦。

MyBatis如何使用?

重点来了看下面↓

先看一下官网是怎么说的
mybatis009
大概意思就是,你把jar包丢进去就可以用了。牛*那就来吧!

首先打开工具IDEA
创建一个新的项目
mybatis001

你可以使用其他方式创建项目,为了方便快捷我这里直接用maven创建。
点maven不使用骨架,直接Next下一步创建项目。
mybatis002

然后填写你项目的坐标,也就是项目名。
ArtifactID是指项目的标识,定义了项目属于哪个组,一般由你公司域名倒写如:com.baidu
Artifacted定义了当前maven项目在组中唯一的ID,写项目名就行了
如果子父工程的项目这部分比较重要
我这个是单模块,so~填完点击next下一步
mybatis003

在这里继续填写你的项目名,还有你项目存放的路径。
注意下面折叠起来的信息!
mybatis004

搞定之后finish创建项目项目就出来了
mybatis005

项目创建完了,创建个数据库创建个表

-- 1.创建数据库
CREATE DATABASE mybatis DEFAULT CHARACTER SET utf8;

-- 2.创建用户表
DROP TABLE IF EXISTS USER;

CREATE TABLE USER (
  id INT(11) NOT NULL AUTO_INCREMENT,
  username VARCHAR(32) NOT NULL COMMENT '用户名称',
  birthday DATETIME DEFAULT NULL COMMENT '生日',
  sex CHAR(1) DEFAULT NULL COMMENT '性别',
  address VARCHAR(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY  (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT  INTO USER(id,username,birthday,sex,address) VALUES 
(41,'小三','2019-09-27 17:47:08','女','东莞'),
(42,'小四','2019-09-02 15:09:37','女','东莞'),
(43,'小五','2019-09-04 11:34:34','女','东莞'),
(45,'小六','2019-09-05 12:04:06','男','北京'),
(46,'老王','2019-09-07 17:37:26','男','上海'),
(48,'老李','2019-09-08 11:44:00','男','广州');

项目创建好了,数据也有了,开始写项目了。

先创建一个实体类
mybatis01\src\main\java\com\Mrhu\entity\User.java
mybatis006
mybatis007

然后完善实体类,把数据库的字段跟实体类属性对应好,一张表对应一个实体类,提供get和set方法。在这里不多解释了

import java.util.Date;

public class User {
    private int id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    public int getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

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

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

mybatis008

接着添加依赖,就是添加jar包。
在maven的pom.xml进行依赖添加

<dependencies>
        <!--要用mybatis肯定要他的包才能用,下面导入mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <!--mysql数据库驱动包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.30</version>
        </dependency>
        <!--日志包,可以要可以不用-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!--junit测试包方便测试运行-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
    </dependencies>

导入后刷新一下maven,没有报错就没问题了。

导入jar包没问题,第一步安装就已经完成了。接着按照官网提示就是需要进行一些配置。

mybatis010

从官网的描述来看,我们需要一些配置(SqlSessionFactory),这些配置包含了一些核心配置(好绕)!官网给出了两种配置方式:1.使用java代码进行配置;2.使用xml文件进行配置。so,那么来看看有哪些配置吧!

首先我这里使用的是第二种(使用xml文件进行配置),先创建一个xml文件(mybatis01\src\main\resources\SqlMapConfig.xml)空文件,名字叫SqlMapConfig.xml当然名字可以随意取不要花里胡哨就行,要遵循规范要见名知意,比如applicationContext.xml也是有人取。
mybatis011

文件创建好了之后,文件里该填些什么,继续看一下官网。

mybatis012

通过官网的描述,大概分析出,我们需要配置一些属性环境变量等东西。比较显眼的环境变量、数据源,也就是说连接数据库的东西在这配置。具体可以自己详看官网文档(有中文很友好)。

大概知道我们需要配置啥了,开始操作。

第一步是copy代码(能copy就不要敲,新手勿模仿)

mybatis013

先把文件头copy进来,这部分最好copy别自己手写没意义。

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

这段代码是添加约束,输入里面那个网址http://mybatis.org/dtd/mybatis-3-config.dtd就会下载出一个.dtd的文件,添加了约束之后你这个xml文件就要按照这个文件的规定来写,详细自己去摆渡了解。

添加依赖后继续完成下面的代码,就是属性的配置。
约束可以看出根节点为configuration
mybatis014

然后看看有哪些重要的属性,既然是基于JDBC的框架,那么肯定先得连接数据库吧,数据库都没连上说那么多都没意义。那就找找连接数据库的配置8.
mybatis015

找到这个环境配置就是配置数据源的,那就看看8.

mybatis016

可以看到这就是配置数据源的玩意,官网提供了两种方式,一种是基于java代码的配置,另一种是xml的设置,我这用的是xml方式那就按xml的来,做啥都要统一嘛。那就直接copy一下咯!

mybatis017
继续分析一下都是啥玩意
首先

environments default=“development”:他的描述是默认使用的环境 ID,其实就是下面的environment(后面没有s的看清楚)可以配置多个,id是指定使用其中一个。示范

<?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">
            <transactionManager type="JDBC">
                <property name="..." value="..."/>
            </transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>

        <environment id="development1">
            <transactionManager type="JDBC">
                <property name="..." value="..."/>
            </transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
        
        <environment id="development2">
            <transactionManager type="JDBC">
                <property name="..." value="..."/>
            </transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

就是说可以配置多个数据库的连接配置,然后**environments default=“development”**的作用是指定某一个配置

environment id=“development”:每个 environment 元素定义的环境 ID,上面已经解释的很清楚了,注意这个id最好用数据库的名字来命名如

<configuration>
    <environments default="Oracle">
        <environment id="mysql">
            <transactionManager type="JDBC">
                <property name="..." value="..."/>
            </transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>

        <environment id="Oracle">
            <transactionManager type="JDBC">
                <property name="..." value="..."/>
            </transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>

        <environment id="MongoDB">
            <transactionManager type="JDBC">
                <property name="..." value="..."/>
            </transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

transactionManager type=“JDBC”:事务管理器的配置(比如:type=“JDBC”)这个我就直接复制官网的话了,已经说的通俗易懂。
在 MyBatis 中有两种类型的事务管理器(也就是 type=”[JDBC|MANAGED]”):

JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。

MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如

<transactionManager type="MANAGED">
  <property name="closeConnection" value="false"/>
</transactionManager>

所以用JDBC就行了。(文章不对事务进行分析详细自行摆渡)

继续
dataSource type=“POOLED”:官方话太多我就不复制了,dataSource数据源的意思,tpye=POOLED(连接池),推测一下这应该就是连接池的配置8。
官网推荐了三种:[UNPOOLED|POOLED|JNDI]
我这就用推荐的POOLED具体有什么区别自行摆渡。

driver – 这是 JDBC 驱动的 Java 类的完全限定名(并不是 JDBC 驱动中可能包含的数据源类)。
url – 这是数据库的 JDBC URL 地址。
username – 登录数据库的用户名。
password – 登录数据库的密码。

到这里全都搞定了

<?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>
    <!--default 表示默认使用哪一个运行环境配置-->
    <environments default="mysql">
        <!--id="mysql" 表示mysql的运行环境配置-->
        <environment id="mysql">
            <!--事务管理器配置:基于JDBC的事务控制-->
            <transactionManager type="JDBC"></transactionManager>
            <!--连接池配置(UNPOOLED/POOLED/JNDI)-->
            <dataSource type="pooled">
                <property name="driver" value="com.mysql.jdbc.Driver"></property>
                <property name="url" value="jdbc:mysql:///mybatis?characterEncoding=utf8"></property>
                <property name="username" value="root"></property>
                <property name="password" value="root"></property>
            </dataSource>
        </environment>
    </environments>
</configuration>

基本的配置完,下面为了快速上手简化操作,我将脱离官网的描述与步骤。

目前我们的目录
mybatis018

继续创建一个接口
mybatis01\src\main\java\com\Mrhu\dao\UserDao.java
mybatis019
然后添加个查询方法。

import com.Mrhu.entity.User;

import java.util.List;

public interface UserDao {

    List<User> findAll();

}

注意是interface(接口)不是class(类)!
注意导包!
使用mybatis将不需要写接口的实现

继续创建关于这个接口的mapper,在这里定义SQL 映射语句。也就是sql在这里写。
那么创建这个文件先
mybatis01\src\main\resources\com\Mrhu\dao\UserDao.xml
mybatis020

继续编写这个文件
老样子添加约束

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

mapper是根节点里面包含了许多标签
mybatis021
例如最常使用的增删改查,那就先写句简单的sql吧。
注意属性值,这段代码不要完全复制粘贴!

<?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.Mrhu.dao.UserDao">
    <select id="findAll" resultType="com.Mrhu.entity.User">
        select * from user
    </select>
</mapper>

namespace 名称空间,表示当前的xml是哪一个接口的映射
select id 对应的是IUserDao接口的方法名称
select resultType 方法的返回值类型,如果方法返回的是集合,只要指定集合中元素的类型
select标签里面则是sql语句标签,我这里直接用sql语句暂且没用sql语句标签。

接口映射文件写完了

<?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">
<!--namespace 名称空间,表示当前的xml是哪一个接口的映射-->
<mapper namespace="com.Mrhu.dao.UserDao">
    <!--id 对应的是IUserDao接口的方法名称-->
    <!--resultType 方法的返回值类型,如果方法返回的是集合,只要指定集合中元素的类型-->
    <!--如何封装数据?mybatis会自动封装数据,要求:查询列名称要与对象的属性名称一致。-->
    <select id="findAll" resultType="com.Mrhu.entity.User">
        select * from user
    </select>
</mapper>

接着要加载这个配置文件,那就需要在之前的主配置文件中加上一段。
mybatis022

<?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>
    <!--default 表示默认使用哪一个运行环境配置-->
    <environments default="mysql">
        <!--id="mysql" 表示mysql的运行环境配置-->
        <environment id="mysql">
            <!--事务管理器配置:基于JDBC的事务控制-->
            <transactionManager type="JDBC"></transactionManager>
            <!--连接池配置(UNPOOLED/POOLED/JNDI)-->
            <dataSource type="pooled">
                <property name="driver" value="com.mysql.jdbc.Driver"></property>
                <property name="url" value="jdbc:mysql:///mybatis?characterEncoding=utf8"></property>
                <property name="username" value="root"></property>
                <property name="password" value="root"></property>
            </dataSource>
        </environment>
    </environments>
    <!--加载接口的映射文件-->
    <mappers>
        <!--必须放到类路径下-->
        <mapper resource="com/Mrhu/dao/UserDao.xml"></mapper>
    </mappers>
</configuration>

写完了就可以测试了,接着写个测试类测试一下吧。
mybatis01\src\test\java\com\Mrhu\dao\UserDaoTest.java
mybatis023

接着写测试类

import com.Mrhu.entity.User;
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 org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class UserDaoTest {

    @Test
    public void findAll() throws IOException {
        // 1. 获取文件流
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");

        // 2. 创建工厂的构建器
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

        // 3. 创建SqlSession的工厂
        SqlSessionFactory factory = builder.build(in);

        // 3. 创建SqlSession
        SqlSession session = factory.openSession();

        // 4. 创建接口的代理对象
        UserDao userDao = session.getMapper(UserDao.class);

        // 查看是否是代理对象?class com.sun.proxy.$Proxy2
        System.out.println(userDao.getClass());

        // 5. 调用方法
        List<User> list = userDao.findAll();
        System.out.println(list);

        // 6. 关闭,释放资源
        session.close();
        in.close();
    }
}

写完直接运行方法看是否查出数据,如果有就代表成功了。
mybatis025
如果报错了
1.确定你的运行环境正常
2.确定你数据源所指定的地址,数据库的账号密码是否一致。
3.确定你的数据库是能连接上的,如mysql服务没打开
4.确定你代码里文件路径是对的
5.如果能运行但是报了这样的错了
mybatis024
你是导了log4j没有配置
那么创建一个log4j的配置文件
mybatis01\src\main\resources\log4j.properties
mybatis026
文件内容直接copy这里,需要详细了解里面内容请自行摆渡log4j

# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE            debug   info   warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n


继续运行,控制台打印的内容将更详细
mybatis027

如有错误的地方请指出,本文将持续更新修改。
完结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值