为什么用Mybatis
是一款优秀的持久层框架,可以来帮助我们避免之前写jdbc时sql语句与代码混在一起而且写的东西太麻烦太多了,以后可以让Mybatis来帮我们写,今后我们的sql语句将写在xml文件里
Mybatis原来是apache的开源项目ibatis,所以好多包是在ibatis下的,然后迁到谷歌,再然后迁到了github,所以现在下mybits要去github上下
可以在github上搜mybatis后看到它是一个开源项目,而且commit很高,Mybatis生态活跃度比较好而且是一直在更新的
什么是持久化:
把数据给持久化,怎么把数据持久化?那就是放进数据库里
持久化:
那就是把程序的数据在持久状态和瞬时状态转换的过程
内存的特性:断电即失
如何持久化:
数据库(JDBC),io文件持久化(io特别浪费资源,所以诞生了数据库)
为什么要持久化:
有些对象不能丢
内存太贵了
持久层:
持久层是完成持久化工作的代码块
层是界限十分明显的
搭建第一个Mybatis项目
Mybatis的帮助文档:添加链接描述
第一步,搭建环境
一、搭建数据库
二、新建项目
1.新建一个普通的maven项目
2.在resource下创建一个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>
<!-- 环境们,里面可以写不止一个环境,它deafult默认了id=development的这个环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 数据库驱动-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- 数据库url,这里面后面写的&要yong&来转义,这里我没写,记得3306/后面写的是自己的数据库的名&-->
<!-- 写个示例<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/kuang/dao/UserMapper.xml"/>
</mappers>
</configuration>
记得最好要把中文注释删了
第二步,配pom.xml文件
找到pom.xml文件
在里面加上依赖项
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
<!--在build中配置resources,来防止我们资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
如果发现里面的项爆红了,可能是没下载进去,点击最右边竖着的Maven
然后按第一个那个reimport,让它下载一下,如果重新下载了也没下载成功就在那个版本号上面删掉重新输,一段一段的输看有没有提示项,有的话就直接用,说明这里面有
第三步,建立一个工具类
依然是在帮助文档中,入门的那个里面,找到下面这段
然后复制进自己的代码里写成工具类,用一个包来保存自己的工具类
工具类代码:
package com.kuang.util;
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 sqlSessionFactory;
static {
try{
//这三句是死的,所以拿来封装成工具类,获取sqlSessionFactory对象
//它可以执行数据库的所有方法
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}catch (IOException e){
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
一些问题:
如果发现这里面Resources,sqlSessionFactory,getResourceAsStream,qlSessionFactoryBuilder什么的爆红而且不能import class,说明你没引进那个ibatis库,也就是你那个依赖项没写对,检查下是否还是在爆红,
如果它运行了说你字符什么的有问题,检查下xml文件里是否有中文注释
这段代码的意思是
用流读取,
用SqlSessionBulider生成SqlSessionFactory后用SqlSessionFactory生成SqlSession
这三个之间的关系是
SqlSessionBulder一旦创建完SqlSessionFactory,他就没用了
sqlSessionFactory在创建后只要不关闭就会一直存在
然后再通过sqlSessionFactory创建sqlSession
sqlSession不是线程安全的
每次收到一个HTTP请求,就可以打开一个SqlSession,然后返回一个响应之后要记得把它关掉
记得关掉记得关掉
第四步,写实现接口的类
可以把它理解成我们之前写的Daoimpl类,是拿来实现接口的
<?xml version="1.0"encoding="UTF-8" ?>
<!DOCTYPEmapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--绑定一个对应的DAO/Mapper接口-->
<!--然后绑定起来-->
<mapper namespace="com.kuang.dao.UserDao">
<!-- 这里的id相当于之前的方法名-->
<!-- resultType:返回的类型,写路径写要返回的pojo的类型的路径-->
<select id="getUserList" resultType="com.kuang.pojo.User">
select * from mybatis.user
</select>
</mapper>
这里的 namespace="com.kuang.dao.UserMapper"指的是要实现哪个接口,这里是这个接口的完整路径,然后绑定起来
select变迁里写sql语句,那个id可以理解成是今后调用这个接口时它要去实现的函数
maven默认资源文件配置应该放到src下,现在在java下,所以现在应该手动配置资源过滤
所以加这段进pom.xml,之前写第一步复制的时候复制进去了
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
要在resource下的xml里加上mapper的地址,就是那个实现了接口,里面有sql语句的那段,不然会报错找不到resource
<mappers>
<mapper resource="com/kuang/dao/UserMapper.xml"/>
</mappers>
要在这里target里面能看到自己的xml
当然有也不一定就一定对,一点一点改路径吧
第五步,写Test
test里的最好要和上面src的项目结构相同,然后进行测试
测试的代码
package com.kuang.dao;
import com.alibaba.fastjson.JSON;
import com.kuang.pojo.User;
import com.kuang.util.MybatisUtils;
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;
import java.util.List;
public class UserDaoTest {
@Test
public void test() throws IOException {
SqlSession sqlSession=null;
try {
sqlSession= MybatisUtils.getSqlSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
List<User> userList= userMapper.getUserList();
for(User user:userList){
System.out.println(JSON.toJSONString(user));
}
}catch (Exception e){
e.printStackTrace();
}finally {
sqlSession.close();
}
}
}