目的:通过MyBatis的一个简单案例来进一步认识到MyBatis的作用。了解其中必须写的几个文件以及其逻辑关系。MyBatis的作用为简化JDBC操作。
需求:在test数据库中的pet表中插入数据,利用MyBatis的表达
MyBatis 以SqlsessionFactoryBuilder - SqlsessionFactory - Sqlsession 三层关系产生Sqlsession语句,通过语句在DAO层中封装事务的方法,最后通过DAO层中的实例化对象对方法进行调用(中间经过CRUD语句映射的作用)。
一、工程的架构
模块的概述:
1)Pom.xml 工程的配置文件,负责导入依赖包,在之后的Spring框架中,这些配置文件会被注解所代替
2)pojo 层 代表的是实现类层,一个pojo 层中的类对象对应的是一张实体的表 ,要求类的属性和数据库中表的列完全对应,插入的是pet表所以 pojo 对象命名为pet
3)Dao 层代表数据持久化层,在Dao层中对于pet对象进行操作
4)resources层 这里放置的是静态资源。 mybatis.xml 放置的是数据库的配置和CRUD语句映射的文件位置。 petMapper.xml 表示CRUD语句映射,在mybatis.xml中有对它的位置说明
5)utils 层 util层 放置了MyBatis的通用工具类MyBatisUtil,通过Reader 对象去加载读取mybatis.xml ( 一个文件在编写出来之后需要有调用的位置 ) utils层中也包括了生成Sqlsession语句的方法
二、pom.xml
其实可以为固定的内容,Maven的特性会去自动下载。导入Mybatis的依赖,mysql的依赖,junit用于测试的依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.guyuan</groupId>
<artifactId>testProj8</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
</project>
三、pojo层
package pojo;
public class pet {
String name;
String owner;
char sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
@Override
public String toString() {
return "pet{" +
"name='" + name + '\'' +
", owner='" + owner + '\'' +
", sex='" + sex + '\'' +
'}';
}
public pet(String name,String owner,char sex){
this.name = name;
this.owner = owner;
this.sex = sex;
}
}
四、resources资源
mybatis.xml
Url 链接表示选择了test数据库
<?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>
<!-- 加载类路径下的属性文件-->
<!-- <properties resource="db.properties">-->
<!-- </properties>-->
<!-- 设置实体类的类型别名-->
<typeAliases>
<typeAlias type="pojo.pet" alias="pet"></typeAlias>
</typeAliases>
<!-- 设置一个默认的连接环境信息,支持多数据源 -->
<environments default="mysql_env">
<!-- 连接环境信息,取一个唯一的编号 -->
<environment id="mysql_env">
<!-- mybatis使用的jdbc事务管理方式 -->
<transactionManager type="jdbc">
</transactionManager>
<!-- mybatis使用连接池方式来获取链接 -->
<dataSource type="pooled">
<!-- 配置与数据库交互的四个属性 -->
<!-- 选择test 数据库,建立对应的表-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value=""/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 这里放置的是Mapper文件 petMapper.xml的位置,petMapper.xml存放表映射和CRUD-->
<mapper resource="petMapper.xml"></mapper>
</mappers>
</configuration>
petMapper.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="petNameSpace">
<resultMap id="petMap" type="pet">
<result property="name" column="name"/>
<result property="owner" column="owner"/>
<result property="sex" column="sex"/>
</resultMap>
<insert id="add2" parameterType="pojo.pet">
insert into pet(name,owner,sex) values(#{name},#{owner},#{sex})
</insert>
</mapper>
五、util
package 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.Reader;
import java.sql.Connection;
public class MyBatisUtil {
// 读取多线程的sqlsession,同时也建立sqlsessionFactory
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
private static SqlSessionFactory sqlSessionFactory;
static {
try{
Reader reader = Resources.getResourceAsReader("myBatis.xml");
// 建立一个工厂类实例
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}catch(Exception e)
{
e.printStackTrace();
}
}
// 禁止外界通过new 方法来实现
private MyBatisUtil(){};
// 从当前线程中获取sqlsession对象
public static SqlSession getSqlSession(){
SqlSession sqlSession = threadLocal.get();
if(sqlSession==null){
sqlSession = sqlSessionFactory.openSession();
threadLocal.set(sqlSession);
}
return sqlSession;
}
public static void closeSqlSession()
{
SqlSession sqlSession = threadLocal.get();
if(sqlSession!=null){
sqlSession.close();
threadLocal.remove();
}
}
public static void main(String[] args) {
// 获取连接
Connection conn = MyBatisUtil.getSqlSession().getConnection();
}
}
六、Dao层
放置的是实现类
package dao;
import org.apache.ibatis.session.SqlSession;
import pojo.pet;
import utils.MyBatisUtil;
public class petDao {
public void add(pet pet) throws Exception {
SqlSession sqlSession = null;
try{
// 创建语句
sqlSession = MyBatisUtil.getSqlSession();
// 写语句
int i = sqlSession.insert("petNameSpace.add2",pet);
sqlSession.commit();
}catch (Exception e)
{
e.printStackTrace();
sqlSession.rollback();
throw e;
}
finally {
MyBatisUtil.closeSqlSession();
}
}
public static void main(String[] args) throws Exception {
petDao petDao = new petDao();
petDao.add(new pet("dio","jotaro",'M'));
}
}
七、其他问题
在编译mybatis.xml过程中报了错,找不到petMapper.xml 其实添加了Resource 关键字则代表了在书写路径是直接定位到了resources 文件夹下