前言
从今天开始,我们将开启SSM框架的学习,让我们先了解一下什么是MyBatis?
1.简介
-
持久层框架
-
几乎避免了所以JDBC代码和手动设置参数以及获取结果集
使用了ORM思想,实现了结果集的封装
-
ORM:object Relational Mapping 对象关系映射
把数据库表和实体类以及实体类的属性对应起来
让我们可以操作实体类就实现操作数据库表
2.Mybatis环境搭建
在用idea创建Maven的时候,要在pom.xml中导入依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
依赖可以在maven的仓库或者Mybatis的官网(https://mybatis.org/mybatis-3/zh/getting-started.html)里面找到。
注意:因为是使用JDBC连接MySQL数据库,所以这里还要导入一个MySQL的依赖,和JDBC连接MySQL一样的。
创建MyBatis项目的步骤:
- 创建maven工程,并导入坐标(默认已经创建了数据库和表)
- 创建mybatis的主配置文件mybatis-config.xml
- 创建数据库配置文件db.properties
- 创建实体类和Dao的接口
- 创建映射配置文件,UserMapper.xml
- 测试
这里还加了一个Junit的单元测试依赖,方便功能测试
<dependencies>
<!-- mybatis-->
<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>5.1.47</version>
</dependency>
<!-- Junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
在build中配置resources来防止我们资源导出失败问题
<!-- 在build中配置resources来防止我们资源导出失败问题-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
按如下目录创建包:
注意:
dao层是存放接口
pojo层是存放实体类
utils层是存放一些加载properties文件的和配置的工具类
test测试中的目录结构最好和dao的目录结构一致
创建数据库:
create database db5;
use db5;
create table user
(
`id` int primary key comment '编号',
`username` varchar(20) comment '用户名',
`password` varchar(20) comment '密码'
)engine=innodb default charset=utf8
insert into user(id,username,password) values(1,'admin','1234')
一、在resource目录下创建配置文件
1.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>
<properties resource="db.properties"/>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeAliases>
<package name="com.demo.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 绑定接口-->
<mappers>
<mapper class="com.demo.dao.UserMapper"/>
</mappers>
</configuration>
注意:
1.这个是加载数据库配置文件db.properties
<properties resource="db.properties"/>
2.这里面是标准的日志设置,和设置有关的放<settings></settings>
中
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
3.这个是包扫描下路径的别名(在后面UserMapper.xml中会用到)
<typeAliases>
<package name="com.demo.pojo"/>
</typeAliases>
顺序是这个,不要搞错了!!!
环境设置
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
这里我们也可以看到,Mybatis是在JDBC以及连接池的基础上进行封装处理,还记得我们前面简介中提到的“几乎避免了所以JDBC代码和手动设置参数以及获取结果集”
最重要的是<mappers></mappers>
<mappers>
<mapper class="com.demo.dao.UserMapper"/>
</mappers>
加载的Mapper就是这个路径
2.db.properties
这里就是对数据库的配置(数据库驱动、url、username、password)
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db5?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=123456
二、在idea刚刚创建的包下创建实体类和接口
1.pojo包下 创建user的实体类:
package com.demo.pojo;
/**
* @author: seh
* @date: 2020/10/25 9:04
* @version: 1.0
*/
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2.在dao层创建接口:UserMapper
(可以创建UserMapper.xml,也可以使用注解的方式)
dao层主要是放一些功能的接口(CURD)
package com.demo.dao;
import com.demo.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author: seh
* @date: 2020/10/25 9:06
* @version: 1.0
*/
public interface UserMapper {
// 创建一个查询方法
@Select("select * from user where id = #{id}")
List<User> queryUserById(@Param("id") int id);
}
注意:
@Select是用于查询
@Param(“id”)是参数名,和#{id}对应,基本数据类型中最好使用这个注解
返回值类型是一个List集合类型
3.创建MyBatisUtils的工具类
创建工具类的主要目的是通过调用工具类中的方法完成一些配置
package com.demo.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;
/**
* @author: seh
* @date: 2020/10/14 18:50
* @version: 1.0
*/
/*
* 工具类
*
* */
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
// 1.获取SqlSessionFactory对象
try {
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 语句。
* */
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession(true);//自动提交事务
}
}
这么配置的原因是,根据mybatis官网的配置要求,构建 SqlSessionFactory,SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder。
而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。 但也可以使用任意的输入流(InputStream)实例,比如用文件路径字符串或 file:// URL 构造的输入流。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。
最后得到如下的目录以及文件结构
环境搭建的注意事项:
- 在mybatis中它把持久层的操作接口名称和映射文件也叫Mapper
- 在idea中创建目录的时候,和包不一样,包是三级目录,目录是一级
- mybatis的映射文件位置必须和dao接口的包结构相同
三、创建测试类,进行测试
package com.demo.dao;
import com.demo.pojo.User;
import com.demo.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
/**
* @author: seh
* @date: 2020/10/25 9:13
* @version: 1.0
*/
public class TestCode {
@Test
public void TestQuery(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.queryUserById(1);
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
}
注意:
1.在使用完资源以后记得关闭:sqlSession.close();
2.getMapper方法是利用了反射的机制,对Mapper进行扫描
最后我们来看看日志打印的结果是什么
按照以上步骤,我们创建一个插入的方法
1.在UserMapper中申明一个方法:insertUser(Map map);
package com.demo.dao;
import com.demo.pojo.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
import java.util.Map;
/**
* @author: seh
* @date: 2020/10/25 9:06
* @version: 1.0
*/
public interface UserMapper {
// 创建一个查询方法
@Select("select * from user where id = #{id}")
List<User> queryUserById(@Param("id") int id);
//创建一个插入的方法
@Insert("insert into user(id,username,password) values(#{id},#{username},#{password})")
int insertUser(Map map);
}
这里参数使用的是Map类型,比较万能,推荐使用!
为什么方法返回的是int类型呢?
这就和JDBC有关了,回忆一下,在JDBC中我们的修改,删除和插入返回的值是不是都是int类型呢?
这里的返回值表示影响的行数
2.在测试类中创建一个测试方法
package com.demo.dao;
import com.demo.pojo.User;
import com.demo.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
/**
* @author: seh
* @date: 2020/10/25 9:13
* @version: 1.0
*/
public class TestCode {
@Test
public void TestQuery(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.queryUserById(1);
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
@Test
public void insertUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap map = new HashMap();
map.put("id",2);
map.put("username","user1");
map.put("password","1234");
mapper.insertUser(map);
sqlSession.close();
}
}
查看日志打印结果
查看数据库
我们确实已经插入成功了!!!
最后,我们再来创建一个查询全部用户的方法
1.在userMapper中,申明一个findAll()方法
@Select("select * from user")
List<User> findAll();
2.在TestCode测试类中,创建测试方法
@Test
public void findAll(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> list = mapper.findAll();
for (User user : list) {
System.out.println(user);
}
sqlSession.close();
}
3.查看日志打印的结果
本文描述了Mybatis的作用以及如何创建一个简单的MyBatis项目,在后续的文章中将介绍如何使用UserMapper.xml以及日志、缓存、MyBatis-Plus等内容,请持续关注!!!
获取本节内容的原码以及更多宝贵的编程资源,请关注:
求一键三连!!!QAQ