mybatis是一个基于java得持久层框架。
1、mybatis架构图:
1)mybatis配置文件详解
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
2)实现原理
a.通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂。
b.由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
c.mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
d.Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
e.Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
f.Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
2、使用mybatis框架
1)搭建一个java项目,新建一个lib文件夹,存放mybatis所需要用到得jar包
若要连接数据库,还需要一个连接驱动jar包,第一个是mysql的连接驱动,第二个是oracle的连接驱动
2)添加配置文件
放置于src同级目录,log4j配置文件不用修改,SqlMapConfig.xml是连接数据库的配置文件,
在environments标签里配置数据库的连接信息,里面的environment可以配置多个数据库的连接信息,根据每个标签的id进行区分连接哪个数据库;
mappers标签配置的是具体的sql映射文件,将具体的mapper.xml进行加载,不在这个文件中进行加载,则不能使用mapper.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>
<!-- mybatis和spring整合过后废除 -->
<environments default="development">
<environment id="development">
<!-- 和jdbc的事物管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/baby?characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!-- 加载映射文件xml-->
<mappers>
<mapper resource="User.xml"></mapper>
</mappers>
</configuration>
3)准备一个pojo:一张数据库表对应一个pojo文件
User.java
package com.gxa.pojo;
import java.util.Date;
public class User {
private Long id;
private String username;
private String password;
private String salt;
private String phone;
private Date created;
private Date lastLoginTime;
private Integer status;
public User(Long id, String username, String password, String salt, String phone, Date created, Date lastLoginTime, Integer status) {
this.id = id;
this.username = username;
this.password = password;
this.salt = salt;
this.phone = phone;
this.created = created;
this.lastLoginTime = lastLoginTime;
this.status = status;
}
public User() {
}
/**
* @return id
*/
public Long getId() {
return id;
}
/**
* @param id
*/
public void setId(Long id) {
this.id = id;
}
/**
* @return username
*/
public String getUsername() {
return username;
}
/**
* @param username
*/
public void setUsername(String username) {
this.username = username;
}
/**
* @return password
*/
public String getPassword() {
return password;
}
/**
* @param password
*/
public void setPassword(String password) {
this.password = password;
}
/**
* @return salt
*/
public String getSalt() {
return salt;
}
/**
* @param salt
*/
public void setSalt(String salt) {
this.salt = salt;
}
/**
* @return phone
*/
public String getPhone() {
return phone;
}
/**
* @param phone
*/
public void setPhone(String phone) {
this.phone = phone;
}
/**
* @return created
*/
public Date getCreated() {
return created;
}
/**
* @param created
*/
public void setCreated(Date created) {
this.created = created;
}
/**
* @return last_login_time
*/
public Date getLastLoginTime() {
return lastLoginTime;
}
/**
* @param lastLoginTime
*/
public void setLastLoginTime(Date lastLoginTime) {
this.lastLoginTime = lastLoginTime;
}
/**
* @return status
*/
public Integer getStatus() {
return status;
}
/**
* @param status
*/
public void setStatus(Integer status) {
this.status = status;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", salt='" + salt + '\'' +
", phone='" + phone + '\'' +
", created=" + created +
", lastLoginTime=" + lastLoginTime +
", status=" + status +
'}';
}
}
4)准备sql映射文件,写sql语句
User.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">
<!-- 命名空间,用于隔离sql,后面还有一个很重要的作用 -->
<mapper namespace="test">
</mapper>
5)在主配置文件中加载映射文件:
6)使用单元测试根据id查找用户信息
在User.xml中编写sql语句:
id:statement的id,或者是区别sql的id;
parameterType:声明输入参数的类型;
resultType:接收结果集的类型;
<?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">
<!-- 命名空间,用于隔离sql,后面还有一个很重要的作用 -->
<mapper namespace="test">
<!--id:statement的id,或者是区别sql的id
parameterType:声明输入参数的类型
resultType:接收结果集的类型
-->
<!-- 查询数据-->
<select id="queryUserById" parameterType="int" resultType="com.gxa.pojo.User">
select * from user where id = #{id}
</select>
</mapper>
写一个测试类TestDemo.java
package com.gxa.test;
import com.gxa.pojo.User;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class TeseDemo {
@Test
public void testQueryUserById() throws IOException {
//1、加载主配置文件
//创建一个SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//2、加载mybatis主配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//3、加载配置文件创建SqlSession工厂
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
//4、获得SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//使用SqlSession对象的selectOne方法,第一个参数是mapper中的sqlid,第二个参数是输入参数,查询根据id查找用户信息
User user = sqlSession.selectOne("queryUserById", 1);
System.out.println(user);
}
}
以上是一个最基础的使用mybatis框架测试案例,在SSM开发中,上面的代码会进行一些简化。