一、Mybatis概述
mybatis是一个优秀的基于 java 的持久层框架,它内部封装了jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。 mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql 的动态参数进行映射生成最终执行的sql语句,最后由 mybatis 框架执行sql并将结果映射为 java 对象并返回。 采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbc api底层访问细节,使我们不用与jdbc api打交道,就可以完成对数据库的持久化操作。 什么是orm思想? 1、hibernate使用orm思想对数据库进行crud操作 2、在web阶段学习javabean更正确的叫法是:实体类 3、orm: object relational mapping 对象关系映射 * O:面向对象领域的Object(JavaBean对象) * R:关系数据库领域的Relational(表的结构) * M:映射Mapping(XML的配置文件) (1)让实体类和数据库表进行一一对应关系 先让实体类和数据库表对应 再让实体类属性和表里面字段对应 (2)不需要直接操作数据库表,直接操作 表对应的实体类对象 什么是ORM(对象关系映射) 4、达到的效果,直接创建实体类对象,即在数据库中创建了一个与之对应的表 mybatis的特点: (1) 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用通过文档和源代码,可以比较完全的掌握它的设计思路和实现。 (2) 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。 (3) 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。 (4)提供映射标签,支持对象与数据库的orm字段关系映射 (5) 提供对象关系映射标签,支持对象关系组建维护 (6) 提供xml标签,支持编写动态sql。 (7) 支持数据缓存和注解开发。 mybatis的官方网址: https://www.mybatis.org/
二、Mybatis环境搭建
(一). 导入依赖
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> <scope>runtime</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies>
(二)搭建项目环境
1. 编写User实体类
2. 编写持久层User接口
public interface UserDao { /** * 查询所有User对象 * @return 返回List集合 */ public List<User> queryAllUsers(); }
3. 编写持久层User接口映射文件UserDao.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 namespace="cn.mojie.dao.UserDao"> <!--配置查询的sql语句--> <select id="queryAllUsers" resultType="cn.mojie.entity.User"> select * from user </select> </mapper>
4. 编写mybatis主配置文件SqlMapConfig.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> <!-- 配置 mybatis的环境 --> <environments default="development"> <!-- 配置环境 --> <environment id="development"> <!-- 配置事务的类型 --> <transactionManager type="JDBC"></transactionManager> <!-- 配置连接数据库的信息:用的是数据源【连接池】--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis001"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- 注册UserDao接品映射文件位置 --> <mappers> <mapper resource="cn/mojie/dao/UserDao.xml"/> </mappers> </configuration>
三、Mybatist入门案例
(一)入门案例编写
1.编写工具类读取配置文件
利用Mybatis对数据库进行操作时,都需要产生Mybatis总配置文件的输入流对象、构建SqlSessionFactoryBuilder对象、调用build方法进产生SqlSessionFactory工厂对象、调用工厂类openSession()方法创建SqlSession对象,代码冗余量大,步聚颇有繁琐,所以我们对产生SqlSession对象利用工具类进行优化。
package cn.mojie; 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; public class MyBatisUtils { //定义静态变量sqlSessionFactory private static SqlSessionFactory sqlSessionFactory; //创建静态块,当MyBatisUtils类被加载时,自动执行该静态块,始初数据。 static{ try{ //获取mybatis主配置文件SqlMapperConfig.xml的输入流 InputStream inputStream= Resources.getResourceAsStream("SqlMapperConfig.xml"); //创建SqlSessionFactoryBuilder构建者对象 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); //调用build方法返回SqlSessionFactory工厂对象 sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream); }catch (Exception e){ e.printStackTrace(); System.out.println("初始化数据失失败"+e.getMessage()); } } //创建getSqlSessionFactory方法返回SqlSessionFactory对象 public static SqlSessionFactory getSqlSessionFactory(){ return sqlSessionFactory; } //创建一个SqlSession对象并返回 public static SqlSession getSession(){ return sqlSessionFactory.openSession(); } //关闭SqlSession方法 public static void close(SqlSession session){ if(session!=null) session.close(); } }
2.使用代理对象操作数据库
public class UserTest { @Test public void testQueryAllUsers() throws Exception{ //1.获取mybatis主配置文件SqlMapperConfig.xml的输入流 InputStream inputStream=Resources.getResourceAsStream("SqlMapperConfig.xml"); //2.创建SqlSessionFactoryBuilder构建者对象 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); //3.调用build方法返回SqlSessionFactory工厂对象 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream); //4.调用sqlSessionFactory的openSession方法返回一个Session对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //5.调用SqlSession 创建 UserDao接口的代理对象 UserDao userDao = sqlSession.getMapper(UserDao.class); //6.调用代理对象的queryAllUsers方法查询所有User List<User> users = userDao.queryAllUsers(); users.forEach(System.out::print); //7.释放资源 sqlSession.close(); inputStream.close(); } @Test public void testQueryAllUsers2() throws Exception{ //调用MyBatisUtils工具创建SqlSession对象 SqlSession sqlSession = MyBatisUtils.getSession(); //调用SqlSession 创建 UserDao接口的代理对象 UserDao userDao = sqlSession.getMapper(UserDao.class); //调用代理对象的queryAllUsers方法查询所有User List<User> users = userDao.queryAllUsers(); users.forEach(System.out::print); //释放资源 sqlSession.close(); inputStream.close(); } }