mybatis学习
-
环境
- JDK1.8
- Mysql5.7
- maven 3.6.1
- IDEA
-
回顾:
- JDBC
- Mysql
- Java基础
- Maven
- Junit
-
SSM框架:配置文件的。最好的方式:看文档官网;
1.简介
1.1 什么是mybatis
-
MyBatis 是一款优秀的持久层框架
-
什么叫持久层框架
- 什么是持久层?
- 持久是相对于瞬时来说的,*** 持久层,可以理解成数据 保存在 数据库或者 硬盘一类可以保存很长时间的设备里面,不像放在内存中那样断电就消失了,也就是把数据存在持久化设备上*** ,你想一下 内存中的数据 断电就没有了,硬盘的数据 是否会像内存中的数据一样断电消失么?
- 什么是持久层?
-
为什么要使用持久化框架?
- 企业应用中*** 数据很重要(各种订单数据、客户数据、库存数据之类的),比应用程序本身更重要,** 所以需要把数据持久化。持久化可以通过很多方式,写文件和数据库都可以。只是现在企业一般都会选择把数据持久化到数据库中,因为可以很方便的查询统计分析,但数据库的数据最终还是会写到磁盘上的。Java 程序员为了操作数据库, 最开始是使用JDBC* 来进行的,但是这种方式*** 开发效率低** ,要写一堆重复代码,加上关系数据库和对象本身存在所谓的阻抗不匹配情况,所以 为了提高开发效率,有人发明了 ORM 即 对象关系映射框架* (Hibernate是其中的佼佼者),对于 Java 程序员来说,就可以通过操纵对象来操纵数据库了
-
-
它支持自定义 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。
-
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)
-
如何获得Mybatis?
-
maven仓库:Maven Repository: org.mybatis ? mybatis ? 3.5.2 (mvnrepository.com)
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency>
-
1.2、持久层
数据持久化
- 持久化就是将程序的数据再持久状态和瞬时状态转化的过程
- 内存:断电即失
- 数据库(jdbc),io文件持久化。
- 生活:冷藏,罐头
为什么需要持久化
- 有一些对象,不能让他丢掉
- 内存太贵了
1.3、持久层
Dao层,Service层,Controller层...
- 完成持久化工作的代码块
- 层界限十分明显。
https://www.bilibili.com/video/BV1NE411Q7Nx
1.4为什么需要Mybatis?
- 帮助程序员将数据存入到数据库中。
- 方便
- 传统的JDBC代码太复杂了。简化。框架。自动化。
- 不用Mybatis也可以。更容易上手。技术没有高低之分
- 优点:
- 简单易学
- 灵活
- sql和代码的分离,提高了可维护性
- 提供隐射标签,支持对象关系组建和维护
- 提供xml标签,支持编写动态sql
最重要的一点:使用的人多!
Spring SpringMVC SpringBoot
2.第一个MyBatis程序 2021.7.18
- 思路:搭建环境--->导入MyBatis-->编写代码-->测试!
2.1、搭建环境 2021.7.19
-
搭建数据库
CREATE DATABASE `mybatis`; USE `mybatis`; CREATE TABLE `user`( `id` INT(20) 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,‘lxw‘,‘123456‘), (2,‘tom‘,‘123456‘), (3,‘lee‘,‘123456‘)
-
新建项目
新建一个普通的maven项目
-
删除src目录,把项目当父工程
-
导入依赖
<!--导入依赖--> <dependencies> <!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</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> <scope>test</scope> </dependency> </dependencies>
2.2、创建一个模块 2021.7.19
-
编写mybatis核心配置文件:mybatis-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环境,可以多个--> <environments default="development"> <environment id="development"> <!--transactionManager事务管理--> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <!--允许安全链接useSSL=true useSSL=false MySQL在高版本需要指明是否进行SSL连接 1.true 需要连接 2.false 不需要连接 在xml配置文件中配置数据库URL时,要使用&的转义字符也就是& 让他们使用Unicode编码,useUnicode=true --> <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="root"/> </dataSource> </environment> </environments> </configuration>
-
编写mybatis工具类
package com.lxw.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.InputStream; //SqlSessionFactory-->生产sqlSession public class MybatisUtils { //定义全局变量,提升作用域 private static SqlSessionFactory sqlSessionFactory; static { String resource = null; try { //使用mybatis第一步,使用Mybatis获取sqlSessionFactory对象 resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (Exception e) { e.printStackTrace(); } } //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例了。 // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL public static SqlSession getSqlSession(){ //优化SqlSession sqlSession = sqlSessionFactory.openSession(); //return sqlSession return sqlSessionFactory.openSession(); } }
2.3、编写代码
-
实体类
package com.lxw.pojo; //实体类 public class User { //private 私有的 private int id; private String name; private String pwd; //无参构造 alt+insert Constructor->Constructor public User() { } //有参构造 alt+insert Constructor->全选 public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } //get\set alt+insert 选Getter和Setter然后全选 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; } //toString:异常打印信息alt+insert 选toString 然后全选 @Override public String toString() { return "User{" + "id=" + id + ", name=‘" + name + ‘\‘‘ + ", pwd=‘" + pwd + ‘\‘‘ + ‘}‘; } }
-
Dao接口
package com.lxw.dao; import com.lxw.pojo.User; import java.util.List; public interface UserDao { //Lsit<>这是泛型 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.lxw.dao.UserDao"> <!--select查询语句 返回结果 resultType类型,返回一个,一般都使用type resultMap集合,返回多个 --> <select id="getUserList" resultType="com.lxw.pojo.User"> select * from mybatis.user </select> </mapper>
2.4、测试
-
新建一个测试:
- 包的名字要与上面的包一一对应
-
注意点:
-
org.apache.ibatis.binding.BindingException: Type interface com.lxw.dao.UserDao is not known to the MapperRegistry.
-
MapperRegistry是什么?
-
org.apache.ibatis.exceptions.PersistenceException:
Error building SqlSession.
The error may exist in com/lxw/dao/UserMapper.xml
在target/calsses/com/lxw/dao/里面找不到UserMapper.xml,它不会自动生成
-
在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>
-
关于Cause: java.sql.SQLException: The server time zone value 的解决办法
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC"/> <!--解决办法:在jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC 加上UTC,让数据库时区和本地时区一样就可以。--> //解决方法:https://blog.csdn.net/qq_24880589/article/details/81735535
加上UTC,让数据库时区和本地时区一样就可以。
-
- Loading class
com.mysql.jdbc.Driver
. This is deprecated警告处理,jdbc更新处
```xml
处理:提示信息表明数据库驱动com.mysql.jdbc.Driver‘已经被弃用了、应当使用新的驱动com.mysql.cj.jdbc.Driver‘
所以,按照提示更改jdbc.properties配置 .com.mysql.jdbc.Driver 改为 com.mysql.cj.jdbc.Driver
原文链接:https://blog.csdn.net/weixin_42323802/article/details/82500458
把src/main/resources/mybatis-config.xml里<property name="driver" value="com.mysql.jdbc.Driver"/>
改成<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
//解决方法:https://blog.csdn.net/weixin_42323802/article/details/82500458
```
![image-20210719215042065](C:\Users\y3060\AppData\Roaming\Typora\typora-user-images\image-20210719215042065.png)
-
Error building SqlSession. ### Cause: org.apache.ibatis.builder.BuilderException(学习MyBatis遇见错误)
Error building SqlSession. ### Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 1 字节的 UTF-8 序列的字节 1 无效。
-
由于我的项目是Maven构建的,所以在项目依赖配置文件pom.xml上加入构建项目编码属性:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
-
-
junit测试