MyBatis简介
MyBatis是Apache的一个开源项目,它对JDBC进行了封装,是开发者不再需要繁琐地去处理驱动、创建connection、创建statement等。它让开发者更专注于执行sql并将结果集映射到javabean上。
我们需要加入MyBatis的jar包,GitHub地址,以及数据库驱动jar包。
MyBatis的工作流程,盗用小弟的图:
我们来阐述一下这个过程:
1、SqlMapConfig.xml是MyBatis的全局配置文件,我们在文件里配置驱动、数据库地址、用户名密码等运行环境信息;
2、mapper.xml是sql映射文件,它配置了sql语句,这些文件需要在SqlMapConfig.xml中声明加载;
3、我们通过以上配置信息构造出SqlSessionFactory会话工厂;
4、通过会话工厂SqlSessionFactory创建会话SqlSession来操作数据库;
5、MyBatis底层自定义Executor(执行器)接口用于执行数据库操作,该接口有两个实现:基本执行器和缓存执行器;
6、MappedStatement是MyBatis的底层封装对象,它封装了操作数据库的sql语句,输入参数,输出结果等信息。mapper.xml文件中每一个sql语句对应一个MappedStatement对象,sql语句的id即是MappedStatement的id;
7、MappedStatement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过MappedStatement在执行sql前将输入的java对象映射至sql中;
8、MappedStatement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过MappedStatement在执行sql后将输出结果映射至java对象中。
MyBatis简单示例
在了解MyBatis的基本原理之后我们需要通过一个简单的示例来让我们更加清晰地认识到MyBatis,我们根据上面介绍的方式一步一步来写示例。
1. 数据准备
建表插入数据。
2.SqlMapConfig.xml文件配置
我在src目录下新建配置文件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="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/mydatabase?useSSL=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/sqlmap/PersonMapper.xml"/>
</mappers>
</configuration>
3. PersonMapper.xml配置
在包”com.sqlmap”中新建一个PersonMapper.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="person">
<select id="query" resultType="com.javabean.Person">
select * from person
</select>
<select id="findPersonByName" parameterType="java.lang.String" resultType="com.javabean.Person">
select * from person where pname=#{value}
</select>
</mapper>
4. Person.class类
在包”com.javabean”中新建Person.class类。
public class Person {
private int pid;
private String pname;
private int page;
private String pcity;
//setter、getter
public String toString(){
return "pid:" + pid + ", pname:" + pname + ", page:" + page + ", pcity:" + pcity;
}
}
5. 测试
伪代码:
String resource = "SqlMapConfig.xml";
InputStream input = Resources.getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(input);
private void findPersonByName(String name){
SqlSession session = factory.openSession();
Person person = (Person) session.selectOne("person.findPersonByName", name);
session.close();
System.out.println(person.toString());;
}
private void query(){
SqlSession session = factory.openSession();
List<Person> persons = session.selectList("person.query");
session.close();
for( Person person : persons ){
System.out.println(person.toString());
}
}
上面准备的数据库得知,
findPersonByName(“戚继光”)结果为:
pid:1, pname:戚继光, page:24, pcity:蓟州
query()结果为:
pid:1, pname:戚继光, page:24, pcity:蓟州
pid:2, pname:李鸿章, page:74, pcity:合肥