一 环境准备
1.1创建项目,导入依赖
创建一个普通的maven项目即可,导入如下依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<!--使用lombok需要安装对应插件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<!--为了方便测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
lombok插件如图:
安装插件重启idea
1.2 创建pojo对象
@Data
public class User {
private Integer id;
private String userName;
private String realName;
private String password;
private Integer age;
private Integer dId;
}
1.3 添加配置文件
全局文件配置
<?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>
<settings>
<!-- 打印查询语句 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
<!-- 控制全局缓存(二级缓存),默认 true-->
<setting name="cacheEnabled" value="false"/>
<!-- 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。默认 false -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 当开启时,任何方法的调用都会加载该对象的所有属性。默认 false,可通过select标签的 fetchType来覆盖-->
<setting name="aggressiveLazyLoading" value="true"/>
<!-- Mybatis 创建具有延迟加载能力的对象所用到的代理工具,默认JAVASSIST -->
<!--<setting name="proxyFactory" value="CGLIB" />-->
<!-- STATEMENT级别的缓存,使一级缓存,只针对当前执行的这一statement有效 -->
<!--
<setting name="localCacheScope" value="STATEMENT"/>
-->
<setting name="localCacheScope" value="SESSION"/>
</settings>
<typeAliases>
<package name="com.mybatis.study.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/><!-- 单独使用时配置成MANAGED没有事务 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
关联的映射文件,通常来说一张表对应一个,我们会在这个里面配置我们增删改查的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">
<mapper namespace="com.mybatis.study.mapper.UserMapper">
<cache />
<resultMap id="BaseResultMap" type="user" >
<id property="id" column="id" jdbcType="INTEGER"/>
<!--property 里面的值是Java程序的pojo对应的属性 column是数据库对应的属性-->
<result property="userName" column="user_name" jdbcType="VARCHAR" />
<result property="realName" column="real_name" jdbcType="VARCHAR" />
<result property="password" column="password" jdbcType="VARCHAR"/>
<result property="age" column="age" jdbcType="INTEGER"/>
<result property="dId" column="d_id" jdbcType="INTEGER"/>
</resultMap>
<sql id="baseSQL">
id,user_name,real_name,password,age,d_id
</sql>
<select id="selectUserById" resultMap="BaseResultMap" statementType="PREPARED" parameterType="_int" >
select
id,
user_name ,
real_name ,
password,
age,
d_id
from t_user where id = #{id}
</select>
<!-- $只能用在自定义类型和map上 -->
<select id="selectUserByBean" parameterType="user" resultType="user" >
select * from t_user where user_name = '${userName}'
</select>
<select id="selectUserList" resultMap="BaseResultMap" >
select * from t_user
</select>
</mapper>
数据库的配置文件信息:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatisstudy?characterEncoding=utf-8&serverTimezone=UTC
jdbc.username=root
jdbc.password=root
二简单的应用
2.1 编程式的应用
@org.junit.Test
public void test01() throws Exception {
// 1: 获取配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 2:加载并解析配置文件并获取sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder()
.build(inputStream);
// 3: 根据sqlSessionFactory获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 4.通过SqlSession中提供的 API方法来操作数据库
List<User> users = sqlSession.selectList
("com.mybatis.study.mapper.UserMapper.selectUserList");
for (User user :
users) {
System.out.println(user);
}
// 5: 关闭会话
sqlSession.close();
}
这种方式其实就是通过SqlSession中给我们提供的相关的API方法来执行对应的CRUD操作,查找我们写的SQL语句是通过 namespace+“.”+id的方式实现的。
问题如下:
- Statement ID是硬编码,维护起来很不方便;
- 不能在编译时进行类型检查,如果namespace或者Statement ID输错了,只能在运行的时候报错。
推荐下面这种写法
2.2 代理方式
此时mapper的xml文件的namespace属性的值要与接口名字对应
public void test02() throws Exception {
// 1: 获取配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 2:加载并解析配置文件并获取sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder()
.build(inputStream);
// 3: 根据sqlSessionFactory获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 4.通过SqlSession获得UserMapper对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.selectUserList();
for (User user :
users) {
System.out.println(user);
}
// 5: 关闭会话
sqlSession.close();
}
三 mybatis的核心配置
mybatis有两个配置,全局配置和映射文件。
3.1 全局配置
configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
3.1.1 configuration
configuration是整个配置文件的根标签,实际上也对应着MyBatis里面最重要的配置类Configuration。它贯穿MyBatis执行流程的每一个环节。
可以看下dtd文件:
configuration里有子标签properties,settings等等,并且有排序的要求,即properties要在settings的前面,?表示只有一个这样标签
3.1.2 properties
第一个一级标签是properties,用来配置参数信息,比如最常见的数据库连接信息。为了避免直接把参数写死在xml配置文件中,我们可以把这些参数单独放在properties文件中,用properties标签引入进来,然后在xml配置文件中用${}引用就可以了。可以用resource引用应用里面的相对路径,也可以用url指定本地服务器或者网络的绝对路径。详细可以见上面的配置文件。
3.1.3 settings
此图片截取自mybatis官网,详细可见官网:https://mybatis.net.cn/configuration.html
还有很多标签在这里就不逐一解释了,官网上有,在这里写也没有必要,学习框架一定多看官网。