MyBatis第一个程序
思路流程:搭建环境–>导入Mybatis—>编写代码—>测试
1、搭建实验数据库
CREATE DATABASE mybatis;
USE mybatis;
DROP TABLE IF EXISTS user;
go
CREATE TABLE use` (
id int(20) NOT NULL PRIMARY KEY,
name varchar(30) DEFAULT NULL,
pwd varchar(30) DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into user values
(1,'狂神','123456'),
(2,'张三','abcdef'),
(3,'李四','987654');
导入MyBatis相关 jar 包
导入MyBatis相关 jar 包
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.24</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
3、编写MyBatis核心配置文件
<?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="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/数据库名称?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC"/>
<property name="username" value="用户名"/>
<property name="password" value="密码"/>
</dataSource>
</environment>
</environments>
<!--
<mappers>这一段可以先注释掉
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
-->
</configuration>
4、编写MyBatis工具类
MyBatis工具类的编写请跳转
[MyBatis工具类](https://blog.csdn.net/weixin_45928234/article/details/117426169)
5、创建实体类
baen中的属性名一定要与数据库表中的列名一一对应
虽然不对应后期也能处理,但是会很麻烦
//实体类
public class User {
private int id; //id
private String name; //姓名
private String pwd; //密码
//构造,有参,无参
//set/get
//toString()
}
6、编写Mapper接口类
import java.util.List;
public interface UserMapper {
List<User> selectUser();
}
7、编写Mapper.xml配置文件
现在你可能很想知道 SqlSession 和 Mapper 到底具体执行了些什么操作,但 SQL 语句映射是个相当广泛的话题,可能会占去文档的大部分篇幅。 但为了让你能够了解个大概,这里会给出几个例子。
在上面提到的例子中,一个语句既可以通过 XML 定义,也可以通过注解定义。我们先看看 XML 定义语句的方式,事实上 MyBatis 提供的所有特性都可以利用基于 XML 的映射语言来实现,这使得 MyBatis 在过去的数年间得以流行。如果你用过旧版本的 MyBatis,你应该对这个概念比较熟悉。 但相比于之前的版本,新版本改进了许多 XML 的配置,后面我们会提到这些改进。这里给出一个基于 XML 映射语句的示例,它应该可以满足上个示例中 SqlSession 的调用。
namespace 十分重要,不能写错!
- 接口实现类由原来的UserDaolmpl转变为一个Mapper配置文件.
<?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.kuang.dao.UserMapper">
<!--查询语句-->
<!--id是指的接口中的方法名,
resultType指的是返回结果类型,必须是全限定类名,返回一个
resultMap:返回一个集合-->
<select id="selectUser" resultType="com.kuang.pojo.User">
select * from user
</select>
</mapper>
8、编写测试类
Junit 包测试
@Test
public void selectUser() {
//第一步,获得SqlSession
SqlSession session = MybatisUtils.getSqlSession();
//第一步,获取sql
UserMapper mapper = session.getMapper(UserMapper.class);
//第三步,执行sql
List<User> users = mapper.selectUser();
for (User user : users) {
System.out.println(user);
}
//关闭session
session.close();
}
9.报错解析
- org.apache.ibatis.binding.BindingException
org.apache.ibatis.binding.BindingException: Type interface 接口名 is not known to the MapperRegistry.
类型接口是未知的
<!--每一个Mapper.xml都需要在MyBatis核心配置文件中注册-->
<!--把这一段还加入到config.xml中-->
<mappers>
<mapper resource="com/kuang/dao/UserMapper.xml"></mapper>
</mappers>
- java.lang.ExceptionInInitializerError
java.lang.ExceptionInInitializerError
The error may exist in xxxx.xml
xxx.xml不存在,找不到xml
- Maven静态资源过滤问题
maven由于他的约定大于配置,我们之后可以能遇到我们写的配置文件,无法被导出或者生效的问题,解决方案:
10.问题说明
可能出现问题说明:Maven静态资源过滤问题
maven默认资源文件配置是放到resources中的,我们把它放到了java目录下,他是无法导出的
所以我们需要手动配置资源过滤
<!--在build中配置resources,来防止我们资源导出失败的问题
所有的项目最好都导一遍,以免配置不生效-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>