本文目录
mybatis架构
本文将对mybatis的架构进行介绍
一、mybatis架构图
二、Mybatis入门程序代码实现
为了更好的理解上面的mybatis的架构图,我们通过一个mybatis的入门程序来加深理解
1.导入相关依赖
2.创建Mybatis的主配置文件
Mybatis主配置文件:SqlMappingConfig.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>
<!--配置sql打印-->
<!--只需要做这样一个配置 你以后的SQL信息就会自动给你打印-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--定义别名-->
<typeAliases>
<!--单个别名定义-->
<!-- <typeAlias alias="Customer" type="com.itlike.domain.Customer"/>-->
<!--批量定义别名, 别名为类名-->
<package name="com.itlike.domain"/>
</typeAliases>
<!-- spring整合后 environments配置将废除 使用spring中的连接池 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8" />
<property name="username" value="root" />
<property name="password" value="9527"/>
</dataSource>
</environment>
</environments>
<!--加载映射文件-->
<mappers>
<mapper resource="com/itlike/domain/Customer.xml"></mapper>
<!--
1.名称必须得要和接口名称一致
2.必须得要和mapper接口在同一目录
-->
<!-- <mapper class="com.itlike.mapper.CustomerMapper"/>-->
<!--<package name="com.itlike.mapper"/>-->
</mappers>
</configuration>
3.POJO类
Customer类
package com.itlike.domain;
public class Customer {
private Integer cust_id;
private String cust_name;
private String cust_profession;
private String cust_phone;
private String cust_email;
public Integer getCust_id() {
return cust_id;
}
public void setCust_id(Integer cust_id) {
this.cust_id = cust_id;
}
public String getCust_name() {
return cust_name;
}
public void setCust_name(String cust_name) {
this.cust_name = cust_name;
}
public String getCust_profession() {
return cust_profession;
}
public void setCust_profession(String cust_profession) {
this.cust_profession = cust_profession;
}
public String getCust_phone() {
return cust_phone;
}
public void setCust_phone(String cust_phone) {
this.cust_phone = cust_phone;
}
public String getEmail() {
return cust_email;
}
public void setEmail(String email) {
this.cust_email = email;
}
@Override
public String toString() {
return "Customer{" +
"cust_id=" + cust_id +
", cust_name='" + cust_name + '\'' +
", cust_profession='" + cust_profession + '\'' +
", cust_phone='" + cust_phone + '\'' +
", email='" + cust_email + '\'' +
'}';
}
}
4.创建一个mybatis工具类
由于每次使用mybatis对数据库进行操作都需要获取sqlSession对象,这将造成大量的代码冗余,所以我们把这些冗余的步骤写到工具类中,以后用到的时候直接调用工具类中的方法即可。
MybatisUtils 工具类
package com.itlike.utils;
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 {
public static final SqlSessionFactory sessionFactory ;
//静态代码块 只执行一次
static {
//获取SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//读取配置文件
InputStream resourceAsStream=null;
try {
resourceAsStream = Resources.getResourceAsStream("SqlMappingConfig.xml");
} catch (IOException e) {
e.printStackTrace();
}
sessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
}
public static SqlSession openSession(){
return sessionFactory.openSession();
}
}
5.xml配置文件–SQL语句书写
Customer.xml
里面写了增删查改的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="test">
<!--查询单个数据-->
<select id="queryCustomerById" parameterType="Int" resultType="com.itlike.domain.Customer">
/*编写SQL语句*/
SELECT * FROM customer WHERE cust_id=#{cust_id}
</select>
<!--查询所有数据-->
<select id="queryAllCustomers" resultType="com.itlike.domain.Customer">
/*编写SQL语句*/
SELECT * FROM customer
</select>
<!--模糊查找-->
<select id="queryCustomerByName" parameterType="String" resultType="com.itlike.domain.Customer">
/*编写SQL语句*/
SELECT * FROM customer WHERE cust_name LIKE #{name }
</select>
<!--插入数据-->
<insert id="insert" parameterType="com.itlike.domain.Customer">
insert into customer value (#{cust_id},#{cust_name},#{cust_profession},#{email},#{cust_phone})
</insert>
<!--更新数据-->
<update id="update" parameterType="com.itlike.domain.Customer">
update customer set cust_name=#{cust_name} where cust_id=#{cust_id}
</update>
<!--删除数据-->
<delete id="delete" parameterType="com.itlike.domain.Customer">
delete from customer where cust_id=#{cust_id}
</delete>
</mapper>
6.测试程序
单元测试代码
//查询所有数据
@Test
public void test3() {
SqlSession sqlSession = MybatisUtils.openSession();
//遍历快捷方式 iter
List<Customer> queryAllCustomers = sqlSession.selectList("queryAllCustomers");
for (Customer customer : queryAllCustomers) {
System.out.println(customer);
}
sqlSession.close();
}
运行结果如图:
7.再次回到mybatis整体架构
mybatis首先通过SqlSessionFactoryBuilder加载配置文件SqlMapConfig.xml 并给你一个工厂sessionFactory
代码如下:
static {
//获取SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//读取配置文件
InputStream resourceAsStream=null;
try {
resourceAsStream = Resources.getResourceAsStream("SqlMappingConfig.xml");
} catch (IOException e) {
e.printStackTrace();
}
sessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
}
sessionFactory 可以给你一个sqlSession 你拿到这个sqlSession之后就可以针对数据库进行操作了。
@Test
public void test3() {
SqlSession sqlSession = MybatisUtils.openSession();
//遍历快捷方式 iter
List<Customer> queryAllCustomers = sqlSession.selectList("queryAllCustomers");
for (Customer customer : queryAllCustomers) {
System.out.println(customer);
}
sqlSession.close();
}
你在上面代码里面调用方法,比如
List queryAllCustomers = sqlSession.selectList(“queryAllCustomers”);
里面会有专门的执行器来帮你执行这些方法,执行器会到对应的映射xml文件中去给你找对应的语句,找到后把对应语句的参数传给这个语句(如果这个语句需要参数的话)。这些步骤都完成之后再到数据库中去执行这个语句,执行完之后还有输出映射返回给你。