历史了解:
MyBatis 本是apache的一个开源项目ibatis, 2010年这个项目由apache 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github 。因此,现在要想下载Mybatis,要去Github下载,别找错地方了。官方文档网址:http://www.mybatis.org/mybatis-3/zh/index.html
GitHub下载网址:https://github.com/mybatis/mybatis-3。
Mybatis简介:
MyBatis 是一款优秀的持久层框架。
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程。
MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 实体类 【Plain Old Java Objects,普通的 Java对象】映射成数据库中的记录。
思想理解:
其实,关于Mybatis避免jdbc复杂代码,用简单xml或者注解来配置,就是Mybatis的主要作用,说白了,所谓框架,就是工具嘛,就是为了简化开发过程,把那些重复且复杂的步骤规定好,开发人员就只需要关注具体功能的实现就行了。打个比方,都去银行办理过业务吧,各种业务,要写各种信息,前台都会发一张表格,打几个勾或者简单填表,就把信息写好了。那银行为啥不发张白纸给你呢?让你自己画呢?因为那些复杂的选项不一定都能想起来,而且关键点在于,那些选项的框架都是死的,用的着给你一张白纸自己画吗?填表的人只需要关注具体事件就行了。所以这就是框架的作用和思想。
上面解释为什么要用Mybatis框架的原因应该比较容易理解。那么,为什么称Mybatis为一款优秀的持久层框架?啥叫持久?啥叫持久层?所谓持久化,就是字面意思,持久保存的意思,为什么Mybatis要讲持久化呢?那是因为,它是和数据库打交道的,说数据库是持久的,那是因为内存是不持久的。举个例子,假设你在写论文的时候,写了一晚上,突然电脑死机了,而你又忘记保存了,那重启后,东西全都没了,这就是内存的不持久性,内存是断电即失的。数据库的持久性是因为数据库的内容是存在外存的,不会断电即失。而所谓持久层,层就是实现某个功能的代码块,比如传统开发中的dao层,而Mybatis就是来实现dao层的功能的。
环境搭建
软件和准备工作:
jdk
MySQL
maven
IDEA
一、先准备一个测试数据库,来复习一下创建数据库表的代码吧:
CREATE DATABASE `mybatis`;
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');
二、导入jar包,需要两个,直接maven配置:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
三、在resources中写第一个配置文件,主要是配置链接数据库的一些参数:
<?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=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/dao/userMapper.xml"/>
</mappers>
</configuration>
注意:mapper标签中,是第二个配置文件的路径,第二个配置文件中写具体SQL语句。
四、用工厂模式写一个工具类,读取上面的链接数据库参数的配置文件,并返回一个SqlSession对象:
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;
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取SqlSession连接
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
}
五、写测试的实体类:
public class User {
private int id; //id
private String name; //姓名
private String pwd; //密码
//构造,有参,无参
//set/get
//toString()
}
六、写查询数据库的接口:
public interface UserMapper {
List<User> selectUser();
}
七、编写mapper的配置文件:这就是第二个配置文件,第一个配置文件中写的是连接数据库的一些参数,这两个配置文件要区分清楚。这第二个配置文件中写的包括:namespace其实就是对应接口的位置,select标签对应查询操作,resultType对应从数据库中返回的数据封装成的实体类对象。其实,第二个配置文件就是来处理数据库操作了,来对应你写的接口和接口中的方法,具体方法对应的实体对象也在这里配置,最后在里面写上具体查询数据库的SQL语句。
<?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.dao.UserMapper">
<select id="selectUser" resultType="com.pojo.User">
select * from user
</select>
</mapper>
八
最后,写个测试类测试一下,我们Mybatis的环境是否搭建成功:
简单来讲一下运行过程:
首先,通过写的工厂类,来获取SqlSession对象,工厂类中读取了第一个配置文件,第一个配置文件中写了连接数据库的参数,因此SqlSession其实就是对应数据库的连接。然后,SqlSession对象调用selectlist,因为第一个配置文件中配置了第二个配置文件的路径:
<mappers>
<mapper resource="com/dao/userMapper.xml"/>
</mappers>
因此SqlSession可以获取第二个配置文件的信息,第二个配置文件中写明了对应的接口和方法以及返回的实体类,然后根据第二个配置文件中SQL语句,执行数据库查询,返回user对象。
public class MyTest {
@Test
public void selectUser() {
SqlSession session = MybatisUtils.getSession();
List<User> users = session.selectList("com.mapper.UserMapper.selectUser");
for (User user: users){
System.out.println(user);
}
session.close();
}
}
最后,因为第二个配置文件没写在resources中,有可能出现maven资源静态过滤的问题,所以,需要在maven中多配置一下资源加载:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>