依赖引入
代码语言:javascript复制 <dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
首先引入MyBatis
依赖。
注:
MyBatis
底层是JDBC
驱动,所以我们仍然需要引入MySQL
连接驱动依赖。
创建配置
在resources
文件夹中创建mybatis-config.xml
文件
XML 配置文件中包含了对
MyBatis
系统的核心设置,包括获取数据库连接实例的数据源(DataSource
)以及决定事务作用域和控制方式的事务管理器(TransactionManager
)。
文件的配置内容官方给出了一个基本的内容:
代码语言:javascript复制 <?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>
<!-- 环境配置:事务管理器和数据源配置 -->
<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 resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
我们直接在对应的配置字段处,填写url
、password
、driver
等配置。
创建接口
MyBatis
中的mapper
接口相当于以前的Dao
,不过我们是不需要写实现类的。
我们先创建接口。
就和我们以前的Dao
接口一模一样。
但是我们的实现类就不需要了,我们用xml配置。
创建Mapper.xml
扩展
我们创建Dao
接口对应的Mapper时,我们可以在资源中创建一个和java
中路径一样的包。
当然,这不是必要的。
如果你是要这样创建一个包:
那在创建时就要注意,这个是创建文件夹(目录),不是包。
格式也不是.
。
创建之后,我们命名最好对应接口名,我这里接口是UserMapper
,mapper.xml
就叫UserMapper.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.janyork.mybatis.mapper.UserMapper">
</mapper>
在为编写语句时,默认的内容为以上内容。
namespace
是接口路径。
那此时,你想添加一条写入语句(SQL
),那可以使用insert
标签,如下:
<?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.janyork.mybatis.mapper.UserMapper">
<insert id="insertUser" parameterType="com.janyork.mybatis.pojo.User">
INSERT INTO user (name)
VALUES (#{name})
</insert>
</mapper>
代码语言:javascript复制注:
parameterType
路径为实体类路径。id为你调用时调用的方法名,对应Dao
接口方法名
/**
* 添加用户
* @return 行数
* @param name 用户name
*/
int insertUser(String name);
此时我的接口带了参数,那么我们就使用#
或者$
来插入。
${}是字符串替换,往往与#{}相混淆,而#{}是预编译处理命令。#{}多用于命令场景。
我们这就直接用#
了。
传输的参数叫name
,那么就直接获取name
,格式就是#{参数名}
。
使用Mybatis
代码语言:javascript复制 package com.janyork.mybatis.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 JanYork
* @date 2022/8/9 8:24
* @description MyBatis工具类
*/
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
* @return SqlSession对象
*/
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}
我们创建一个工具类,里面的类和方法官方文档都是提供的,也有说明。
然后我们创建一个测试类(我这里就直接单元测试了)。
结果就是写入了一个用户名———>Jan
注:我数据库user表就两个字段(
id
与name
)。
现在我们已经可以写入了,但是你有没有发现有的地方写起来很麻烦。
缩减包名
比如这里:
这么长,一两个还好,要是很多句岂不是麻烦死了...
我们可以这样:
在配置文件里面,创建typeAliases
标签,里面可以配置多个typeAlias
。
typeAlias
里面type
属性指向我们的用户实体类,alias
属性用于定义它的替代名字。
<typeAliases>
<typeAlias type="com.janyork.mybatis.pojo.User" alias="User"/>
</typeAliases>
现在这样是不是就简短多了。
删改查
我们刚刚试了写入,但是没试过改查,那是因为查有点不一样,修改删除还是差不多的。
删除:
代码语言:javascript复制 <delete id="deleteUser" parameterType="User">
DELETE FROM user WHERE id = #{id}
</delete>
看上面的图会发现,我这里多了个属性——>resultMap
<select id="selectUserByName" parameterType="User" resultMap="BaseResultMap">
SELECT * FROM user WHERE name = #{name}
</select>
<select id="selectAllUser" parameterType="User" resultMap="BaseResultMap">
SELECT * FROM user
</select>
那这个resultMap="BaseResultMap"
是什么呢??
他是一个对应SQL
与实体类字段的配置。
在这里,我们配置了一个字段——>resultMap
。
<resultMap id="BaseResultMap" type="com.janyork.mybatis.pojo.User">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="name" property="name" jdbcType="VARCHAR"/>
</resultMap>
resultMap
的id
命名自定义,type指向实体类。
id 属性:唯一标识,此 id 值用于 select 元素
resultMap
属性的引用。 type 属性:表示该resultMap
的映射结果类型。result
子节点:用于标识一些简单属性,其中 column 属性表示从数据库中查询的字段名或别名,property
属性则表示查询出来的字段对应的值赋给实体对象的哪个属性。
resultMap
中有多个子节点属性,不过常用的就id
与result
。
子节点说明:
- constructor - 用于注入结果到构造方法中
- id – 标识ID列
- result – 表示一般列
- association – 关联查询
- collection – 查询集合
- discriminator - 鉴别器:mybatis可以使用discriminator判断某列的值,然后根据某列的值改变封装行为
column
属性是数据库的字段名,property
是实体类的字段名,jdbcType
是数据库字段类型。
这样,配置好后就可以进行查改操作了。