文章目录
1. MyBatis 简介
1.1 什么是 MyBatis
- MyBatis 是一款优秀的持久层框架。
- 它支持定制化 SQL、存储过程以及高级映射。
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
- MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
- MyBatis 本是 apache 的一个开源项目 iBatis , 2010年这个项目由 apache software foundation 迁移到了google code,并且改名为MyBatis 。
- 2013年11月迁移到Github。
GitHub地址:https://github.com/mybatis/mybatis-3
当前,最新版本是MyBatis 3.5.4 ,其发布时间是2020年2月4日。
官网地址:https://mybatis.org/mybatis-3/
其实,看完百度百科和官网,也不太理解, MyBatis 是在做什么;经过百度,发现有一位写的很不错:https://blog.csdn.net/qq_39159227/article/details/89036003
封装JDBC操作
利用反射打通Java类与SQL语句之间的相互转换
MyBatis的主要设计目的就是让我们对执行SQL语句时对输入输出的数据管理更加方便,所以方便地写出SQL和方便地获取SQL的执行结果才是MyBatis的核心竞争力。
1.2 如何安装 MyBatis
使用 Maven(本人版本:3.6.1)来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
1.3 MyBatis 的功能架构
Mybatis的功能架构分为三层:
-
API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
-
数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
-
基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
1.4 MyBatis 的优缺点
优点:
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
- 解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射 。
- 提供xml标签,支持编写动态sql。
缺点:
-
编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
-
SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
-
框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
2. 快速入门
先创建数据库:
CREATE DATABASE `mybatis`;
USE `mybatis`;
CREATE TABLE `user`(
`id` INT(20) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
`pwd` VARCHAR(30) DEFAULT NULL,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO `user`(`id`,`name`,`pwd`)
VALUES (1,'周丹','123456'),(2,'周颖','zxcvbn'),(3,'姜嘉航','123456');
2.1 引入依赖
在 Maven 仓库导入需要的 jar 包,将依赖文件写入 pom.xml
;
Maven 仓库地址:https://mvnrepository.com/
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2.2 核心配置文件
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>
<!--xml 中元素标签上下位置是由要求的-->
<!--将配置文件改为properties-->
<properties resource="db.properties"/>
<!--settings 大小写不能写错-->
<settings>
<!--
配置日志:切换为 log4j 时注意大小写问题
-->
<!--<setting name="logImpl" value="STDOUT_LOGGING"/>-->
<setting name="logImpl" value="LOG4J"/>
</settings>
<!--包的 别名配置-->
<typeAliases>
<package name="com.sudong.pojo"/>
<!--
每次都需要改 很麻烦,一次只能改一个
<typeAlias type="com.sudong.pojo.User" alias="user"/>
-->
</typeAliases>
<!--一个environments标签元素可以有多套配置 -->
<environments default="development">
<!--每一个environment代表一个具体的环境-->
<environment id="development">
<!--transactionManager 事务管理器,一般不需要改-->
<transactionManager type="JDBC"/>
<!--dataSource 数据源配置-->
<dataSource type="POOLED">
<!--连接数据库的配置-->
<!--配置了 properties 可以直接引用-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--
mapper:根标签,namespace:命名空间,随便写,一般保证命名空间唯一
mappers 绑定mapper配置文件
resource,mapper 资源对应的路径,
class,接口对应的路径(前提:User Mapper.xml 必须和UserMapper 接口在同一个包下)
-->
<!--
这个配置文件一定要注册到Mybatis的配置文件中
-->
<mappers>
<!--<mapper resource="com/sudong/mapper/UserMapper.xml"/>-->
<!--<mapper class="com/sudong/mapper/UserMapper"/>-->
<package name="com.sudong.mapper"/>
</mappers>
</configuration>
其中,db.properties
配置参数如下:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8
username=root
password=123456
2.3 编写工具类操作数据库
构建 sqlSessionFactory:
package com.sudong.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 {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 工厂模式
sqlSessionFactory = new
SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
// 获取sqlSession的连接
public static SqlSession getSession() {
return sqlSessionFactory.openSession();
}
}
2.4 配置实体类
引入 LomBok,通过简单注解来实现精简代码来达到消除冗长代码的目的。
package com.sudong.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private String password;
}
2.5 持久层接口
package com.sudong.mapper;
import com.sudong.pojo.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserMapper {
List<User> getUserList();
// 在 xml 获取 id
User selectById(int id);
// 多个参数操作,bi需要增加注解
User selectByUsernamePwd(@Param("username") String username, @Param("pwd")String pwd);
// 新增一个用户
int addUser(User user);
// 修改用户信息
int Updateuser(User user);
// 删除用户信息
int deleteUserById(int id);
}
2.6 使用配置文件编写 SQL
原来我们需要编写接口实现类,使用了Mybatis之后,我们可以专注编写SQL,使用配置文件;
注:
- 程序运行起来之后,依旧可以动态修改代码,解耦;
- namespace 绑定对应的接口;
<?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">
<!-- 原来我们都是编写具体的执行sql -->
<mapper namespace="com.sudong.mapper.UserMapper">
<select id="getUserList" resultType="User">
select * from user;
</select>
<select id="selectById" resultType="User">
select * from user where id = #{id};
</select>
<select id="selectByUsernamePwd" resultType="User">
select * from user where name = #{username} and pwd = #{pwd};
</select>
<insert id="addUser" parameterType="User">
insert into `user`(`id`,`name`,`pwd`) values (#{id},#{name},#{pwd});
</insert>
<update id="Updateuser" parameterType="User">
update `user` set `name` = #{name}, pwd = #{pwd} where id = #{id};
</update>
<delete id="deleteUserById" parameterType="int">
delete from user where id = #{id};
</delete>
</mapper>
2.7 测试
import com.sudong.mapper.UserMapper;
import com.sudong.pojo.User;
import com.sudong.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class test {
public static void main(String[] args) {
// 如何获取接口
// 1、 获取SqlSession, 执行sql使用的
SqlSession session = MyBatisUtils.getSession();
// 2、通过 session.getMapper(Class ) 获得接口
UserMapper mapper = session.getMapper(UserMapper.class);
/*
// 删除
int user = mapper.deleteUserById(3);
session.commit();
if(user > 0){
System.out.println("删除成功");
}
*/
/*
修改
int user = mapper.Updateuser(new User(4,"赵日天","123456"));
session.commit();
if(user > 0){
System.out.println("修改成功");
}
*/
/*
// 增加
int user = mapper.addUser(new User(4,"叶良辰","123456"));
session.commit();
if(user > 0){
System.out.println("添加成功");
}
*/
/*
//查找:通过id
User user = mapper.selectById(1);
System.out.println(user);
*/
/*
//查找:通过name和pwd
User user = mapper.selectByUsernamePwd("周丹","123456");
System.out.println(user);
*/
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
}
}
2.8 目录结构
2.8 MyBatis 使用总结
-
引入需要的依赖;
-
配置 mybatis-config.xml 全局的配置文件;(数据源和mapper特别要注意)
-
创建 SqlSessionFactory,并通过其创建 SqlSession 对象;(MyBatisUtils)
-
配置 SqlSession 来操作数据库(CRUD);
- 创建 UserMapper 接口;
- 编写对应的 UserMapper.xml ;
1、多个参数一定要增加 @Param 注解
2、增删改一定要增加事务提交
3、增删改,标签一定要对应,参数类型必须要写
4、增删改不用写返回值,查询,必须写返回值,集合、泛型中的内容(具体的对象)
-
测试(调用 commit() 提交事务);