Mybatis-2021/3/12
环境:
- JDK1.8
- MySQL5.7/8.0
- maven3.6.1
- IDEA
回顾:
- JDBC
- Mysql
- Java基础
- Maven
- Junit
框架:配置文件的。最好的方式:看官网文档;
1.简介
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QcxHU3Cr-1617191678664)(C:\Users\小雄\AppData\Roaming\Typora\typora-user-images\image-20210312094030319.png)]
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>
-
GitHub:https://github.com/mybatis/mybatis-3/releases/tag/mybatis-3.5.6
1.2 持久化
数据持久化
- 持久化就是将程序的数据在持久状态转化的过程
- 内存:断电即失
- 数据库(jdbc),io文件持久化
- 生活:冷藏、罐头
为什么需要持久化?
- 有一些对象,不能让他丢掉
- 内存太贵了
1.3 持久层
DAO层、Service层、Controller层…
- 完成持久化工作的代码块
- 层界限十分明显
1.4 为什么需要Mybatis?
-
帮助程序猿将数据存入到数据库中
-
方便
-
传统的JDBC代码太复杂了。简化。框架。自动化。
-
不用Mybatis也可以,更容易上手。技术没有高低之分
-
优点:
1.简单易学
2.灵活
3.解除sql与程序代码的耦合,sql和代码的分离,提高了可维护性。
4.提供映射标签,支持对象与数据库的orm字段关系映射
5.提供对象关系映射标签,支持对象关系组建维护
6.提供xml标签,支持编写动态sql。
最重要的一點:使用的人多!!!
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,'狂神','123456'),
(2,'硅谷','123457'),
(3,'动力','123458')
新建项目
-
新建一个普通的maven项目
-
删除src目录
-
导入maven依赖
<!--父工程--> <groupId>com.gdut</groupId> <artifactId>mybatis_01</artifactId> <version>1.0</version> <!-- 导入依赖 --> <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的核心配置文件
<?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?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="password"/> </dataSource> </environment> </environments> </configuration>
-
编写Mybatis工具类
//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 SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}
### 2.3 编写代码
1. 实体类
```java
//实体类
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接口
public interface UserMapper { List<User> getUserList(); }
-
接口实现类由原来的UserDaoImpl类转换为一个Mapper配置文件
<mapper namespace="mapper.UserMapper"> <select id="getUserList" resultType="pojo.User"> select * from mybatis.user; </select> </mapper>
2.4 测试
org.apache.ibatis.binding.BindingException: Type interface mapper.UserMapper is not known to the MapperRegistry.
MapperRegistry是什么?
核心配置文件中注册mappers
-
Junit测试
public class UserMapperTest { @Test public void test() { //第一步:获取sqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //方式一:getMapper UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.getUserList(); //方式二: // List<User> userList = sqlSession.selectList("mapper.UserMapper.getUserList"); for (User user : userList) { System.out.println(user); } //关闭sqlSession sqlSession.close(); } }
你们可能会遇到的问题:
- 配置文件没有注册
<!-- 每一个Mapper.xml都需要在Mybatis核心配置文件中配置 路径需要用斜杠/ --> <mappers> <mapper resource="mapper/UserMapper.xml"/> </mappers>
- 绑定接口错误
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SBLygqRl-1617191678667)(Mybatis-2021312.assets/image-20210314230421303.png)]
- 方法名不对
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2zEjVPEX-1617191678668)(Mybatis-2021312.assets/image-20210314230449073.png)]
- 返回类型不对
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q5UytAaw-1617191678670)(Mybatis-2021312.assets/image-20210314230654053.png)]
- Maven导出资源问题
<!--在build配置文件中配置resources,来放置我们资源导出失败问题--> <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build>
3. CRUD(增删改查)
1. namespace
namespace中的包名要和DAO/Mapper接口的包名一致
2. select
-
id: 就是对应的namespace中的方法名
-
resultType:sql语句执行的返回值
-
parameterType:参数类型
-
编写接口
public interface UserMapper { //查询全部用户 List<User> getUserList(); //根据ID查询用户 User getUserById(int id); //插入一个用户 int addUser(User user); //修改用户 int updateUser(User user); //删除用户 int deleteUser(int id); }
-
编写对应的mapper中的sql语句
<select id="getUserList" resultType="pojo.User"> select * from mybatis.user; </select>
-
测试
@Test public void testGetUserList(
-