MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。
MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
MyBatis 可以通过简单的 XML 或注解来
配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
https://mybatis.org/mybatis-3/zh/index.html
MySQL 5.0 +
JDK 1.8 +
IDEA 2018 +
Maven 3.0 +
总而言之:越新越好
用IDEA创建一个使用Maven构建的Mybatis学习工程
填好工程名称
为了解释多个要点,我们把主工程的目录删除,建立多模块结构
右键工程,新建
填写模块名称
新建的项目不会自动分配约定目录,这里我们需要手动设置
打开ProjectStructure
蓝色表示我们的源码目录
绿色表示我们的测试目录
带有黄色堆叠块的目录表示是资源存放目录
根据第一次新建工程的目录结构来看
我们只需要把java目录 和 test的Java目录更改即可
点选目录 再点选所要约定的目录种类即可
这是另一种实现的方式
因为我们使用的是父子多模块模式
依赖直接导入在父Pom下即可
(Mybatis)pom.xml
<dependencies> <!-- Mybatis 组件 --> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.4</version> </dependency> <!-- JDBC 驱动--> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.20</version> </dependency> <!-- lombok --> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency> <!-- Junit 单元测试 --> <!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency> </dependencies>
From SQLyog
或者SQL指令
DROP DATABASE IF EXISTS myabtis; CREATE DATABASE IF NOT EXISTS mybatis;
创建user表
或者SQL指令
CREATE TABLE user( id int(20) primary key, name varchar(30) default null, password varchar default null )engine=innodb default charset=utf8;
插入数据
INSERT INTO user(`user_id`,`user_name`,`user_password`) values (1,"张三","123456"), (2,"李四","234567"), (3,"王五","345678"), (4,"钱六","456789");
配置信息获取位置:https://mybatis.org/mybatis-3/zh/getting-started.html
XML 配置文件中包含了对 MyBatis 系统的核心设置,
包括获取数据库连接实例的数据源(DataSource)
以及决定事务作用域和控制方式的事务管理器(TransactionManager)。
后面会再探讨 XML 配置文件的详细内容,这里先给出一个简单的示例:
src\main\resources\mybatis-config.xml
<?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> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="org/mybatis/example/BlogMapper.xml"/> </mappers> </configuration>
当然,还有很多可以在 XML 文件中配置的选项,上面的示例仅罗列了最关键的部分。
注意 XML 头部的声明,它用来验证 XML 文档的正确性。
environment 元素体中包含了事务管理和连接池的配置。
mappers 元素则包含了一组映射器(mapper),
这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。
对配置信息的注释解释:
<?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> <!-- Mybatis多环境配置 default="development"表示默认使用的1个环境 --> <environments default="development"> <!-- default 环境 --> <environment id="development"> <!-- 事务管理 默认使用JDBC --> <transactionManager type="JDBC"/> <!-- 数据源 ,也就是我们所学的连接池技术 --> <dataSource type="POOLED"> <!-- 不用我说是了把,老4样了 --> <!-- 这是jdbc8.0+ 的版本驱动,老版本5.0+ 是com.mysql.jdbc.Driver --> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <!-- 本机连接可以不用写 localhost:3306 --> <!-- 8.0+的驱动访问数据库必须声明时区参数 ,5.0+不需要 直接就是 jdbc:mysql:///mybatis --> <!-- 时区还可以设置为 --> <!-- jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&useSSL=true&serverTimezone=GMT&useUnicode=true --> <property name="url" value="jdbc:mysql:///mybatis?serverTimezone=GMT"/> <!-- 用户&密码 --> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> <!-- 我们复制粘贴,可以使用第二套环境 --> <environment id="development2"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!-- 我们需要绑定的Dao,按Mybatis的话来说,就是Mapper映射器 --> <mappers> <mapper resource="org/mybatis/example/BlogMapper.xml"/> </mappers> </configuration>
我们可以使用IDEA先连接数据库
数据库的使用
https://www.cnblogs.com/mindzone/p/12718287.html
确认可用之后,开始编写MybatisUtil工具类
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。
SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。
而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
从 XML 文件中构建 SqlSessionFactory 的实例非常简单,
建议使用类路径下的资源文件进行配置。
但也可以使用任意的输入流(InputStream)实例,
比如用文件路径字符串或 file:// URL 构造的输入流。
MyBatis 包含一个名叫 Resources 的工具类,
它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。
String resource = "org/mybatis/example/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
src\main\java\cn\dai\util\MybatisUtil.java
public class MybatisUtil { private static org.apache.ibatis.session.SqlSessionFactory sqlSessionFactory; static { try{ // 核心配置文件名称 String config = "mybatis-config.xml"; // 读取核心配置 加载进内存为读取流对象 java.io.InputStream inputStream = org.apache.ibatis.io.Resources.getResourceAsStream(config); // 通过工场建造者获取了配置流对象,读取配置信息后,生成会话工厂实例 sqlSessionFactory = new org.apache.ibatis.session.SqlSessionFactoryBuilder().build(inputStream); } catch (Exception exception){ exception.printStackTrace(); } } // 获取会话实例即可 public static org.apache.ibatis.session.SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }
编写对应的实体类,用lombok省略相关方法
src\main\java\cn\dai\pojo\User.java
package cn.dai.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * @author ArkD42 * @file Mybatis * @create 2020 - 05 - 03 - 15:58 */ @Data @NoArgsConstructor @AllArgsConstructor public class User { // 最好和数据表的字段同名 private Integer user_id; private String user_name; private String user_password; }
声明我们的DAO接口,应该说映射接口
只写一个方法即可
src\main\java\cn\dai\mapper\UserMapper.java
package cn.dai.mapper; import cn.dai.pojo.User; import java.util.List; /** * @author ArkD42 * @file Mybatis * @create 2020 - 05 - 03 - 16:00 */ public interface UserMapper { List<User> getUserList(); }
从最经典的XML配置开始,这里我们不再写实现类了,
而是写Mapper接口的配置文件
src\main\java\cn\dai\mapper\UserMapper.xml
<?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"> <!-- 映射的Mapper接口名称--> <mapper namespace="cn.dai.mapper.UserMapper"> <!-- 我们的SQL语句使用这种标签来实现 --> <!-- id 是我们的Mapper接口中的 方法名称 --> <!-- resultType 表示查询的结果类型,因为是List 这里我们直接填写泛型的元素类型就好了 --> <select id="getUserList" resultType="cn.dai.pojo.User"> /* 这里填写我们的SQL语句 */ SELECT * FROM `user`; </select> </mapper>
回到mybatis-conifg.xml 核心配置文件,注册我们的映射器文件
<!-- 所有的映射器都需要被注册到!!!--> <!-- 我们需要绑定的Dao,按Mybatis的话来说,就是Mapper映射器 --> <mappers> <mapper resource="cn/dai/mapper/UserMapper.xml"/> </mappers>
测试类
src\test\java\Quickstart.java
import cn.dai.mapper.UserMapper; import cn.dai.pojo.User; import cn.dai.util.MybatisUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; /** * @author ArkD42 * @file Mybatis * @create 2020 - 05 - 03 - 16:10 */ public class Quickstart { @Test public void quickstartMybatis(){ // 获取会话对象 SqlSession sqlSession = MybatisUtil.getSqlSession(); // 获得映射实现实例 UserMapper mapper = sqlSession.getMapper(UserMapper.class); // 调用接口方法 List<User> userList = mapper.getUserList(); for (User user : userList) { System.out.println(user); } // 释放资源 sqlSession.close(); } }
结果:
1、Maven依赖问题
这个可能是IDEA版本问题,建议直接下载最新IDEA版本使用
2017、2018、都可能会出现,然后是Maven版本不一样的问题,建议最新
2、核心配置文件的问题
如果在配置中不小心写错了标签,尽管IDEA会自动提示,
但是你刚刚上手,根本不会注意这个问题,异常提示会给出准确的错误行,只要修改即可
3、映射器未注册异常
配置完接口的Mapper就开始跑了,你在想屁吃?
4、资源过滤问题
这个问题在IDEA2019.3版本出现过,原因有很多问题
1 工程内的文件的编码不统一设置UTF8
2 Maven旧版本不过滤配置资源,导致读不了文件
3 Mapper接口配置注释了中文,导致初始化失败,这个问题跟1有关
在父pom.xml中设置此配置即可
如果,UserMapper.xml不能注释中文的话,
两个过滤标签都改成false或者true,我也想不起来了。。。
<!--在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://www.cnblogs.com/mindzone/p/12822111.html