MyBatis学习-(一)MyBatis入门例子

本文最后更新于:May 13, 2023 pm

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

目录

MyBatis 中文文档:https://mybatis.org/mybatis-3/zh/index.html

1.创建项目

  1. 首先建一个空工程(Empty Project)。
  1. 新建一个 Module ,选择 Maven(快速创建 org.apache.maven.archetypes:maven-archetype-quickstart)。
  1. 在 main 下新建一个 resources 文件。(右键 main 选择 new -> Directory,创建(选择)resources 即可)。如果创建后图标只是一个单纯的文件夹(没有其他东西),右键该文件夹,选择 Mark Directory as -> Resources Root 。(注意:如果是 Test Resources Root 则不需要点。如果点了后,再按照同样的步骤点一遍即可。)
  1. 整理 pom.xml文件
  • 可以将文件中以下代码删除不要。

    1
    2
    3
    <name>Temp</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>
  • 修改

    1
    2
    3
    4
    5
    <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
  • 删除或注释掉build里面的内容,现在不需要。注意:只是删除或注释build里面的内容,而不包含build

2.添加依赖

打开 pom.xml文件。在 dependencies中添加依赖。

2.1 MyBatis 依赖

1
2
3
4
5
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>

报错先不要急!

2.2 MySQL 驱动

1
2
3
4
5
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
  • 处理

    右键 pom.xml文件,选择 Maven-> Reload project(刷新图标)

在右侧的 Maven 中可以看见添加的依赖。

📢注意:这里使用的是mysql 5.1 版本的,可能会报错如下,只需要将 5.1 换成8.0 版本的即可。

3.创建实体类

在 main 中(src/main/java/com/loong/test) 下创建 USER 实体类。要求属性与列名一样。快速创建get 、 set 和 toString()方法 Alt + Insert

USER.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.loong.test;

public class USER {
private Integer id;
private String username;
private String tele;

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 getTele() {
return tele;
}

public void setTele(String tele) {
this.tele = tele;
}

@Override
public String toString() {
return "USER{" +
"id=" + id +
", username='" + username + '\'' +
", tele='" + tele + '\'' +
'}';
}
}

4.创建DAO接口

在 main 中(src/main/java/com/loong/dao)下 创建 MybatisStudyDao接口

USERDao

1
2
3
4
5
6
7
8
9
10
11
12
13
//查询表的所有数据
package com.loong.Dao;

import com.loong.test.USER;

import java.util.List;

public interface MybatisStudyDao {

public List<USER> alluser();

}

5.SQL映射文件

**需要放在与接口同一目录下,即 src/main/java/com/loong/dao 目录下。文件名称与接口名称一样。 **

创建 MybatisStudyDao.xml 文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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.loong.Dao.MybatisStudyDao">
<!-- <select id="selectBlog" resultType="Blog">-->
<!-- select * from Blog where id = #{id}-->
<!-- </select>-->

<select id="alluser" resultType="com.loong.test.USER">
select * from test;
</select>
</mapper>

SQL映射文件:用来写SQL语句的。MyBatis会执行这些SQL。
其中,

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

这个是指定约束文件。mybatis-3-mapper.dtd 是约束文件的名称。约束文件用来限制和检查在当前文件中出现的标签、属性是否符合MyBatis的要求。

mapper:是当前文件的根标签,且是必须的。
namespace:是命名空间,唯一值,可以是自定义的字符串,但必须是使用 dao 接口的全限定名称。如:com.loong.dao.USERDao

<select> :执行查询语句。
<update>:更新数据库操作。
<insert>:插入。
<delete>:删除。

1
2
3
<select id="alluser" resultType="com.loong.test.USER">
select * from test;
</select>

id:要执行的SQL语句的唯一标识,MyBatis会使用这个id的值来找到要执行的SQL语句。可以自定义,但是要求使用接口中的方法名称。
resultType:表示结果类型。是SQL语句执行后得到 ResultSet ,遍历这个 ResultSet 得到 Java 对象的类型。值是类型的全限定名称。

6.数据库连接

resources中新建 mybatis.xml 文件。

mybatis.xml;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/teamc?useSSL=false &amp; serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="loong"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/loong/Dao/MybatisStudyDao.xml"/>
</mappers>
</configuration>

mybatis 的主配置文件:主要定义了数据库的配置信息,SQL映射文件的位置。

约束文件。

1
2
3
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

configuration :是根标签。
environments:是环境配置,就是数据库的连接信息。default 表示默认连接哪一个数据库,必须和某个 environment 的 id 值一样,告诉mybatis使用哪一个数据库的连接信息。
environment:一个数据库信息的配置。id 是表示环境的名称
transactionManager:表示事务的类型。 type :jdbc(表示使用jdbc中的Connection对象的commit、rollback做事务处理。)
dataSource:表示数据源,用来连接数据库的。type 表示数据源的类型,而 pooled 表示使用连接池。
property:表示数据库的具体信息。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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/teamc"/>
<property name="username" value="root"/>
<property name="password" value="12345"/> //密码
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/loong/dao/USERDao.xml"/>
</mappers>
</configuration>

