环境:
-
JDK1.8
-
Mysql 5.7
-
maven 3.6.1
-
IDEA
回顾:
-
JDBC
-
Mysql
-
Java基础
-
Maven
-
Junit:单元测试
1. 简介
1.1 什么是Mybatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
框架:配置文件最好直接看官网
MyBatis官方文档:https://mybatis.org/mybatis-3/zh/index.html
GitHub主页:https://github.com/mybatis/mybatis-3
Maven地址:https://mvnrepository.com/artifact/org.mybatis/mybatis
1 | <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> |
1.2 持久化
数据持久化
- 持久化就是将程序的数据在持久状态和顺势状态转化的过程
- 内存:断电即失
- 数据库(JDBC),文件IO持久化
为什么需要持久化
- 有一些对象,不能让他丢掉
- 内存价格昂贵
1.3 持久层
Dao层(data access object):数据访问层、Service层、Controller层...
- 完成持久化工作的代码块
- 界限十分明显
1.4 为什么需要Mybatis
-
帮助程序员将数据存入数据库
-
传统的JDBC代码太复杂。方便、简化框架、自动化
-
不用Mybatis也可以,但是Mybatis更容易上手。技术没有高低之分
-
优点:
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
- 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql
最重要的一点:使用的人多
2. 第一个Mybatis程序
思路:搭建环境-》导入Mybatis包-》编写代码-》测试
2.1 搭建环境
创建数据库环境
1 | create database mybatis; |
新建一个普通的maven项目
- 新建一个普通maven项目(父工程)
- 创建一个子模块
添加依赖:
1 | <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> |
2.2 创建模块
- 在main/java/resources/下创建Mybatis配置文件
1 | 完整的JdbcUrl: |
[mybatis-config.xml]
1 |
|
- 编写Mybatisg工具类
1 | public class Mybatis { |
2.3 编写代码
-
实体类
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
40package com.ahulearn.pojo;
//实体类
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 String getName() {
return name;
}
public String getPwd() {
return pwd;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
} -
Dao接口
1
2
3public interface UserDao {
List<User> getUsers();
} -
接口实现类:由原来的UserDaoImpl转变为一个Mapper.xml配置文件
1 |
|
2.4 测试
在test目录下创建和待测试文件一样的目录结构进行测试,test/java/com.ahulearn/dao
- 测试代码
1 | package com.ahulearn.dao; |
java.lang.ExceptionInInitializerError
at com.ahulearn.dao.UserDaoTest.test(UserDaoTest.java:14)
Mapper.xml文件没用添加到mybatis主配置文件中,或者没有当作资源文件发布。
java.lang.NullPointerException
全局变量问题:
1 | private static SqlSessionFactory sqlSessionFactory; |
错误
1 | org.apache.ibatis.exceptions.PersistenceException: |
没有添加MySQL依赖,工厂返回NULL
3. CRUD
1. namespace
namespace中的包名要和Dao/Mapper中的接口的包名相同,绑定接口
2. select
选择,查询语句:
- id:namespace对应的接口中的方法名
- resultType:Sql语句执行的返回值! 该返回值类型在定义时要和表结构一致,即类属性要和表头一一对应。
- parameterType: 参数类型
只需要改接口,接口映射、测试类
代码
1 | <mapper namespace="com.ahulearn.mapper.UserMapper"> |