1.Mybatis概念
2.Mybatis的简单使用
1. 引入相关依赖
首先,在你的项目中引入 MyBatis 的依赖。如果你使用的是 Maven 构建工具,那么可以在 pom.xml
文件中添加如下依赖:
<dependencies>
<!-- MyBatis core library -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<!-- MyBatis-Spring integration (if using Spring) -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
<!-- Database driver, for example MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>
2. 编写实体类
创建一个与数据库表对应的实体类。例如,有一个名为 User
的表,你可以创建一个 User
类。
public class User {
private Long id;
private String name;
private String email;
// Getters and Setters
}
3. 编写接口
定义一个 Mapper 接口来描述 SQL 操作。MyBatis 会根据接口方法名和参数自动生成 SQL 语句(如果配置了 XML 映射文件,则按照映射文件执行)。
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserMapper {
List<User> getAllUsers();
User getUserById(Long id);
int insertUser(User user);
int updateUser(User user);
int deleteUser(Long id);
}
4. 编写映射文件
为每个 Mapper 接口创建一个 XML 映射文件,该文件包含 SQL 语句。文件名应与接口名相同,并且放在相同的包下或指定路径下。
<?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.example.mapper.UserMapper">
# parameterType是传入的参数类型,resultType是返回的结果类型
<select id="getAllUsers" resultType="com.example.model.User">
SELECT * FROM users
</select>
<select id="getUserById" parameterType="long" resultType="com.example.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>
<update id="updateUser" parameterType="com.example.model.User">
UPDATE users SET name=#{name}, email=#{email} WHERE id=#{id}
</update>
<delete id="deleteUser" parameterType="long">
DELETE FROM users WHERE id=#{id}
</delete>
</mapper>
5. 编写核心文件
创建 MyBatis 的全局配置文件 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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
6. 代码使用
最后,在应用程序中使用 MyBatis。以下是一个简单的例子,展示了如何获取 SqlSessionFactory
并执行查询。
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;
import java.util.List;
public class MyBatisExample {
public static void main(String[] args) throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.getAllUsers();
// Process the list of users
sqlSessionFactory.close();
}
}
7.增删改查的接口以及映射文件的代码
// UserMapper.java - 这是MyBatis的Mapper接口
package com.example.mapper;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface UserMapper {
// 插入新用户
// 在映射文件中对应的SQL语句:
// <insert id="insertUser" parameterType="com.example.model.User">
// INSERT INTO users (username, password, email)
// VALUES (#{username}, #{password}, #{email})
// </insert>
@Insert("INSERT INTO users (username, password, email) VALUES (#{username}, #{password}, #{email})")
@Options(useGeneratedKeys = true, keyProperty = "id") // 使用自动生成的主键
void insertUser(User user);
// 根据ID删除用户
// <delete id="deleteUserById" parameterType="int">
// DELETE FROM users WHERE id = #{id}
// </delete>
@Delete("DELETE FROM users WHERE id = #{id}")
void deleteUserById(int id);
// 更新用户信息
// <update id="updateUser" parameterType="com.example.model.User">
// UPDATE users SET username = #{username}, password = #{password}, email = #{email} WHERE id = #{id}
// </update>
@Update("UPDATE users SET username = #{username}, password = #{password}, email = #{email} WHERE id = #{id}")
void updateUser(User user);
// 根据ID查询用户
// <select id="getUserById" parameterType="int" resultType="com.example.model.User">
// SELECT * FROM users WHERE id = #{id}
// </select>
@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(int id);
// 查询所有用户
// <select id="getAllUsers" resultType="com.example.model.User">
// SELECT * FROM users
// </select>
@Select("SELECT * FROM users")
List<User> getAllUsers();
}
注意
3.Mybatis的进阶操作
resultType别名配置
核心文件的数据库配置
参数传递
使用如下方法后,便可以不用写ParamterType了,直接写变量
直接传递(不推荐)
注解传递
使用Map传递
返回参数的对象赋值
理解:当resultType是对象的时候,为了应对数据库查询到的数据列名与类的属性名字的不对应,需要使用resultMap标签
动态SQL
理解:根据输入的参数不同,动态设置SQL语句
动态SQL-if
动态SQL-where
动态SQL-set
动态SQL-choose(相当于switch)
动态SQL-foreach
多表查询
理解:即通过SQL的多表查询,查询到不同的对象
一对一
一对多
增删改查注解
package com.example.mapper;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface UserMapper {
@Insert("INSERT INTO users (username, password, email) VALUES (#{username}, #{password}, #{email})")
@Options(useGeneratedKeys = true, keyProperty = "id")
void insertUser(User user);
@Delete("DELETE FROM users WHERE id = #{id}")
void deleteUserById(int id);
@Update("UPDATE users SET username = #{username}, password = #{password}, email = #{email} WHERE id = #{id}")
void updateUser(User user);
@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(int id);
@Select("SELECT * FROM users")
List<User> getAllUsers();
}
返回参数的对象赋值注解
一对一注解
一对多注解
延迟加载
当一对多和多对多查询的时候,相当于执行了多条SQL,当我想只执行多条SQL中一句SQL的时候
缓存
一级缓存
二级缓存
二级缓存是使用session重新获取mapper对象,开启需要额外添加信息
Junit测试框架
4.Junit的简单使用
引入依赖
编写测试类
编写顺序:@BeforeEach,@Test,@AfterEach
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
private SqlSession sqlSession;
private UserMapper userMapper;
// 初始化资源
@BeforeEach
void setUp() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
userMapper = sqlSession.getMapper(UserMapper.class);
}
// 编写单元测试
@Test
void testGetAllUsers() {
List<User> users = userMapper.getAllUsers();
assertNotNull(users, "用户列表不应为null");
assertFalse(users.isEmpty(), "用户列表应包含数据");
}
@Test
void testGetUserById() {
User user = userMapper.getUserById(1L);
assertNotNull(user, "根据ID获取的用户不应为null");
assertEquals("expectedName", user.getName(), "用户名应符合预期");
}
// 清理资源
@AfterEach
void tearDown() {
sqlSession.close();
}
}