Mybatis入门
1.什么是mybatis?
mybatis是一个基于Java的持久层(也称数据库访问层)框架,它支持定制化 SQL、存储过程以及高级映射。避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。它可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
2.为什么使用mybatis?
- 简单易学,最简单安装只要两个jar文件+配置几个sql映射文件
- 解除sql与程序代码的耦合,sql和代码的分离,提高了可维护性
- 避免了几乎所有的 JDBC 代码,不再需要手动设置参数以及获取结果集
- 可以使用简单的 XML 或注解来配置和映射原生信息
3.如何使用mybatis(重点)?
下文都是以maven项目来学习的
-
使用mybatis,将将下面的依赖代码置于 pom.xml 文件中:
<!-- mybatis依赖 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.9</version> </dependency> <!-- 连接数据库mysql依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> </dependency> <!-- junit单元测试(可忽略,方便测试用的) --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
-
从xml中构建SqlSessionFactory
-
在resources文件夹下创建mybatis核心配置文件mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://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> </configuration>
-
创建一个使用mybatis的工具类,获取SqlSessionFactory对象,减轻代码冗余
public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { //使用mybatis必须的第一步:获取 sqlSessionFactory 对象 try { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } }
-
-
从SqlSessionFactory对象中获取SqlSession
在使用mybatis的工具类中编写一个获取SqlSession的方法getSqlSession(),减轻代码冗余
/** * 从 SqlSessionFactory 中获得 SqlSession 的实例 * SqlSession 提供了在数据库执行 SQL 命令所需的所有方法 * 你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句 */ public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); }
-
探究已映射的SQL语句
-
编写一个mapper(相当于网络编程里面的Dao接口)接口
public interface personMapper { //获取Persion集合 List<Person> getPersonList(); }
-
编写一个personMapper接口的personMapper.xml映射文件(相当于j接口的实现类)
<?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 namespace="com.yg.mapper.personMapper"(为对应的mapper接口路径)> <select id="getPersonList"(为要实现的接口方法) resultType="com.yg.pojo.Person"(为接口方法对应的返回类型)> select * from person(sql语句) </select> </mapper>
-
编写一个测试类,测试已经实现的 getPersonList()方法
public class personMapperTest { @Test public void test01(){ //1.获取 sqlSession 对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //2.获取 Mapper 映射 personMapper mapper = sqlSession.getMapper(personMapper.class); List<Person> personList = mapper.getPersonList(); //3.遍历输出查看结果 for (Person person : personList) { System.out.println(person); } //4.关闭释放资源 sqlSession.close(); } }
-
-
所有新建的文件规范的目录结构(仅供参考)
**!补充说明:**因为要简单展现mybatis的强大不同,嘚借用上数据库增删改查功能,上面的例子当中,前面我省去了数据库部分的知识,所以还嘚建一个简单的数据表、连接数据库、编写一个对应数据的实体类等工作。这方面不懂的可以看一下我以前的JDBC入门学习这篇文章和相关实体类的文章
4.入门学习mybatis常见报错
-
org.apache.ibatis.binding.BindingException: Type interface com.yg.mapper. is not known to the MapperRegistry.
**原因:**没有注册mapper
**解决方案:**在 mybatis-config.xml 配置文件中注册personMapper
<mappers> <mapper resource="com/yg/mapper/personMapper.xml(为mapper的路径)”/> </mappers>
-
org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/yg/mapper/personMapper.xml
原因:不能找到personMapper.xml资源,该.xml文件是写在了java源代码目录下,运行时maven是默认不会从java源代码目录下打包.xml/.properties文件的
解决方案:在pom.xml全局配置文件下配置导出资源配置
<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>
-
java.io.IOException: Could not find resource mybatis-config.xml
原因:不能找到mybatis-config.xml资源,顾名思义就是编译后打包的classes文件夹中找不到这个文件。很有可能的原因就是pom.xml的导出资源配置出了问题,因为在配置pom.xml中的resources标签时只配置了扫描src/main/java,则maven只会扫描src/main/java,不会扫描src/main/resources,即使后者已经被标记为项目的资源目录。
**解决方案:**配置导出资源配置标签时,不能仅仅配置java源代码目录下的,还要配置resources资源目录下的,即使用完整的导出资源配置,如下:
<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>
关于导出资源配置的相关问题,详情可以看一下这篇文章 关于maven打包时, 资源文件没有被打包进来的问题,里面有详细介绍原理