Mybatis
Mybatis简介
官方解释:
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
360百科:
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
Mybatis的特点:
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
- 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射。
- 提供对象关系映射标签,支持对象关系组建维护。
- 提供xml标签,支持编写动态sql。
官方链接:
由上述的官方解释,我们可以得到Mybatis是一个持久层的框架,所谓持久层,就是我们通常开发时的dao层,数据持久层,就是将内存中失电即失的数据保存成永久不消失的代码层,就是专门处理数据持久化的,通俗理解就是我们通常操作数据库的dao层,当然,数据的持久化当然不只是存到数据库中这一种方式,比如文件IO,将数据写到文件中,也可以算是数据持久化。
Mybatis的入门程序
该框架是一个操作数据库的框架,我们想要使用它,先准备好数据库的资源:
CREATE DATABASE mybatis;
USE mybatis;
CREATE TABLE `user`(
`id` INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键id',
`name` VARCHAR(30) NOT NULL COMMENT '用户名',
`password` VARCHAR(30) NOT NULL COMMENT '密码'
)ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO USER(`name`,`password`) VALUES('Ara_Hu','123456'),('张三','123456'),('李思','123456'),('王武','123456'),('赵柳','123456'),('田七','123456'),('宋坝','123456');
创建一个Maven项目,并导入依赖:
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<!--测试Junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
创建与数据库表相对应的实体类User,这里需要字段名与数据库中的字段名一致。
package com.ara.pojo;
public class User {
private int id;
private String name;
private String password;
public User() {
}
public User(int id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
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 getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
创建Mybatis的核心配置文件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="com.mysql.jdbc.Driver"/>
<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="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
</mappers>
</configuration>
这里我们还是仿照我们之前操作JDBC的方式,先创建一个工具类MybatisUtils:
package com.ara.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.IOException;
import java.io.InputStream;
//Mybatis工具类
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//读取配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//通过传入的配置文件,获取SqlSessionFactory对象
//这里由于SqlSessionFactoryBuilder的作用就是来获取sqlSessionFactory 而且获取到之后就不会再使用 所以一次获取
//这里就是通过创建者模式来获取一个工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 通过sqlSessionFactory来获取SqlSession
* 这里使用了工厂模式
*
* @return SqlSession
*/
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}
然后创建一个UserDao接口,一般来说是应该创建UserMapper接口的,这里使用UserDao接口或许会更容易理解:
package com.ara.dao;
import com.ara.pojo.User;
import java.util.List;
public interface UserDao {
/**
* 查询所有的User
* @return 查询出的User列表
*/
List<User> getUsers();
}
一般来说,我们这个时候就该编写UserDao的实现类了,我们使用Mybatis就不需要编写实现类,我们只需要编写UserDao对应的xml配置文件UserMapper.xml,一般来说,将该文件和UserDao接口放在同一级目录下:
<?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 namespace="com.ara.dao.UserDao">
<!--id:对应接口中方法的名字,可以理解为接口中该方法的具体实现-->
<!--resultType:对应接口中方法的返回值类型,我们返回的是List<User>,这里设置为User即可-->
<select id="getUsers" resultType="com.ara.pojo.User">
select * from user;
</select>
</mapper>
注意这里的全限定类名。
这里好像就已经结束了,实际不是,我们还需要对UserMapper.xml做一个登记注册,我们需要在mybatis的配置文件(mybatis-config.xml)中的<mappers></mappers>
中添加以下代码:
<!--resource:就是我们需要注册的Mapper.xml的路径(注意这里的路径/和上面路径.的区分)-->
<mapper resource="com/ara/dao/UserMapper.xml"></mapper>
然后我们就可以编写测试代码了:
package com.ara.dao;
import com.ara.pojo.User;
import com.ara.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserDaoTest {
@Test
public void getUsersTest(){
//获取sqlSession
SqlSession sqlSession = MybatisUtils.getSqlSession();
//执行sql
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> users = userDao.getUsers();
//遍历结果集
for (User user : users) {
System.out.println(user);
}
//关闭sqlSession
sqlSession.close();
}
}
博主这里的目录结构展示如下:
运行结果如下:
到此,我们的Mybatis的入门就结束了。
如果跟博主一样的操作,可能会遇到找不到UserMapper.xml的错误:
这就是我们的Maven的pom文件没有配置过滤的问题,我们只需要在pom文件中添加以下配置即可:
<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>
添加之后,问题就会得到解决。