什么是MyBatis?
- Apahce的一个开源项目
- 一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。解耦
- 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
- 通过简单的 XML 或注解来配置和映射 Java对象 到 数据库中的记录
- 官方地址:https://mybatis.org/mybatis-3/
MyBatis核心流程:
https://mybatis.org/mybatis-3/zh/getting-started.html
-
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心
-
SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得
-
SqlSessionFactoryBuilder 可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例
-
工厂设计模式里面 需要获取SqlSession ,里面提供了在数据库执行 SQL 命令所需的所有方法
MyBatis使用流程:
Step1:创建mybatis-config.xml全局的配置文件
Step2:创建XXXMapper.xml配置文件
Step3:创建SqlSessionFactory
Step4:用SqlSessionFactory创建SqlSession对象
Step5:用SqlSession执行增删改查CRUD
Step1:新建SpringBootMaven项目
Step2:添加maven依赖
<dependencies>
<!--Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- 使用JDBC链接mysql的驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<!--日志打印-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
Step3: 配置mybatis-config.xml
resources目录下创建config文件夹创建xml配置文件
作用:用于配置mybatis,连接信息等
问题:在连接数据库后可能会报一个乱码错误,这是因为mysql-connection-java版本导致时区的问题。
解决方法是在Mysql中执行新增操作
SET GLOBAL time_zone = ‘+8:00’
<?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">
//jdbc驱动
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
//数据库连接地址 对用用户名、密码等
<property name="url" value="jdbc:mysql://127.0.0.1:3306/educationapp?useUnicode=true;characterEncoding=UTF-8;serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
//一个表就对应一个mapper文件 mapper路径 这里面放的是sql语句
<mappers>
<mapper resource="mapper/VideoMapper.xml"/>
</mappers>
</configuration>
Stpe4:创建实体类
/**
* 视频实体
*/
public class Video {
private int id;
private String title;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
Step5:创建Dao接口-与数据库交互层
public interface VideoMapper {
/**
* 根据视频id查找视频对象
* @param videoId
* @return
*/
//单一参数可以不写注解 多参数需要写
Video selectById(@Param("video_id") int videoId);
}
Step6:配置**Mapper.xml
- 注意 :取java对象的某个值,属性名大小写要一致
#{value} : 推荐使用, 是java的名称
${value} : 不推荐使用,存在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">
<!--
namespace:名称空间,一般需要保持全局唯一
Dao接口即Mapper接口。接口的全限名,就是映射文件中的namespace的值;
接口的方法名,就是映射文件中Mapper的Statement的id值;接口方法内的参数,就是传递给sql的参数
Mapper接口里的方法,是不能重载的,因为是使用 全限名+方法名 的保存和寻找策略。
Mapper 接口的工作原理是JDK动态代理
Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy
代理对象会拦截接口方法,转而执行MapperStatement所代表的sql,然后将sql执行结果返回
-->
<mapper namespace="net.jhclass.online_class.dao.VideoMapper">
<!--
statement sql
id:当前mapper下需要唯一
resultType:返回映射类型
-->
<select id="selectById" resultType="net.jhclass.online_class.domain.pojo.Video">
select * from video where id = #{video_id}
</select>
</mapper>
Step7:Main方法测试
import net.jhclass.online_class.dao.VideoMapper;
import net.jhclass.online_class.domain.pojo.Video;
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 SqlSessionDemo {
public static void main(String [] args) throws IOException {
//1.加载配置文件
String resouce = "config/mybatis-config.xml";
//拿到对应的流
InputStream inputStream = Resources.getResourceAsStream(resouce);
//2.构建构建SqlSessionFactory 通过SqlSessionFactoryBuilder,就是Builder模式 工厂设计模式
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//3.获取Session 使用JDK8的语法 需要修改编译器 SqlSession是需要关闭的 JDK8的语法自动关闭
try (SqlSession sqlSession = sqlSessionFactory.openSession()){
//4.通过反射拿到对应的Mapper文件
VideoMapper videoMapper = sqlSession.getMapper(VideoMapper.class);
//5.实体对象接收结果
Video video = videoMapper.selectById(44);
System.out.println(video.toString());
}
}
}
使用注解的方法编写Sql语句
写在dao层不会和mapper.xml文件有任何关系
如果没有多表关联,简单查询的话,可以使用注解的方式
public interface VideoMapper {
/**
* 根据视频id查找视频对象
* @param videoId
* @return
*/
Video selectById(@Param("video_id") int videoId);
@Select("select * from video")
List<Video> selectList();
}