2. 第一个Mybatis程序
2.1 环境搭建
新建数据库
create database if not exists mybatis default charset=utf8;
use mybatis;
create table `user`(
id int(20) not null auto_increment primary key,
`name` varchar(30) default null,
`pwd` varchar(30) default null
)ENGINE=INNODB default charset=utf8;
insert into `user`(`name`,`pwd`) VALUES
("张三","123456"),
("李四","123456"),
("王五","123456")
新建项目
- 新建普通Maven项目:
-
删除src目录(父工程: 方便练习学习,不用多次导包):
-
在父工程的pom.xml中导入依赖:
<dependencies> <!-- Mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.22</version> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <!-- junit 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> </dependency> </dependencies>
注:如果依赖包名报红,点击idea侧边栏上的maven后,点击刷新:
项目搭建完毕
2.2 创建一个子模块
- 在父项目右键新建一个模块(子工程):
这样可以不用每次都导包了
- 再次创建一个普通maven项目:
编写mybatis核心配置文件:
-
在mybatis01/src/main/resources下新建mybatis-config.xml文件
<?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核心配置文件--> <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/mybatis?useSSL=true&useUnicode=ture&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"/> <property name="username" value="root 你的数据库用户名"/> <property name="password" value="你的数据库密码"/> </dataSource> </environment> </environments> <!-- 注意每个mapper.xml都要在此处注册 --> </configuration>
编写mybatis工具类:
- 在mybatis01/src/main/java下创建自己的包路径:
- 工具类:
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//使用mybatis的第一步
//创建sqlSessionFactory对象
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 getSession(){
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
}
2.3 编写代码
实体类
- entity包下 User类:
package com.nych.entity;
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
Dao (或mapper) 接口:
public interface UserDao {
List<User> getUserList();
}
接口实现类: 由以前的类转换为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.nych.dao.UserDao">
<!-- 查询 id对应方法名 resultType = 返回类型 -->
<select id="getUserList" resultType="com.nych.entity.User">
select * from `user`
</select>
</mapper>
- namespace: 对应一个要实现的接口
- id: 对应接口中的方法名
- resultType: 返回结果类型
- 还有一个 parameterType: 参数类型; 会在后面用到
2.4 编写测试类
- 在test下建立和源码同样的文件目录
测试代码
- junit测试
public class UserDaoTest {
@Test
public void test(){
//第一步: 获取SqlSession对象
SqlSession sqlSession = MybatisUtils.getSession();
//方式一: getMapper(推荐使用)
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> userList = userDao.getUserList();
//方式二: (不推荐使用)
List<User> userList2 = sqlSession.selectList("com.nych.dao.UserDao.getUserList");
for (User user : userList) {
System.out.println(user);
}
System.out.println("---------------------------------------------");
for (User user : userList2) {
System.out.println(user);
}
//关闭sqlSession
sqlSession.close();
}
}
错误解析
- org.apache.ibatis.binding.BindingException: Type interface com.nych.dao.UserDao is not known to the MapperRegistry.
- mapper.xml没有在核心配置文件中注册
- 每一个mapper.xml都需要在核心配置文件中注册
<mappers>
<mapper resource="com/nych/dao/UserMapper.xml"/>
</mappers>
-
- Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/nych/dao/UserMapper.xml
- Could not find resource com/nych/dao/UserMapper.xml
-
maven文件导出问题,找不到UserMapper.xml
-
解决: 需要在pom.xml中添加以下代码
<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build>
-
注意:添加代码后需要刷新Maven。
-
Error creating document instance. Cause: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 1 字节的 UTF-8 序列的字节 1 无效。↓
-
需要删除xml文件中的中文注释
-
或 将xml文件的encoding=“UTF-8”改成encoding=“UTF8”
-
测试结果
总结
写Mybatis的步骤:
- 在Maven中添加依赖包
- 编写获取SqlSession对象的工具类
- 工具类中需要mybatis 核心配置文件(mybatis-config.xml)
- 编写User表的实体类User.java
- 编写操作User的接口UserDao/UserMapper(interface)
- 编写实现UserDao/UserMapper的实现 UserDao.xml / UserMapper.xml
- 写测试类测试代码
前三项是只需要写一次,之后就一直在重复后四项