Mybatis笔记1--使用介绍
Mybatis介绍
首先先简单了解一下Mybatis,以下是摘自百度百科对它的介绍:
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
使用介绍
框架之所以会出现是为了减少代码的编写和让整个开发流程变得更加清晰明了层次分明。而大部分java框架主要是通过XML配置文件和注解来达到这个目的。
下面介绍Mybatis的使用
首先数据库存在以下这样一张表

接下来通过三种不同的XML和注解配合的使用方式去实现查找所有用户信息这样一个功能来介绍如何使用Mybatis。
-
方式一
这个简单工程的目录结构如下:
目录结构.png
工程中需要额外配置SqlMapConfig.xml和IUserDao.xml。以
下对这两配置文件进行简单说明。
- 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>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 使用的是注解 -->
<mappers>
<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
<mapper resource="com/huang/dao/IUserDao.xml"/>
</mappers>
</configuration>
可见该配置文件的作用除了配置数据库的登录信息外同时还指出了映射配置文件的位置(文件中的mapper标签)。
- IUserDao.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="com.huang.dao.IUserDao">
<!--配置查询所有-->
<select id="findAll" resultType="com.huang.domain.User">
select * from user
</select>
</mapper>
可见该文件通过mapper标签的namespace类指出了所对应的IUserDao接口的全限定类名,以及其findAll方法所需要的sql语句和方法返回结果对应的封装到的对象User的全限定类名。
最后因为使用了Mybatis框架,我们并不需要写一大坨JDBC的代码。如目录结构所示只需要写查询数据库接口和封装数据的User类,剩下只需要一些简单的操作就能查出所有用户数据。
代码如下:
public class MybatisTest {
public static void main(String args[])throws Exception{
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapconfig.xml");
//2. 创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3. 使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession创建Dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
//6.释放资源
session.close();
in.close();
}
}
结果如下:

- 方式二(实现了UserDaoImpl接口)
工程目录结构如下

和方式一的主要差别是UserDaoImpl实现了IUserDao接口。配置SqlMapConfig.xml和IUserDao.xml跟方式一是一致的,就不再贴了。
再看实现查询操作的MybatisTest代码
public class MybatisTest {
public static void main(String args[])throws Exception{
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2. 创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//4.使用SqlSession创建Dao接口的代理对象
IUserDao userDao = new UserDaoImpl(factory);
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
//6.释放资源
in.close();
}
}
这段代码与方式一相比没有使用到IUserDao的代理对象,而new了一个实现该接口的UserDaoImpl对象。
- 方式三(使用到了注解去实现查询的功能)
工程目录如下:

可见以上两种方式相比并没有IUserDao.xml配置文件。其中配置的sql都被写在@Select注解中。IUserDao代码如下:
public interface IUserDao {
/**
* 查询所有操作
* @return
*/
@Select("select*from user")
List<User> findAll();
}
而最后MybatisTest 的代码跟方式一是一样的代码就不贴了