其中的 mappers 中写sql映射文件的位置。
一个mapper标签指定一个文件的位置。从类路径开始的路径信息(target/classes),其中classes就是类路径。这里的 target 文件需要在编译后才能看到。
在右侧的 Maven中, Lifecycle -> compile 。

但在默认情况下,target 中没有xml 文件。需要安装maven插件(也可以不用安装)。

pom.xml文件的 build中添加如下代码。

1
2
3
4
5
6
7
8
9
10
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的 .properties.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>

加好之后,可以 Rload project ,再编译一遍。

7.运行

在main 下的 loong 目录下新建一个 java文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static void main(String[] args) throws IOException {

String config = "mybatis.xml";
InputStream in = Resources.getResourceAsStream(config);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession sqlsession = factory.openSession();
//也可以简写为
// String resource = "myBatis.xml";
// InputStream in = Resources.getResourceAsStream(resource);
// SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
// SqlSession session = factory.openSession();

// sqlid为: namespace + "." + select|update|insert|delete 标签的id属性值
String sqlid = "com.loong.Dao.MybatisStudyDao"+"."+"alluser";
// String sqlid = "com.loong.Dao.MybatisStudyDao.alluser";
List<USER> us = sqlsession.selectList(sqlid);
us.forEach(stu->System.out.println(stu));
sqlsession.close();

}

完整代码

1.项目目录

2.代码实现

1.1 MyBatisStudyDao(接口)

1
2
3
4
5
6
7
8
9
10
11
12
package com.loong.Dao;

import com.loong.test.USER;

import java.util.List;

public interface MybatisStudyDao {

public List<USER> alluser();

}

1.2 MyBatisStudyDao.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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.loong.Dao.MybatisStudyDao">
<!-- <select id="selectBlog" resultType="Blog">-->
<!-- select * from Blog where id = #{id}-->
<!-- </select>-->

<select id="alluser" resultType="com.loong.test.USER">
select * from test;
</select>
</mapper>

2.1 USER

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.loong.test;

public class USER {
private Integer id;
private String username;
private String tele;

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 getTele() {
return tele;
}

public void setTele(String tele) {
this.tele = tele;
}

@Override
public String toString() {
return "USER{" +
"id=" + id +
", username='" + username + '\'' +
", tele='" + tele + '\'' +
'}';
}
}

3.1 myapp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.loong;

import com.loong.test.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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class myapp {
public static void main(String[] args) throws IOException {

String config = "mybatis.xml";
InputStream in = Resources.getResourceAsStream(config);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession sqlsession = factory.openSession();
// String sqlid = "com.loong.Dao.MybatisStudyDao"+"."+"alluser";
String sqlid = "com.loong.Dao.MybatisStudyDao.alluser";
List<USER> us = sqlsession.selectList(sqlid);
us.forEach(stu->System.out.println(stu));
sqlsession.close();

}
}

4.1 mybatis.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/teamc?useSSL=false &amp; serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="loong"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/loong/Dao/MybatisStudyDao.xml"/>
</mappers>
</configuration>

5.1 pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<?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.loong</groupId>
<artifactId>MyBatis_Study</artifactId>
<version>1.0-SNAPSHOT</version>

<!-- <name>MyBatis_Study</name>
&lt;!&ndash; FIXME change it to the project's website &ndash;&gt;
<url>http://www.example.com</url>-->

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>

<!-- MyBatissss 依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version>
</dependency>

<!-- MySQL 驱动 -->

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

</dependencies>

<build>

<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的 .properties.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>

<!--<pluginManagement>&lt;!&ndash; lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) &ndash;&gt;
<plugins>
&lt;!&ndash; clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle &ndash;&gt;
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
&lt;!&ndash; default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging &ndash;&gt;
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
&lt;!&ndash; site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle &ndash;&gt;
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>-->
</build>
</project>

报错问题

报错原因:没有找到资源文件。(但自己明明写了,但为什么报错没有资源文件。)

这是因为在build后的文件夹中没有build上(看target文件夹),对照图片。

解决办法一:直接将缺少的配置文件复制粘贴到对应的位置即可。

解决办法二:将以下代码加入pom中的build标签下。

1
2
3
4
5
6
7
8
9
10
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的 .properties.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>

然后删除之前的target文件夹,再重新Rebuild Project 即可。

如果在resource目录出现相同情况,只需要再多写一个针对resource目录的即可,即:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的 .properties.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>

<resource>
<directory>src/main/resource</directory><!--所在的目录-->
<includes><!--包括目录下的 .properties.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>

本文作者: 墨水记忆
本文链接: https://tothefor.com/DragonOne/855302084.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!