构建运行第一个Mybatis项目

前言

看视频学的记一下笔。

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。



一、创建基础工程

1. 创建一个普通的Maven项目

在这里插入图片描述
在这里插入图片描述

2.配置基础工程环境

1). 进入settings,更改一下默认的maven路径

在这里插入图片描述

2). 删除src

在这里插入图片描述

3). 导入依赖

如下:

<dependencies>
        <!--mysql驱动,版本对应自己的即可-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.18</version>
        </dependency>

        <!--mybatis-->
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>

        <!--junit-->
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

    </dependencies>
授人以渔:

如果要其他版本、依赖,可去这里找: Maven存储库
mybatis依赖:传送门
mysql依赖:传送门
junit依赖: 传送门

以mybatis为例,打开网站,选择一个版本点进去
在这里插入图片描述
直接把这段复制到pom.xml配置文档中的 <dependencies> 模块下即可
在这里插入图片描述
如下
在这里插入图片描述



二、创建项目

1. 创建一个模块

在这里插入图片描述
在这里插入图片描述
自动继承基础工程(父工程)的配置:
在这里插入图片描述


2.编写mybatis核心配置文件

官网教程:传送门

1). 创建mybatis-config.xml配置文件

在这里插入图片描述

2). 找到官网的配置数据

从官网找到一下核心配置
在这里插入图片描述

3).将其写入创建的mybatis-config.xml文件中

在这里插入图片描述

4).修改配置文件
<?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"/>
            <dataSource type="POOLED">
           		<!--加载驱动-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!--连接地址-->  
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;charsetEncoding=UTF-8&amp;serverTimezone=UTC"/>
                <!--用户、密码-->
				<property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
<!--先注释,等下写自己的mappers-->
<!--    <mappers>-->
<!--        <mapper resource="org/mybatis/example/BlogMapper.xml"/>-->
<!--    </mappers>-->
</configuration>



3. 编写mybatis工具类(构建工厂SqlSessionFactory)

以下内容来源于官网: 传送门

从 XML 中构建 SqlSessionFactory

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory
的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从
XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new >SqlSessionFactoryBuilder().build(inputStream);

从 SqlSessionFactory 中获取 SqlSession

既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。例如:

try (SqlSession session = sqlSessionFactory.openSession()) {
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
}
1). 创建一个工具类

在这里插入图片描述

2). 写入方法、获取sqlSession

每次在使用mybatis都要用的配置,所以直接写为一个工具类

package com.learn.utils;

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

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

/** 从sqlSessionFactory (get)--> sqlSession*/
public class MybatisUtils {

    private static SqlSessionFactory sqlSessionFactory;

    // 使用mybatis必要配置:获取sqlSessionFactory对象、获取sqlSession
    static{     // 写在static中,在加载类的时候一起加载static块中的数据
        try {

            String resource = "mybatis-config.xml";
            InputStream inputStream= Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /** 获取sqlSessionFactory,就可获得 sqlSession的实例
    *   sqlSession中包含面向数据库执行sql命令的所有方法。*/
     public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}



4.实体类

变量的名字应与数据库中相应表的字段所对应。
在这里插入图片描述

package com.learn.pojo;

public class User {
    private int id;
    private String name;
    private String pwd;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }

    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 getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}



5. 构建mapper

mapper就等价于dao

探究已映射的 SQL 语句

在上面提到的例子中,一个语句既可以通过 XML 定义,也可以通过注解定义。我们先看看 XML 定义语句的方式,事实上 MyBatis 提供的所有特性都可以利用基于 XML 的映射语言来实现,这使得 MyBatis 在过去的数年间得以流行。如果你用过旧版本的 MyBatis,你应该对这个概念比较熟悉。 但相比于之前的版本,新版本改进了许多 XML 的配置,后面我们会提到这些改进。这里给出一个基于 XML 映射语句的示例,它应该可以满足上个示例中 SqlSession 的调用

<?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="org.mybatis.example.BlogMapper>
	<select id="selectBlog" resultType="Blog">
		select * from Blog where id = #{id}
	</select>
</mapper>
1). 构建一个UserMapper接口

在这里插入图片描述

package com.learn.mapper;

import com.learn.pojo.User;
import java.util.List;

public interface UserMapper {
    List<User> getUserList();
}
2). 构建一个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">

<!--namespace 绑定一个对应的DAO/Mapper接口-->
<mapper namespace="com.learn.mapper.UserMapper">

<!--id对应UserMapper接口中的方法, resultType=返回结果-->
    <select id="getUserList" resultType="com.learn.pojo.User">
        select * from mybatis.user;
    </select>
</mapper>




三、测试

测试结构

在test目录下构建与main中相同的目录结构
如:com.learn.mapper
在这里插入图片描述

构建测试类

package com.learn.mapper;

import com.learn.pojo.User;
import com.learn.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class UserMapperTest {
    @Test
    public void test(){

        // 获得SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        // 执行sql  面向接口编程,这里只需要拿到UserMapper接口即可,UserMapper.xml可看作其实现类
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        //获得结果
        List<User> userList = userMapper.getUserList();

        //输出结果
        for (User user : userList ) {
            System.out.println(user);
        }

        //关闭SqlSession流
        sqlSession.close()
    }
}

运行结果


错误
运行报错1:

org.apache.ibatis.binding.BindingException: Type interface com.learn.mapper.UserMapper is not known to the MapperRegistry
在这里插入图片描述

出现这个错误的原因是这里的UserMapper.xml还没有在核心配置文件中注册。

在之前创建项目时第二步的核心配置文件中进行注册,将以下代码添加进去即可(注意路径及名字)

	<mappers>
        <mapper resource="com/learn/mapper/UserMapper.xml"/>
    </mappers>

在这里插入图片描述

运行报错2:

java.lang.ExceptionInInitializerError
在这里插入图片描述

初始化异常,UserMapper.xml这个文件可能不存在
因为资源过滤的问题,导致UserMapper.xml没有被导出,在targe文件夹下现在是没有这个文件的,所以才会找不到
注:target文件夹是用来存放项目构建后的文件和目录、jar包、war包、编译的class文件,都是maven构建时生成的。
maven是约定大于配置的

在这里插入图片描述

最直接的方式是直接把上面的UserMapper.xml复制下来,但是这个方法太笨了,不可能每次的要自己拷贝
两种方法:
1.把xml文件写到resources下,这样就不会被过滤了
2.把下面的代码写入pom.xml中,基础工程与当前项目可以两个都写上

	<build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>
directory:指定资源所在的目录,目录的路径是相对于pom.xml文件的
includes:指定要包含哪些文件
filtering标签中:false表示不过滤,true表示过滤

在这里插入图片描述

最终结果:
在这里插入图片描述

总结

如果需要单独导出一个项目,就需要更改一下配置,因为有些配置是在基础工程里写的,还需要复制一下

容易出问题的地方:

  1. 核心配置文件中要注册mappers
  2. mapper.xml中注意绑定的接口、方法名、返回值类型
  3. maven的导出资源问题

步骤:

  1. 写工具类(MybatisUtils --> SqlSessionFactory)
  2. 写配置文件(mybatis-config.xml)
  3. 写实体类(User)
  4. 写mapper接口
  5. 写mapper.xml
  6. 写test
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值