一、概述
-
什么是Mybatis
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录
-
什么是持久层
持久化就是数据在瞬时状态和持久状态之间转换的过程
内存断电即失,现在无法用技术解决内存永不断电,因此需要将内存的数据持久化存储到磁盘,硬盘等
-
持久层对应代码的Dao层,专注于处理数据库,但是我们目前会写一大堆重复的JDBC代码,我们应专注于sql语句编写,获得返回值即可
-
我们的系统中应该有一个单独的层面来处理这个数据库连接问题,通过解耦,这个层面就有较为清晰的逻辑边界
-
为什么需要这个框架
hibernate是全自动的ORM框架,不用编写sql语句,黑箱操作
Mybatis是半自动的的ORM框架,开发人员自己定义sql语句,更加灵活,白箱操作
-
SSH:Spring、Struts1/2、hibernate
SSM:Spring、SpringMVC、Mybatis
-
Mybatis优点
-
不用再去编写一堆JDBC代码
-
简单易学,不依赖第三方程序或框架,官网文档强大,开源,可以进行原码分析
-
实现解耦,符合低耦合,高内聚的编程要求
-
ORM:对象关系映射
-
二、第一个Mybatis程序
-
准备所需的数据库
CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybatis` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `mybatis`; DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` INT(20) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, `pwd` VARCHAR(30) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8; INSERT INTO `user`(`id`,`name`,`pwd`) VALUES (1,'狂神','123456'),(2,'张三','abcdef'),(3,'李四','987654');
-
创建一个普通的Maven项目(具体步骤参考笔者2019年7月19日的博文,此处只给出pom.xml代码)
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.westos</groupId> <artifactId>ssm-mybatis</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>mybatis1</module> <module>mybatis2</module> </modules> <dependencies> <!--单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> <!--mybatis的包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.1</version> </dependency> <!--连接数据库的驱动包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> </dependencies> <build> <!--希望maven在导出项目的时候,能够将我们的配置及资源导出--> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build> </project>
-
创建pojo实体类
package org.westos.pojo; 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 + '\'' + '}'; } }
-
在resources目录下创建mybatis-config.xml用于编写mybatis配置文件
<?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> <!--配置环境,这里可以有多套环境 default代表默认的是那一套--> <environments default="development"> <!--配置一套环境 id .环境的名字--> <environment id="development"> <!--transactionManager:事务管理,type:jdbc--> <transactionManager type="JDBC"/> <!--dataSource 数据源--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <!--xml中不允许&符号直接出现,我们需要使用 & 代替--> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&charsetEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!--关联映射文件--> <mappers> <mapper resource="org/westos/dao/userMapper.xml"/> </mappers> </configuration>
-
在resources目录下创建工具类
package org.westos.utils; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class MybatisUtils { //类变量不需要设置默认值; private static SqlSessionFactory sqlSessionFactory; static { //在maven中,所有的资源文件一般都放在resources目录下,我们可以直接拿到。 try { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //设置SqlSessionFactory公共的方法 public static SqlSessionFactory getSqlSessionFactory(){ return sqlSessionFactory; } }
-
映射文件的接口,对应原来的接口
package org.westos.dao; import org.westos.pojo.User; import java.util.List; public interface UserMapper { //获取全部的用户 List<User> selectUser(); }
-
编写接口对应的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"> <!--mapper标签的namespace对应Mapper接口的类--> <mapper namespace="org.westos.dao.UserMapper"> <!--select标签的id对应映射接口的方法名字 resultType:返回结果的类型 中间就编写sql语句--> <select id="selectUser" resultType="org.westos.pojo.User"> select * from user </select> </mapper>
-
在maven的test目录下编写对应的测试类
package org.westos.dao; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.junit.Test; import org.westos.pojo.User; import org.westos.utils.MybatisUtils; import java.util.List; public class UserMapperTest { @Test public void selectUser(){ //1.拿到sqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = MybatisUtils.getSqlSessionFactory(); //2.通过sqlSessionFactory对象openSession()创建一个sqlSession。 SqlSession sqlSession = sqlSessionFactory.openSession(); //3.通过sqlSession获得mapper对象 , 参数为映射文件对应的接口类的class对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //4.通过mapper对象来执行操作; List<User> users = mapper.selectUser(); //获得结果集 for (User user : users) { System.out.println(user); } } }
-
运行结果:
-
项目结构