我的JAVA-Web进阶--Mybatis
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 mapperPUBLIC "-//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 configurationPUBLIC "-//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 userssqlSessionFactory.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中需要join关键词
使用注解替代映射文件
增删改查注解
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;// 初始化资源@BeforeEachvoid 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);}// 编写单元测试@Testvoid testGetAllUsers() {List<User> users = userMapper.getAllUsers();assertNotNull(users, "用户列表不应为null");assertFalse(users.isEmpty(), "用户列表应包含数据");}@Testvoid testGetUserById() {User user = userMapper.getUserById(1L);assertNotNull(user, "根据ID获取的用户不应为null");assertEquals("expectedName", user.getName(), "用户名应符合预期");}// 清理资源@AfterEachvoid tearDown() {sqlSession.close();}
}