什么是mybatis?
- mybatis是一个优秀的持久层框架,它对jdbc操作数据库的过程进行了封装。
-mybatis也是一个ORM的半自动化框架,是开发者注重sql语句。
创建mybatis项目:
1. 创建maven项目:
点击file--》new--》project
点击maven--》project sdk--》选择自己的jdk
然后点击next,下一步
点击finish完成。
2.在Maven的pom文件中引入MyBatis需要用的jar包
<?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.demo</groupId>
<artifactId>Mybaties-demo</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>mybatis-01</module>
</modules>
<!--导入依赖-->
<dependencies>
<!--mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!---mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--junit测试依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<resources>
<!-- mapper.xml文件在java目录下 -->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<!-- mapper.xml文件在resources目录下-->
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<pluginManagement>
<plugins>
<!--编译指定指定文件编码格式-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
3.创建表语句:
create database `mybatis`;//创建数据库
use `mybatis;//连接数据库
create table `user`(//创建表
`id` INT(20) not null primary key,
`name` varchar(30) default null,
`psw` varchar(30) default null
)engine = innodb default charset = utf8;
//插入sql语句
insert into `user`(`id`,`name`,`psw`) values
(1,'李勤珍','123456'),
(2,'张三','123456'),
(3,'李四','233556')
4.在resources下面创建Mybatis的核心配置文件:mybatis-config.xml
<?xml version="1.0" encoding="UTF8"?>
<!DOCTYPE configuration PUBLIC
"-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration核心配置文件-->
<configuration>
//环境配置,可以配置多套环境,不过只能使用一套
<environments default="development">
//id:环境标识
<environment id="development">
//transactionManager:事物管理器,负责提交和回滚
<transactionManager type="JDBC"></transactionManager>
//数据源配置,连接数据库
<dataSource type="POOLED">//数据库连接池
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&CharacterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--每一个Mapper.xml都需要在Mybatis的核心配置文件中注册-->
<mappers>
<mapper resource="dao\UserMapper.xml"></mapper>
</mappers>
</configuration>
5.在bean(pojo)包中中创建数据库的表的实体类
package bean;
public class User {
private Integer id;
private String name;
private String psw;
public User() {
}
public User(Integer id, String name, String psw) {
this.id = id;
this.name = name;
this.psw = psw;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPsw() {
return psw;
}
public void setPsw(String psw) {
this.psw = psw;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", psw='" + psw + '\'' +
'}';
}
}
6.在dao文件夹下面创建操作实体类的接口:UserDao
package dao;
import pojo.User;
import java.util.List;
//操作实体类
public interface UserDao {
List<User> getUserList();
}
7.创建实现接口的xml文件:userDao.xml
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace=绑定一个对应的Dao/Mapper接口-->
<mapper namespace="dao.UserDao">
<!--id对应Dao接口中的方法名-->
<select id="getUserList" resultType="pojo.User">
select * from mybatis.user
</select>
</mapper>
8.在utils文件夹下面创建实际操作数据库的代码:
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.IOException;
import java.io.InputStream;
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//使用mybatis第一步:获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
/*
既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession
实例来直接执行已映射的 SQL 语句
*/
}
//使用mybatis第二步:获取SqlSession对象
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
9.在test文件夹下面创建测试类,进行测试;
package dao;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import pojo.User;
import utils.MybatisUtils;
import java.util.List;
public class UserDaoTest {
@Test
public void test(){
//第一步:获取sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//方式一:getMapper
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> userList = userDao.getUserList();
//遍历userList
for (User user : userList) {
System.out.println(user);
System.out.println(user.getName());
}
//关闭sqlSession
sqlSession.close();
}
}
mybatis的配置文件:
1、给返回类型起别名
1.核心配置文件:mybatis-config.xml下配置 <!--给扫描实体类,类型起别名--> <typeAliases> //只给一个类其别名 <!-- <typeAlias type="com.demo.bean.Student" alias="Student"/>--> //给这个包下,全部实体类其别名 <package name="com.demo.bean"/> </typeAliases>
2.使用注解给实体类起别名
@Alias("student")//自定义起别名 public class Student { private int id; private String name; private String sex; private String birthday; public Student() { }
2、扫描映射器
1、<!--Mapper.xml需要在mybatis核心配置文件中注册--> <mappers> <mapper resource="com/demo/dao/StudentDao.xml"/> </mappers>
推荐:因为这个无需接口和xml文件名一致。
2、使用扫描接口类注入绑定
<mappers>
<mapper class="com.demo.dao.StudentMapper"/>
</mappers>
注意:dao的接口类名必须和xml文件名一致。
dao的接口类和xml文件必须在同一个包下。
3、使用扫描包注入绑定
<mappers>
<package name="com.demo.dao"/>
</mappers>
注意:dao的接口类名必须和xml文件名一致。
dao的接口类和xml文件必须在同一个包下。
生命周期和作用域:
SqlSessionFactory:
创建一个SqlSssionFactory工厂对象,相当于一个数据库连接池。
SqlSessionFactory一旦创建应该在运行期间存在,不能重新创建其他实例,因此它的作用域最简单的使用单例模式。
SqlSession:
- 连接到连接池的一个请求。
-SqlSession的实例不是线程安全的,因此不能被共享,所以它的最佳作用域是一个请求时,或者方法内。
-用完后需要及时关闭连接,否则资源会被占用。
日志工厂配置使用:
- SLF4J
- LOG4J 【掌握】
- LOG4J2
- JDK_LOGGING
- COMMONS_LOGGING
- STDOUT_LOGGING 【掌握】
- NO_LOGGING
STDOUT_LOGGING日志:
在mybatis核心配置文件中配置,STDOUT_LOGGING配置实例:
<!--工厂日志-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
注意:要注意核心配置文件标签的顺序,名字不要写错,注意空格问题。
LOG4J日志:
什么是log4j?
通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
1.导入log4j依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2、在 resource目录下新建文件Log4j.properties
#将等级为DEBuG的日志信息输出到console和fiLe这两个目的地,console和fiLe的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target =System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout =org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p][ %d{yyyy-MM-dd HH:mm:ss,SSS}] - %-4r [%t] %C:%L %x - %m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/mybatis.log
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=3
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%-5p][ %d{yyyy-MM-dd HH:mm:ss}] - %-4r [%t] %C:%L %x - %m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sq1.Statement=DEBUG
log4j.logger.java.sq1.ResultSet=DEBUG
log4j.logger.java.sq1.PreparedStatement=DEBUG
3、在Mybatis配置文件中设置日志为log4j
<settings>
<setting name="logImpl" value="log4j"/>
</settings>
4、运行调试
log4j简单使用:
1.在要使用Log4j的类中,导入:import org.apache.log4j.Logger;
2.日志对象,参数为当前类的class
public class StudentLog4jTest {
static Logger logger = Logger.getLogger(StudentLog4jTest.class);
}
3.在需要打印日志的地方进行调用,如下图
RowBounds实现分页:
RowBounds:导入,import org.apache.ibatis.session.RowBounds;
其他接口类,xml照常写;
sql语句:
PageHelper分页插件:
第一步,引入分页插件依赖:
<!-- 引入mybatis的 pagehelper 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
- 第二步:在mybatis的全局配置文件中配置PageHelper分页插件
-
<configuration> <!-- 引入 pageHelper插件 --> <!--注意这里要写成PageInterceptor, 5.0之前的版本都是写PageHelper, 5.0之后要换成PageInterceptor--> <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!--reasonable:分页合理化参数,默认值为false,直接根据参数进行查询。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。--> <!--<property name="reasonable" value="true"/>--> </plugin> </plugins> </configuration>
Lombok插件:
第一步:idea安装lombok插件!
第二步:导入lombok依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
<scope>provided</scope>
</dependency>
第三步:在实体类上添加注解
//get,set方法,equals,hashcode,toString方法等
@Data
//有参构造
@AllArgsConstructor
//无参构造
@NoArgsConstructor
public class User {
private int id;
private String name;
private String sex;
}
一对多和多对一查询:
JavaType和ofType的区别?
JavaType和ofType都是用来指定对象类型的,但是JavaType是用来指定pojo中属性的类型,而ofType指定的是 映射到list集合属性中pojo的类型 。
association标签:用于处理对象的,属性的对象
collection标签::用于处理集合
一级缓存和二级缓存的区别:
1.一级缓存默认开启的,SqlSession级别,也称为本地缓存。
缓存失效的情况:
-查询不同的数据(意思就是查询了其他生气了语句)。
-使用了增删改生气了语句,可能改变原来的数据,必定刷新缓存!
-使用了不同Mapper.xml。
-使用了清除一级缓存(sqlSession.clearCache())。
注意:一级缓存默认开启,一级缓存只在SqlSession中有效,也就是拿到连接到关闭连接这个区间段。
2.二级缓存需要手动开启的,它是基于namespace级别的缓存,也叫全局缓存。
步骤:
1.开启二级缓存
<!--在当前 Mapper.xml文件开启二级缓存-->
<cache/>
2.在 mybatis-config.xml 的配置文件中进行显示配置,开启二级缓存(全局缓存)
<settings>
<!--显示的开启全局缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
3.注意:我们在使用缓存的时候要记得序列化实体类,否则会抛出实体类未序列化异常
需要将实体类序列化:
4.总结:
- 二级缓存是基于namespace级别的,在同一个Mapper下有效。
- 所有的数据都会先放在一级缓存中。
- 只有当会话提交或关闭时,才会提交到二级缓存中。
5.缓存查询顺序:
1.先查二级缓存,二级缓存有数据就返回。
2.二级缓存没有查询一级缓存,一级缓存有数据也返回。
3.一级和二级缓存都没有,查询数据库。