依赖引入
<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
)。
文件的配置内容官方给出了一个基本的内容:
<?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>
注:
parameterType
路径为实体类路径。id为你调用时调用的方法名,对应Dao
接口方法名
/** * 添加用户 * @return 行数 * @param name 用户name */ int insertUser(String name);
此时我的接口带了参数,那么我们就使用#
或者$
来插入。
${}是字符串替换,往往与#{}相混淆,而#{}是预编译处理命令。#{}多用于命令场景。
我们这就直接用#
了。
传输的参数叫name
,那么就直接获取name
,格式就是#{参数名}
。
使用Mybatis
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>
现在这样是不是就简短多了。
删改查
我们刚刚试了写入,但是没试过改查,那是因为查有点不一样,修改删除还是差不多的。
删除:
<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
是数据库字段类型。
这样,配置好后就可以进行查改操作了。
大致结构