Mybatis
参考视频:B站狂神,写这个只是方便个人复习,怎么写是我自己的事,我能看懂就行,没要求非要让你看!白嫖还挑刺,是很没有风度的事情。希望做个有风度的“五好青年”!
环境:
- JDK 1.8
- Mysql 5.7
- maven 3.6.3
- IDEA 2020.1
回顾:
- JDBC:https://blog.csdn.net/m0_46153949/article/details/107231974
- Mysql:https://blog.csdn.net/m0_46153949/article/details/107116168
- Java基础:https://blog.csdn.net/m0_46153949/article/details/106167213
- Maven:https://blog.csdn.net/m0_46153949/article/details/109265177
- Junit:https://blog.csdn.net/qq_40794973/article/details/89032870
SSM框架:配置文件的。 最好的方式:看官网文档;
1、简介
1.1、什么是Mybatis
- MyBatis 是一款优秀的持久层框架
- 它支持定制化 SQL、存储过程以及高级映射。
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
- MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
- MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
- 2013年11月迁移到Github。
如何获得Mybatis?
-
maven仓库:
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency>
- 中文文档:https://mybatis.org/mybatis-3/zh/index.html
- 免费下载地址:https://www.yuque.com/nizhegechouloudetuboshu/library/zsd0mk
1.2、持久化
数据持久化:
- 持久化就是将程序的数据在持久状态和瞬时状态转化的过程。
- 内存:断电即失。
- 数据库(Jdbc),io文件持久化。
- 联系于生活:冷藏、罐头。
为什么需要需要持久化?
-
有一些硬盘里的对象,不能让他丢掉!!!
-
内存太贵了。
1.3、持久层
Dao层,Service层,Controller层….
- 完成持久化工作的代码块
- 层界限十分明显。
1.4 为什么需要Mybatis?
- 帮助程序猿将数据存入到数据库中。
- 方便
- 传统的JDBC代码太复杂了。简化。框架。自动化。
- 不用Mybatis也可以,更容易上手。
- 优点:
- 简单易学。
- 灵活。
- sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射。
- 提供对象关系映射标签,支持对象关系组建维护。
- 提供xml标签,支持编写动态sql。
最重要的一点:使用的人多!
Mybatis学完后,学Spring —> SpringMVC —> SpringBoot
2、第一个Mybatis程序
- 思路:搭建环境–>导入Mybatis–>编写代码–>测试!
2.1、搭建环境
搭建数据库
CREATE DATABASE mybatis;
USE mybatis;
CREATE TABLE USER ( 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 ( id, NAME, pwd )
VALUES
( 1, 'subei', '123456' ),
( 2, '哇哈哈', '952741' ),
( 3, '欣杰克', '854362' );
新建项目
- 新建一个普通的maven项目
- 删除src目录
-
导入maven依赖
<!-- 导入依赖 --> <dependencies> <!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!--mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <!--junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
2.2、创建一个模块
Mybatis 3.5.4 中文官方文档:https://www.yuque.com/nizhegechouloudetuboshu/library/zsd0mk
- 编写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核心配置文件-->
<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?characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 每一个Mapper.xml都需要在mybatis核心配置文件中注册! -->
<mappers>
<mapper resource="com/github/subei/dao/UserMapper.xml"/>
</mappers>
</configuration>
- 编写mybatis工具类
package com.github.subei.utils;
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;
// sqlSessionFactory ---> SqlSession
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 getSqlSession(){
return sqlSessionFactory.openSession();
}
}
2.3、编写代码
-
实体类
package com.github.subei.pojo; // 实体类 public class User { private int id; private String name; private String 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; } public User() { } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; } }
-
Dao接口
package com.github.subei.dao; import com.github.subei.pojo.User; import java.util.List; public interface UserDao { List<User> getUserList(); }
-
接口实现类由原来的UserDaoImpl转变为一个 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.github.subei.dao.UserDao"> <!--select查询语句--> <select id="getUserList" resultType="com.github.subei.pojo.User"> select * from mybatis.user; </select> </mapper>
2.4、测试
-
junit测试
package com.github.subei.dao; import com.github.subei.pojo.User; import com.github.subei.utils.MybatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; public class UserDaoTest { @Test public void test(){ //第一步:获得SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //方式一:getMapper UserDao userDao = sqlSession.getMapper(UserDao.class); List<User> userList = userDao.getUserList(); //方式二:不推荐使用!!! // List<User> userList = sqlSession.selectList("com.github.dao.UserDao.getUserList"); for (User user : userList) { System.out.println(user); } //关闭SqlSession sqlSession.close(); } }
可以能会遇到的问题:
- 配置文件没有注册
- 绑定接口错误。
- 方法名不对
- 返回类型不对
- Maven导出资源问题
day01学习中遇到的报错
报错:error:java :程序包org.apache.ibatis.io不存在。:程序包org.apache.ibatis.session不存在
- IDEA 2020.1版本报错,解决方法: 出现这个问题根本办法是修改一下maven home directory为Bundled (Maven 3),并修改为默认给的路径,不要用自己的maven本地仓库的路径,用idea 2020 内置的maven ,至于具体原因,可能是IDEA2020的新功能吧,但能解决!!!
- 第一步,修改maven地址:
- 第二步,重装仓库文件:
- 第三步,运行程序:
如果还不行,参考这个解决:https://blog.csdn.net/bin_bujiangjiu/article/details/106727561
报错:org.apache.ibatis.binding.BindingException: Type interface com.github.subei.dao.UserDao is not known to the MapperRegistry.
- 解决方法:在mybatis-config.xm文件中添加如下代码:
<!-- 每一个Mapper.xml都需要在mybatis核心配置文件中注册! -->
<mappers>
<mapper resource="com/github/subei/dao/UserMapper.xml"/>
</mappers>
MapperRegistry是什么?
- 核心配置文件中注册 mappers
报错:java.lang.ExceptionInInitializerError at com.kuang.dao.UserDaoTest.test(UserDaoTest.java:15)
- 这个错在IDEA2020.1的版本中没有出现,所以,这里只做记录,具体解决方法:在所有的pom.xml文件中,添加如下代码:
<!--在build中配置resources,来防止我们资源导出失败的问题-->
<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>
参考博文①:https://blog.csdn.net/bin_bujiangjiu/article/details/106784700
参考博客②:https://blog.csdn.net/bin_bujiangjiu/article/details/106727561
感谢大佬的博客帮我解决问题,节省时间!!!