MyBatis
环境:
- JDK 1.8
- MySQL 5.7
- Maven 3.6.1
- IDEA
回顾:
- JDBC
- MySQL
- Java基础
- Maven
- Junit
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](https://baike.baidu.com/item/google code/2346604),并且改名为MyBatis 。
- 2013年11月迁移到Github。
如何获得MyBatis?
-
Maven仓库:
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency>
-
Github:https://github.com/mybatis/mybatis-3/releases
-
中文文档:https://mybatis.org/mybatis-3/zh/index.html
1.2、持久化
数据持久化
- 持久化就是将程序的数据在持久状态和瞬时状态转化的过程
- 内存:断电即失
- 数据库(JDBC),IO文件持久化
- 生活:冷藏,罐头
为什么需要持久化
- 有一些对象,不能让他丢掉
- 内存太贵了
1.3、持久层
Dao层,Service层,Controller层…
- 完成持久化工作的代码块
- 层界限十分明显
1.4、为什么需要MyBatis?
-
帮助程序猿将数据存入到数据库中。
-
方便
-
传统的JDBC代码太复杂了。简化。框架。自动化。
-
不用MyBatis也可以。更容易上手。技术没有高低之分
-
优点:
- 简单易学
- 灵活
- sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射。
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql。
最重要的一点:使用的人多!
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,'工一','123456'),
(2,'木子','123456'),
(3,'工一木子','123456');
新建项目
1.新建一个普通的maven项目
2.删除src目录
3.导入maven依赖
<!-- 导入依赖-->
<dependencies>
<!-- mysql驱动-->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.24</version>
</dependency>
<!--mybatis-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--junit-->
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
2.2、创建一个模块
-
编写mybatis的核心配置文件:mybatis-config.xml【mybatis系列的配置文件,隨便拷贝一个,改下头部的configuration Config config为相应的约束就可以用了】
<?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="123456"/> </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 = null; 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、编写代码
-
实体类
//实体类 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 UserDao { List<User> getUserList(); }
-
接口实现类由原来的UserDaoImpl转换为一个Mapper配置文件:UserMapper.xml【idea如果连接了数据库,写sql时有提示】
<?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.gy.dao.UserDao"> <!--select查询语句--> <select id="getUserList" resultType="com.gy.pojo.User"> select * from mybatis.user </select> </mapper>
2.4、测试
注意点:
1)org.apache.ibatis.binding.BindingException: Type interface com.gy.dao.UserDao is not known to the MapperRegistry.
MapperRegistry是什么?
核心配置文件中注册mappers【在mybatis-config.xml中添加如下内容】
<mappers>
<mapper resource="com/gy/dao/UserMapper.xml" />
</mappers>
2)org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/gy/dao/UserMapper.xml
发现target目录下的dao目录下无xml文件,在pom中配置就可以了
3) org.apache.ibatis.builder.BuilderException: Mapper’s namespace cannot be empty
mapper文件中加入:namespace="com.gy.dao.UserDao"即可,这样可以看到sql和dao层关联在一起了
4)Loading class com.mysql.jdbc.Driver'. This is deprecated. The new driver class is
com.mysql.cj.jdbc.Driver’. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
在mybatis-config.xml中把
属性driver的值由com.mysql.jdbc.Driver
变为:com.mysql.cj.jdbc.Driver即可
-
junit测试
@Test public void getUserList() { //第一步:获得SQLSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //方式一:getMapper UserDao userDao = sqlSession.getMapper(UserDao.class); List<User> userList = userDao.getUserList(); for (User user : userList) { System.out.println(user); } //关闭SQLSession sqlSession.close(); }
改进版:
@Test public void getUserList1() { //第一步:获得SQLSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); try { //方式一:getMapper UserDao userDao = sqlSession.getMapper(UserDao.class); List<User> userList = userDao.getUserList(); //方式二: //List<User> userList = sqlSession.selectList("com.gy.dao.UserDao.getUserList"); for (User user : userList) { System.out.println(user); } } catch (Exception e) { e.printStackTrace(); } finally { //关闭SQLSession sqlSession.close(); } }
你们可能会遇到的问题:
1.配置文件没有注册
2.绑定接口错误
3.方法名不对
4.返回类型不对
5.Maven导出资源问题
解决: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>
:
3.彩蛋
1)代码地址:
https://gitee.com/zengqiang_wang/mybatis-gongyi
2)将本地代码与远程仓库关联
C:\Users\Administrator\Desktop\学习笔记\mybatis\mybatis-study>git status
fatal: not a git repository (or any of the parent directories): .git
C:\Users\Administrator\Desktop\学习笔记\mybatis\mybatis-study>git remote add origin git@gitee.com:zengqiang_wang/mybatis-gongyi.git
fatal: not a git repository (or any of the parent directories): .git
C:\Users\Administrator\Desktop\学习笔记\mybatis\mybatis-study>git init
Initialized empty Git repository in C:/Users/Administrator/Desktop/学习笔记/mybatis/mybatis-study/.git/
C:\Users\Administrator\Desktop\学习笔记\mybatis\mybatis-study>git remote add origin git@gitee.com:zengqiang_wang/mybatis-gongyi.git
C:\Users\Administrator\Desktop\学习笔记\mybatis\mybatis-study>git push --set-upstream origin master
error: src refspec master does not match any
error: failed to push some refs to 'git@gitee.com:zengqiang_wang/mybatis-gongyi.git'
C:\Users\Administrator\Desktop\学习笔记\mybatis\mybatis-study>git pull origin master
git@gitee.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
C:\Users\Administrator\Desktop\学习笔记\mybatis\mybatis-study>git pull origin master
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), done.
From gitee.com:zengqiang_wang/mybatis-gongyi
* branch master -> FETCH_HEAD
* [new branch] master -> origin/master
C:\Users\Administrator\Desktop\学习笔记\mybatis\mybatis-study>git push --set-upstream origin master
Everything up-to-date
Branch 'master' set up to track remote branch 'master' from 'origin'.
C:\Users\Administrator\Desktop\学习笔记\mybatis\mybatis-study>
问题解决:
1.拉取代码无权限
and the repository exists.
C:\Users\Administrator\Desktop\学习笔记\mybatis\mybatis-study>git pull origin master
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
解决:
把本地的公钥复制到gitee