本文详细介绍了MyBatis资料,包括MyBatis的基本概念、优点和应用场景,以及如何快速入门并搭建开发环境。文章还深入讲解了MyBatis的核心配置、映射器、动态SQL和高级特性,帮助读者全面掌握MyBatis的使用方法。
MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解进行配置和原始映射,将接口和 Java 的 POJO 传递给 SQL 语句。
MyBatis的优点包括:
MyBatis的应用场景包括:
要搭建 MyBatis 开发环境,需要引入 MyBatis 的依赖。以下是 Maven 配置中的依赖配置示例,确保项目中已经配置了 Maven。
<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.23</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.13.3</version> </dependency> <!-- 其它依赖 --> </dependencies>
接下来,需要配置 SqlMapConfig.xml
,该文件用来配置数据库连接信息和其它核心配置。以下是完整的 SqlMapConfig.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> <settings> <setting name="cacheEnabled" value="true"/> </settings> <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="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="UserMapper.xml"/> </mappers> </configuration> `` ### 第一个MyBatis程序 首先,创建数据库表 `user`,如下: ```sql CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(30) NOT NULL, `password` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; `` 然后编写 `User` 类及其属性: ```java public class User { private int id; private String username; private String password; // Getters and Setters public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } `` 接下来创建 `SqlMapConfig.xml` 配置文件,该文件用来配置数据库连接信息。 ```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="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="UserMapper.xml"/> </mappers> </configuration> `` 接下来创建 `UserMapper.xml` 映射文件,该文件用来定义 SQL 语句。 ```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.example.mapper.UserMapper"> <select id="selectUserById" resultType="com.example.domain.User"> SELECT id, username, password FROM user WHERE id = #{id} </select> </mapper>
最后编写 Java 代码来测试以上配置是否有效:
public class Main { public static void main(String[] args) { SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("SqlMapConfig.xml")); SqlSession session = sqlSessionFactory.openSession(); User user = session.selectOne("com.example.mapper.UserMapper.selectUserById", 1); System.out.println(user); } }
通过以上步骤,MyBatis 第一个程序成功运行。
MyBatis 的配置文件 SqlMapConfig.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/mydb"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- mappers配置,指定映射文件的路径 --> <mappers> <mapper resource="UserMapper.xml"/> </mappers> <!-- 其它配置,如类型处理器、缓存配置等 --> </configuration>
数据库连接配置主要在 <environment>
标签中的 <dataSource>
标签内进行。<dataSource>
标签有三种类型:UNPOOLED、POOLED 和 JNDI。POOLED 类型的连接池是 MyBatis 中比较常用的连接池。
<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="root"/> </dataSource> </environment>
以上配置中,<property>
标签用于设置数据源属性。
MyBatis 映射文件,通常以 .xml
为扩展名,用于定义 SQL 语句。映射文件中的根元素 <mapper>
应该有一个 namespace
属性,该属性用于映射文件中 SQL 语句的唯一命名空间。
<mapper namespace="com.example.mapper.UserMapper"> <select id="selectUserById" resultType="com.example.domain.User"> SELECT id, username, password FROM user WHERE id = #{id} </select> </mapper>
MyBatis 支持多种 SQL 语句的映射,包括 select
、insert
、update
和 delete
。
select
<select id="selectUserById" resultType="com.example.domain.User"> SELECT id, username, password FROM user WHERE id = #{id} </select>
insert
<insert id="insertUser" parameterType="com.example.domain.User"> INSERT INTO user (username, password) VALUES (#{username}, #{password}) </insert>
update
<update id="updateUser" parameterType="com.example.domain.User"> UPDATE user SET username = #{username}, password = #{password} WHERE id = #{id} </update>
delete
<delete id="deleteUserById" parameterType="int"> DELETE FROM user WHERE id = #{id} </delete>
MyBatis 支持使用 if
、choose
、when
、otherwise
标签来编写动态 SQL 语句。这些标签在 XML 映射文件中非常有用,可以实现条件分支和循环。
使用 if
标签:
<select id="selectUserByCondition" resultType="com.example.domain.User"> SELECT id, username, password FROM user <where> <if test="username != null"> AND username = #{username} </if> <if test="password != null"> AND password = #{password} </if> </where> </select>
使用 choose
、when
、otherwise
标签:
<select id="selectUserByCondition" resultType="com.example.domain.User"> SELECT id, username, password FROM user <where> <choose> <when test="username != null"> AND username = #{username} </when> <when test="password != null"> AND password = #{password} </when> <otherwise> AND id = 1 </otherwise> </choose> </where> </select>
foreach
标签用于遍历列表或数组,常用于 SQL 的 IN
子句。
使用 foreach
标签:
<select id="selectUsersByIds" resultType="com.example.domain.User"> SELECT id, username, password FROM user WHERE id IN <foreach item="item" index="index" collection="ids" open="(" separator="," close=")"> #{item} </foreach> </select>
其中,item
表示当前遍历的元素,index
表示当前元素的索引,collection
表示要遍历的集合,open
和 close
定义了遍历序列的起始和结束符号。
MyBatis 的分页查询可以通过 RowBounds
和 PageHelper
插件来实现。
使用 RowBounds
:
public List<User> getUsers(RowBounds rowBounds) { return sqlSession.selectList("com.example.mapper.UserMapper.getUsers", null, rowBounds); }
使用 PageHelper
插件:
首先,引入 PageHelper
依赖:
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.0.0</version> </dependency>
配置 PageHelper
插件:
PageHelper.startPage(1, 5); List<User> users = sqlSession.selectList("com.example.mapper.UserMapper.getUsers");
以下是 SqlMapConfig.xml
中启用 PageHelper
插件的完整配置示例:
<configuration> <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="helperDialect" value="mysql"/> <property name="reasonable" value="true"/> <property name="params" value="count=countSql"/> </plugin> </plugins> </configuration>
MyBatis 提供了一级缓存和二级缓存的机制,可以显著提高查询性能。
一级缓存:
一级缓存是 SqlSession 级别的缓存,同一个 SqlSession 中的相同 SQL 不会重复执行。
二级缓存:
二级缓存是 Mapper 级别的缓存,同一个命名空间的相同 SQL 在不同的 SqlSession 中也可以实现缓存。
<cache />
在 SqlMapConfig.xml
配置文件中添加 <cache>
标签即可启用二级缓存,具体配置如下:
<configuration> <cacheEnabled>true</cacheEnabled> <cache> <type>PERPETUAL</type> <flushInterval>60000</flushInterval> <size>512</size> <blocking>true</blocking> </cache> </configuration>
通过以上介绍,你已经了解了 MyBatis 的基本概念、快速入门、核心配置、映射器、动态 SQL 和高级特性。通过这些内容,可以快速掌握 MyBatis 的使用方法,希望对你有所帮助。