MyBatis(半自动ORM框架)
什么是
ORM:
ORM
,
Object-RelationlMapping
,对象关系映射,它的作用是在关系型数据库和对象之间作一个映射处理。
JDBC
拥有天生的缺陷,需要
手动的完成面向对象的
Java
语言、面向关系的数据库之间数据的转换,代码繁琐无技术含量,影响了开发效率。
相当于在面向对象语言和关系数据库之间搭建一个桥梁。这样我们在具体的操作数据库的时候,只要像平时操作对象一样操作它就可以了,ORM框架会根据映射完成对数据库的操作,就不需要再去和复杂的
SQL
语句打交道了。
MyBatis
环境搭建:
1.导入依赖
<?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>com.csi</groupId>
<artifactId>mybadis</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
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>
<properties resource="jdbc.properties"/>
<typeAliases>
<package name="com.csi.smbms.domain"/>
</typeAliases>
<environments default="development">
<environment id="development">
<!--事务管理-->
<transactionManager type="JDBC"/>
<!--数据连接池-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
映射文件加载
<mappers>
<mapper resource="com/csi/smbms/domain/ProviderMapper.xml"/>
<mapper resource="com/csi/smbms/domain/UserMapper.xml" />
<mapper resource="com/csi/smbms/domain/BillMapper.xml" />
<mapper resource="com/csi/smbms/domain/RoleMapper.xml" />
</mappers>
MyBatis
的生命周期:
SqlSessionFactoryBuilder :
1.用过即丢,其生命周期只存在于方法体内
· 2. 可重用其来创建多个 SqlSessionFactory
实例
3. 负责构建SqlSessionFactory
,并提供多个
build
方法的重载
SqlSessionFactory:
SqlSessionFactory
是每个
MyBatis
应用的核心
作用:创建SqlSession
实例:
SqlSession salSession = sqlSessionFactory.openSession();
作用域:Application
SqlSession :
1. 包含了执行SQL所需的所有方法
2. 对应一次数据库会话,会话结束必须关闭
3.线程级别,不能共享
MyBatis工具类:MyBatis工具类
package com.csi.smbms.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 {
private static SqlSessionFactory factory ;
//保持其唯一性
private static ThreadLocal<SqlSession> tl = new ThreadLocal<>() ;
static {
//加载配置文件
InputStream is = null;
try {
is = Resources.getResourceAsStream("mybatis-config.xml");
} catch (IOException e) {
throw new RuntimeException(e);
}
factory = new SqlSessionFactoryBuilder().build(is);
}
public static SqlSession getSqlSession(){
//先从ThreadLocal中获取SqlSession
SqlSession sqlSession = tl.get();
//如果SqlSession为Null
if (sqlSession == null){
//执行factory.openSession()方法来确保其唯一性
sqlSession = factory.openSession();
//将sqlSession放到ThreadLocal中
tl.set(sqlSession);
}
return sqlSession ;
}
/**
* 关闭sqlSession
*/
public static void close(){
//先从ThreadLocal中获取sqlSession对象
SqlSession sqlSession = tl.get();
//如果sqlSession不为null
if (sqlSession != null){
//将sqlSession关闭
sqlSession.close();
//同时哦设置tl中的sqlSession为null
tl.set(null);
}
}
}
2.$与#之间的区别(**)
-
#{}是预编译处理,${}是字符串替换
-
MyBatis在处理#{}时,会将sql中的#{}替换为?号,调用PerparedStatement的set来赋值
-
MyBatis在处理${}时,就是把${}替换成变量的值
-
使用#{}可以有限防止SQL注入问题,提高系统安全性
简单的CRUD语句
<?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="com.csi.smbms.dao.RoleMapper">
<select id="list" resultType="Role">
select * from smbms_role
</select>
<select id="findById" resultType="Role" parameterType="long">
select * from smbms_role where id = #{id}
</select>
<select id="findLike" resultType="Role" parameterType="String">
select * from smbms_role where roleCode like CONCAT('%',#{roleCode},'%')
</select>
<select id="select" resultType="Role" parameterType="map">
select * from smbms_role where roleCode = #{roleCode} and roleName = #{roleName}
</select>
<insert id="save" parameterType="Role">
insert into smbms_role(roleCode, roleName, createdBy, creationDate) values (#{roleCode},#{roleName},#{createdBy},now())
</insert>
<update id="updateById" parameterType="Role">
update smbms_role set roleName = #{roleName} where id = #{id}
</update>
<delete id="deleteById" parameterType="long">
delete from smbms_role where id = #{id}
</delete>
</mapper>