环境准备
- JDK1.8
- maven 3.x
- IDEA开发工具
新建maven工程
中间步骤自行设置
引入maven依赖包
MySQL驱动版本根据自己安装的MySQL选择
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
设置目录
在test目录下新建文件夹 resources,并标记文测试资源文件夹打开MySQL新建库
- 新建数据库命名为:mybatis
- 新建学生表:student
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键(学号)',
`last_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '名字',
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '电子邮箱',
`gender` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '性别',
`m_id` int(11) UNSIGNED NULL DEFAULT NULL COMMENT '专业id',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '学生表' ROW_FORMAT = Dynamic;
- 新建专业表:major
DROP TABLE IF EXISTS `major`;
CREATE TABLE `major` (
`id` int(11) NOT NULL COMMENT '自增主键',
`major_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '专业名称',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '专业表' ROW_FORMAT = Dynamic;
- student表中插入一条数据
INSERT INTO `student` VALUES (1, 'Tom', 'tom@163.com', '1', NULL);
创建对应实体类和Mapper接口
目录结构如下我把AppTest改成了MybatisTest,不该也无妨;
其中Student类暂时只设置四个字段:
public class Student {
private Integer id;
private String lastName;
private String email;
private String gender;
public Student() {
}
public Student(Integer id, String lastName, String email, String gender) {
this.id = id;
this.lastName = lastName;
this.email = email;
this.gender = gender;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Student [id=" + id + ", lastName=" + lastName + ", email="
+ email + ", gender=" + gender + "]";
}
mapper接口暂时为空
数据库配置文件
在resources目录下新建File命名为db.peoperties,配置如下内容:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&useSSL=false&characterEncoding=utf-8&serverTimezone=UTC
jdbc.username=root
jdbc.password=password
提示:以上配置适用于MySQL8.X版本,5.X版本按照如下配置:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=password
mybatis配置文件
- 在resources目录下新建XML文件:mybatis-config.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="db.properties"></properties>
<settings>
<!--设置识别驼峰命名法-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<package name="com.exmple.bean"/>
</typeAliases>
<environments default="dev_mysql">
<environment id="dev_mysql">
<transactionManager type="JDBC"/>
<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>
<!--<environment id="dev_oracle">-->
<!--<transactionManager type="JDBC" />-->
<!--<dataSource type="POOLED">-->
<!--<property name="driver" value="${orcl.driver}" />-->
<!--<property name="url" value="${orcl.url}" />-->
<!--<property name="username" value="${orcl.username}" />-->
<!--<property name="password" value="${orcl.password}" />-->
<!--</dataSource>-->
<!--</environment>-->
</environments>
<databaseIdProvider type="DB_VENDOR">
<!-- 为不同的数据库厂商起别名 -->
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>
<mappers>
<mapper resource="mybatis/mapper/StudentMapper.xml"/>
<!--<mapper resource="mybatis/mapper/MajorMapper.xml"/>-->
<!--<package name="com.exmple.dao"/>-->
</mappers>
</configuration>
properties标签
mybatis可以使用properties来引入外部properties配置文件的内容;
resource:引入类路径下的资源
url:引入网络路径或者磁盘路径下的资源settings标签
settings包含很多重要的设置项
setting:用来设置每一个设置项
name:设置项名
value:设置项取值typeAliases标签
typeAliases:别名处理器:可以为我们的java类型起别名
别名不区分大小写
1、<typeAlias>:为某个java类型起别名
type
:指定要起别名的类型全类名;默认别名就是类student
alias
:指定新的别名
例如: <typeAlias type="com.atguigu.mybatis.Student" alias="stu"/>
2、<package>:为某个包下的所有类批量起别名
name
:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名(类名小写),)
例如:<package name="com.exmple.bean"/>
3、批量起别名的情况下,使用@Alias注解为某个类型指定新的别名(标注在Java bean上)environments标签
环境,mybatis可以配置多种环境 ,default指定使用某种环境。可以达到快速切换环境。
environment:配置一个具体的环境信息;必须有两个标签;id代表当前环境的唯一标识
1、transactionManager:事务管理器;
type
事务管理类型:
JDBC(JdbcTransactionFactory);
MANAGED(ManagedTransactionFactory)
自定义事务管理器:实现TransactionFactory接口.type指定为全类名
2、dataSource:数据源;
type
:数据源类型;
UNPOOLED(UnpooledDataSourceFactory); POOLED(PooledDataSourceFactory);
JNDI(JndiDataSourceFactory)
自定义数据源:实现DataSourceFactory接口,type是全类名
-
databaseIdProvider标签
支持多数据库厂商的;
type="DB_VENDOR":VendorDatabaseIdProvider
作用就是得到数据库厂商的标识(驱动getDatabaseProductName()),mybatis就能根据数据库厂商标识来执行不同的sql;
MySQL,Oracle,SQL Server,postgreSQL,xxx -
mappers标签
将sql映射注册到全局配置中
<mapper>:注册一个sql映射文件
1、注册映射文件
resource:引用类路径下的sql映射文件
mybatis/StudentMapperpper.xml
url:引用网路路径或者磁盘路径下的sql映射文件
file:///var/mappers/AuthorMapper.xml
2、注册接口
class:引用(注册)接口,
① 有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下;
② 没有sql映射文件,所有的sql都是利用注解写在接口上;
推荐:
比较重要的,复杂的Dao接口我们来写sql映射文件
不重要,简单的Dao接口为了开发快速可以使用注解;
批量注册
需要在资源路径下(resources)建立和dao一样的文件目录来存放想xml映射文件,如:com.example.StudentMapperpper.xml
编写单元测试
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test01() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try {
// 获取接口的实现类对象
//会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
StudentMapper mapper = openSession.getMapper(StudentMapper.class);
Student student = mapper.getStuById(1);
System.out.println(student);
} finally {
openSession.close();
}
}
方法执行顺序
1、根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象 有数据源一些运行环境信息
2、sql映射文件;配置了每一个sql,以及sql的封装规则等。
3、将sql映射文件注册在全局配置文件中
4、写代码:
1)、根据全局配置文件得到SqlSessionFactory;
2)、使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查一个sqlSession就是代表和数据库的一次会话,用完关闭
3)、使用sql的唯一标志来告诉MyBatis执行哪个sql。sql都是保存在sql映射文件中的。接口式编程
1、每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例
2、SqlSession代表和数据库的一次会话;用完必须关闭;
注意
:SqlSession和connection一样她都是非线程安全。每次使用都应该去获取新的对象。
3、mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象。(将接口和xml进行绑定)
StudentMapper empMapper = sqlSession.getMapper(StudentMapper.class);
注意
:两个重要的配置文件:
mybatis的全局配置文件:包含数据库连接池信息,事务管理器信息等...系统运行环境信息
sql映射文件:保存了每一个sql语句的映射信息:将sql抽取出来。
编写mapper接口
StudentMapper
Student getStuById(Integer id);
编写mapper映射文件
在resources的mybatis目录下新建文件夹mapper,新建xml文件StudentMapper.xml
<?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.exmple.dao.StudentMapper">
<select id="getStuById" resultType="com.exmple.bean.Student">
select id,last_name lastName,email,gender from student where id = #{id}
</select>
</mapper>
namespace
:名称空间;指定为接口的全类名
id
:唯一标识
resultType
:返回值类型
#{id}
:从传递过来的参数中取出id值
resources目录(MajorMapper.xml暂时不用创建)如下: