在最近的项中用到了MyBatis,所以上网学习了一下相关内容。
一、简介
MyBatis本来是apache的一个开源项目IBatis,2010年这个项目迁移到了google code,并且该名称为MyBatis,2013年11月迁移到了Github。这就是为什么我们引用过的jar版本不同,项目中import也是不同的。老版本的是org.csource.fastdfs,而新版的标识的是GItup上面的。
MyBatis支持普通的SQL查询,存储过程和高级查询的优秀的持久层的框架,MyBatis消除了几乎所有的JDBC代码和参数的手工设置。MyBatis使用简单的XML或注解用于配置和原始映射。将接口和POJOS映射成为数据库中的记录。
MyBatis的最大特性在于它的动态语句功能。我们知道把SQL语句连接拼在一起,是一件特别需要细心和耐心的活,要确保不能够忘记空格或者不要再coloumns列后面省略一个逗号。MyBatis的能够通过在任何映射SQL中使用强大动态SQL语句来改进这些状况。
二、第一个查询实例
项目最终目录结构如下:
1.需要的开发环境
普通的Java项目或者JavaWeb项目都可以。
2.添加相应的jar文件
(1)mybatis mybatis-3.1.1.jar
(2) mysql驱动包 myslq-connector-java -5.1.7-bin.jar
3.创建数据库和表,这里使用的是msyql数据库。
4.添加mybatis的配置文件conf.xml
在src下目录创建conf.xlm文件。
conf.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" />
<property name="username" value="root" />
<property name="password" value="1" />
</dataSource>
</environment>
</environments>
<!-- 注册userMapping.xml文件 -->
<mappers>
<mapper resource="cn/mapping/userMapping.xml" />
</mappers>
</configuration>
5.创建实体类
package cn.entity;
/**
* 用户实体
* @author lizhenjuan
*
*/
public class User {
private int id;
private String name;
private int age;
//省略get和set方法
@Override
public String toString(){
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
6、创建users表的sql映射文件uerMappint.xml文件。
useMapping.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.mapping.userMapping">
<!-- 为这个mapper指定唯一的namespace,习惯上命名:包名称+sql映射文件,这样就能够保证命名空间的唯一性。 -->
<!-- 在select标签上编写查询的slq语句。id值必须唯一,不能够重复。
parameterType指明查询的参数类型
resultType查询返回的结果集类型,resultType="cn.entity.User"表示将查询的结果集封装成为一个User对象返回。
-->
<select id="getUser" parameterType="int" resultType="cn.entity.User">
<!-- 根据ID查询用户信息 -->
SELECT * FROM users where id=#{id}
</select>
</mapper>
7.在conf.xml文件中注册userMapper.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" />
<property name="username" value="root" />
<property name="password" value="1" />
</dataSource>
</environment>
</environments>
<!-- 注册userMapping.xml文件 -->
<mappers>
<mapper resource="cn/mapping/userMapping.xml" />
</mappers>
</configuration>
8.创建测试方法
创建测试类,根据id查询数据库的一条记录。
package MyBaties;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import cn.entity.User;
public class TestMybatis {
@Test
public void test() throws IOException{
//获取mybatis的映射文件
String resource="conf.xml";
//使用类加载器加载mybatis的配置文件,它也加载关联的映射文件
//InputStream is= TestMyBatis.TestMybatis.class.getClassLoader().getResourceAsStream(resource);
InputStream is= TestMybatis.class.getClassLoader().getResourceAsStream(resource);
//构建sessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
//能够执行映射文件的sql的sqlSession
SqlSession session=sessionFactory.openSession();
//映射sql的标识字符串
//其中“cn.mapping.userMapping”是UserMapping.xml文件的命名空间的值,getUser是select标签的Id值
//因为getUser方法唯一,所以通过id值就可以找到要执行的sql语句。
String statement="cn.mapping.userMapping.getUser";
User user=session.selectOne(statement,2);
System.out.println(user);
}
}
9.最后查询效果
10.执行过程总结
大致执行流程如下:
(1)首先SqlSessionFactoryBuilder去读取Mybatis的配置文件,然后build一个DefaultSqlSessionFactory。
(2)获取SqlSessionFactory之后,就可以通过SqlSessionFactory文件来获取SqlSession.
(3)现在得到了SqlSession对象,接下来就可以直接调用Session的中select、insert、update方法了。
(4)在MyBatis中,通过MapperProxy来动态代理我们的dao,也就是当咱们执行自己写的dao里面的方法时候,其实是对应mapperProxy在代理。
三、参考资料
深入理解Mybatis系列--sql执行流程分析(源码篇)
mybatis知识点总结和梳理