Mybatis持久层框架学习入门指南
2024/11/7 6:03:31
本文主要是介绍Mybatis持久层框架学习入门指南,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Mybatis持久层框架学习入门介绍了Mybatis的基本概念和环境搭建,包括下载和引入Mybatis,配置数据库连接和核心设置。文章还详细讲解了Mybatis的核心概念、配置文件、SQL语句执行以及高级特性,帮助读者全面掌握Mybatis的使用方法。
Mybatis是什么
MyBatis 是一个优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以通过 XML 配置文件或注解来配置 SQL 映射文件。MyBatis 从接口中知道要找的 SQL 语句,从结果集中取出符合类型的结果集对象,映射它们,返回给调用者。
Mybatis的优点
- 灵活的 SQL 映射:MyBatis 可以使用简单的 XML 或注解进行配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射到数据库中的记录。
- 减少代码量:MyBatis 使用 SQL 语句直接操作数据库,减少了繁琐的 JDBC 代码,使得开发效率大大提高。
- 强大的动态 SQL:MyBatis 提供了丰富的动态 SQL 特性,可以轻松实现复杂的查询逻辑。
- 支持数据库连接池:MyBatis 可以与数据库连接池技术(如 C3P0、DBCP)无缝集成,提高数据库连接的使用效率。
- 支持插件开发:MyBatis 提供了插件机制,可以方便地进行数据库操作的扩展和定制。
开发环境搭建
下载并引入 Mybatis
首先,需要下载 MyBatis 的 jar 包。可以通过 Maven 或手动下载 jar 包进行引入。
通过 Maven 引入 Mybatis
在项目的 pom.xml
文件中添加以下依赖:
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.22</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.7.0</version> </dependency> </dependencies>
手动下载 jar 包
手动下载 MyBatis 和数据库驱动的 jar 包,并将其添加到项目的类路径中。
配置数据库和 Mybatis
在项目中创建一个配置文件 mybatis-config.xml
,用于配置 MyBatis 的核心设置。
<?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/mytest"/> <property name="username" value="root"/> <property name="password" value="password"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> </mappers> </configuration>
创建 Java 工程示例
创建一个简单的 Java 工程来演示 Mybatis 的基本用法。
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.InputStream; public class MyBatisExample { public static void main(String[] args) throws Exception { // 读取配置文件 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 创建 SqlSession try (SqlSession session = sqlSessionFactory.openSession()) { // 获取用户映射器 UserMapper mapper = session.getMapper(UserMapper.class); // 查询用户 User user = mapper.selectUserById(1); System.out.println(user.getName()); // 更新用户信息 User userToUpdate = new User(); userToUpdate.setId(1); userToUpdate.setName("UpdatedName"); userToUpdate.setPassword("NewPassword"); session.update("com.example.mapper.UserMapper.updateUser", userToUpdate); session.commit(); } } }
核心接口与类
SqlSessionFactory
SqlSessionFactory
是 MyBatis 中最核心的接口之一,它是线程不安全的。SqlSessionFactory
的实例通常由 SqlSessionFactoryBuilder
创建,它是一个线程安全的类,用于创建 SqlSessionFactory
的实例。
import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; public class SqlSessionFactoryExample { public static void main(String[] args) throws Exception { // 读取配置文件 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } }
SqlSession
SqlSession
是 MyBatis 中另一个非常重要的接口,它是一个线程不安全的接口,提供了执行 SQL 语句的手段,可以用来执行存储过程调用和查询,同时也可以用于管理事务。
import org.apache.ibatis.session.SqlSession; public class SqlSessionExample { public static void main(String[] args) throws Exception { // 创建 SqlSession SqlSessionFactory sqlSessionFactory = SqlSessionFactoryExample.main(args); try (SqlSession session = sqlSessionFactory.openSession()) { // 执行 SQL 语句 UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.selectUserById(1); System.out.println(user.getName()); } } }
配置文件详解
mybatis-config.xml
mybatis-config.xml
是 MyBatis 的主配置文件,用于配置数据库连接、映射文件、类型处理器等。
<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/mytest"/> <property name="username" value="root"/> <property name="password" value="password"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> </mappers> </configuration>
typeAliases
typeAliases
元素用于为 Java 类指定一个简短的别名,以便在配置文件中使用。
<typeAliases> <typeAlias alias="User" type="com.example.model.User"/> </typeAliases>
mappers
mappers
元素用于指定全部映射文件的位置,可以使用 mapper
子元素来指定单个文件的位置。
<mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> </mappers>
SQL语句的执行
MyBatis 通过执行 SQL 语句与数据库进行交互。主要有 SELECT、INSERT、UPDATE、DELETE 四种基本操作。
SELECT
<select id="selectUserById" resultType="User"> SELECT id, name, password FROM users WHERE id = #{id} </select>
INSERT
<insert id="insertUser" parameterType="User"> INSERT INTO users (id, name, password) VALUES (#{id}, #{name}, #{password}) </insert>
UPDATE
<update id="updateUser" parameterType="User"> UPDATE users SET name = #{name}, password = #{password} WHERE id = #{id} </update>
DELETE
<delete id="deleteUserById" parameterType="int"> DELETE FROM users WHERE id = #{id} </delete>
使用Mapper接口
MyBatis 的 Mapper 接口简化了数据库操作,将 SQL 语句映射到 Java 接口的方法上。
public interface UserMapper { User selectUserById(int id); void insertUser(User user); void updateUser(User user); void deleteUserById(int id); }
参数与结果映射
MyBatis 支持多种参数类型,如基本类型、复杂对象、List 和 Map 等。
基本类型参数
<select id="selectUserById" resultType="User"> SELECT id, name, password FROM users WHERE id = #{id} </select>
对象类型参数
<insert id="insertUser" parameterType="User"> INSERT INTO users (id, name, password) VALUES (#{id}, #{name}, #{password}) </insert>
List 参数
<insert id="insertUsers" parameterType="List"> INSERT INTO users (id, name, password) VALUES <foreach item="item" index="index" collection="list" separator=","> (#{item.id}, #{item.name}, #{item.password}) </foreach> </insert>
结果集映射
MyBatis 支持多种结果集映射方式,包括一对一、一对多、多对多等复杂映射关系。
一对一映射
一对一映射通常用于关联表的数据映射。例如,用户表和用户详细信息表可以一对一关联。
<select id="selectUserWithDetails" resultType="UserWithDetails"> SELECT u.id, u.name, u.password, d.detail, d.remark FROM users u LEFT JOIN user_details d ON u.id = d.user_id WHERE u.id = #{userId} </select>
一对多映射
一对多映射通常用于关联多个子表的数据映射。例如,用户表和用户订单表可以一对多关联。
<resultMap id="userResultMap" type="User"> <id column="id" property="id"/> <result column="name" property="name"/> <collection property="orders" ofType="Order"> <id column="order_id" property="id"/> <result column="product_name" property="name"/> </collection> </resultMap> <select id="selectUserWithOrders" resultMap="userResultMap"> SELECT u.id, u.name, o.order_id, o.product_name FROM users u LEFT JOIN orders o ON u.id = o.user_id WHERE u.id = #{userId} </select>
动态SQL
动态SQL 可以让 SQL 语句更加灵活,以适应不同的查询场景。
if 标签
if
标签用于条件判断,只有条件满足时才会执行 SQL 语句。
<select id="selectUserByCondition" resultType="User"> SELECT id, name, password FROM users WHERE 1=1 <if test="id != null"> AND id = #{id} </if> <if test="name != null"> AND name = #{name} </if> </select>
choose 标签
choose
标签用于选择性执行条件语句,类似于 SQL 中的 CASE
语句。
<select id="selectUserByCondition" resultType="User"> SELECT id, name, password FROM users WHERE 1=1 <choose> <when test="id != null"> AND id = #{id} </when> <when test="name != null"> AND name = #{name} </when> <otherwise> AND password = #{password} </otherwise> </choose> </select>
foreach 标签
foreach
标签用于循环操作,常用于处理 IN 语句。
<select id="selectUsersByIds" resultType="User"> SELECT id, name, password FROM users WHERE id IN <foreach item="item" index="index" collection="ids" open="(" separator="," close=")"> #{item} </foreach> </select>
SQL语句的执行
MyBatis 通过执行 SQL 语句与数据库进行交互。主要有 SELECT、INSERT、UPDATE、DELETE 四种基本操作。
SELECT
<select id="selectUserById" resultType="User"> SELECT id, name, password FROM users WHERE id = #{id} </select>
INSERT
<insert id="insertUser" parameterType="User"> INSERT INTO users (id, name, password) VALUES (#{id}, #{name}, #{password}) </insert>
UPDATE
<update id="updateUser" parameterType="User"> UPDATE users SET name = #{name}, password = #{password} WHERE id = #{id} </update>
DELETE
<delete id="deleteUserById" parameterType="int"> DELETE FROM users WHERE id = #{id} </delete>
使用Mapper接口
MyBatis 的 Mapper 接口简化了数据库操作,将 SQL 语句映射到 Java 接口的方法上。
public interface UserMapper { User selectUserById(int id); void insertUser(User user); void updateUser(User user); void deleteUserById(int id); }
参数与结果映射
MyBatis 支持多种参数类型,如基本类型、复杂对象、List 和 Map 等。
基本类型参数
<select id="selectUserById" resultType="User"> SELECT id, name, password FROM users WHERE id = #{id} </select>
对象类型参数
<insert id="insertUser" parameterType="User"> INSERT INTO users (id, name, password) VALUES (#{id}, #{name}, #{password}) </insert>
List 参数
<insert id="insertUsers" parameterType="List"> INSERT INTO users (id, name, password) VALUES <foreach item="item" index="index" collection="list" separator=","> (#{item.id}, #{item.name}, #{item.password}) </foreach> </insert>
分页查询
MyBatis 支持多种分页方法,如使用 RowBounds 类、PageHelper 插件等。
RowBounds 分页
RowBounds rowBounds = new RowBounds(offset, limit); List<User> users = sqlSession.selectList("com.example.mapper.UserMapper.selectUsers", null, rowBounds);
PageHelper 分页插件
<!-- 引入 PageHelper 插件 --> <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="helperDialect" value="mysql"/> <property name="reasonable" value="true"/> </plugin> </plugins>
PageHelper.startPage(pageNum, pageSize); List<User> users = sqlSession.selectList("com.example.mapper.UserMapper.selectUsers"); PageInfo<User> pageInfo = new PageInfo<>(users);
缓存机制
MyBatis 有两种级别的缓存:一级缓存和二级缓存。
一级缓存
一级缓存是 SqlSession 级别的缓存,每次调用 SqlSession 的 select 方法时,先会从缓存中查找,如果查不到才去数据库中查找。
二级缓存
二级缓存是 Mapper 级别的缓存,可以配置为全局缓存,共享多个 SqlSession 的结果。
<cache/>
插件开发
MyBatis 提供了插件机制,可以通过拦截器实现自定义功能。
@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})}) public class MyPlugin implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { // 获取被拦截的方法名 String methodName = invocation.getMethod().getName(); // 进行操作 return invocation.proceed(); } }
代码结构设计
MyBatis 的代码结构设计应该清晰、合理,推荐使用三层架构:DAO 层、Service 层和 Controller 层。
DAO 层
DAO 层负责与数据库交互,使用 Mapper 接口和 XML 文件定义 SQL 语句。
public interface UserMapper { User selectUserById(int id); void insertUser(User user); void updateUser(User user); void deleteUserById(int id); }
Service 层
Service 层负责业务逻辑处理,调用 DAO 层的方法。
@Service public class UserService { @Autowired private UserMapper userMapper; public User getUserById(int id) { return userMapper.selectUserById(id); } public void insertUser(User user) { userMapper.insertUser(user); } }
Controller 层
Controller 层负责处理 HTTP 请求,调用 Service 层的方法。
@RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public User getUserById(@PathVariable int id) { return userService.getUserById(id); } @PostMapping public void insertUser(@RequestBody User user) { userService.insertUser(user); } }
性能优化技巧
MyBatis 性能优化主要包括几个方面:合理使用缓存、减少数据库交互、优化 SQL 语句、使用分页插件等。
合理使用缓存
合理使用 MyBatis 的一级缓存和二级缓存可以减少数据库的访问次数,提高性能。
减少数据库交互
尽量减少对数据库的多次查询操作,可以使用批量操作,如批量插入、批量更新等。
优化 SQL 语句
确保 SQL 语句的正确性和高效性,避免使用复杂的 SQL 语句。
使用分页插件
使用分页插件如 PageHelper 可以更好地管理查询结果,提高性能。
异常处理与日志记录
MyBatis 提供了丰富的异常处理机制,如 SqlSession 提供了 try-with-resources 的方式来管理资源。
try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.selectUserById(1); System.out.println(user.getName()); } catch (Exception e) { e.printStackTrace(); }
同时,MyBatis 支持通过配置文件来设置日志级别,可以使用 Log4j 或 SLF4J 等日志框架。
<settings> <setting name="logImpl" value="LOG4J"/> </settings>
这篇关于Mybatis持久层框架学习入门指南的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-15JavaMailSender是什么,怎么使用?-icode9专业技术文章分享
- 2024-11-15JWT 用户校验学习:从入门到实践
- 2024-11-15Nest学习:新手入门全面指南
- 2024-11-15RestfulAPI学习:新手入门指南
- 2024-11-15Server Component学习:入门教程与实践指南
- 2024-11-15动态路由入门:新手必读指南
- 2024-11-15JWT 用户校验入门:轻松掌握JWT认证基础
- 2024-11-15Nest后端开发入门指南
- 2024-11-15Nest后端开发入门教程
- 2024-11-15RestfulAPI入门:新手快速上手指南