本文将详细介绍Mybatis入门的相关知识,包括Mybatis的基本概念、优势与应用场景。通过本文,读者将了解Mybatis与传统JDBC的区别,并掌握Mybatis环境搭建、核心概念及用法。此外,文章还将讲解Mybatis的高级特性和与Spring的集成方法。mybatis入门对于初学者来说非常重要。
Mybatis入门教程:新手必读指南 Mybatis简介Mybatis的基本概念
Mybatis是一个优秀的持久层框架,它支持自定义SQL语句、存储过程以及高级映射。Mybatis避免了大部分的数据库厂商锁定,其设计目标是降低SQL映射到对象的复杂性。Mybatis使用简单的XML或注解进行配置和原始映射,将接口和Java的POJO(Plain Old Java Object,普通的Java对象)映射成数据库中的记录。
Mybatis的优势与应用场景
Mybatis的主要优势是通过半自动化的方式将Java对象和数据库记录之间进行映射,这种方式提供了很大的灵活性和性能。Mybatis在以下场景中表现突出:
- 复杂的SQL查询
- 高性能要求的应用
- 需要精细控制SQL的场景
Mybatis适用于以下场景:
- 需要进行复杂SQL查询的场景
- 需要高性能处理大量数据的场景
- 需要在应用中灵活控制SQL的场景
- 需要进行存储过程调用的场景
Mybatis与传统JDBC的区别
Mybatis和JDBC的主要区别在于,Mybatis通过配置文件或注解来映射SQL语句,而JDBC需要手动编写SQL语句和处理结果集。例如,JDBC代码通常需要手动处理ResultSet,而Mybatis通过XML配置文件或注解将SQL语句与Java代码解耦,降低了SQL语句变更对Java代码的影响。
Mybatis环境搭建开发环境准备
开发Mybatis应用的环境包括:
- JDK安装
- IDE安装(如Eclipse、IntelliJ IDEA等)
- Maven或Gradle安装(用于管理依赖)
- 数据库的安装与配置(如MySQL)
- Mybatis的jar包依赖
创建第一个Mybatis项目
以下步骤将展示如何创建一个简单的Mybatis项目。
使用Maven创建项目
- 创建一个新的Maven项目。
- 在pom.xml文件中添加Mybatis依赖:
<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.25</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.10</version>
</dependency>
</dependencies>
- 创建一个数据库连接配置文件(如
db.properties
):
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatisdb
username=root
password=root
- 创建数据库和表:
CREATE DATABASE mybatisdb; USE mybatisdb; CREATE TABLE User ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), password VARCHAR(50) );
配置Mybatis核心配置文件
Mybatis的核心配置文件(如mybatis-config.xml
)用于配置数据库连接信息、映射文件位置等信息。例如,可以配置数据库连接池、事务管理器等。
<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="com/example/UserMapper.xml"/>
</mappers>
</configuration>
Mybatis核心概念与用法
SqlSessionFactory与SqlSession
SqlSessionFactory是Mybatis的核心接口,它负责创建SqlSession。SqlSession是Mybatis中的一个会话对象,它负责执行SQL语句并返回结果。
创建SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
获取SqlSession
SqlSession session = sqlSessionFactory.openSession();
Mapper接口与XML映射文件
Mapper接口与XML映射文件用于定义SQL语句及其对应的Java方法。
Mapper接口定义
public interface UserMapper {
User getUserById(int id);
List<User> getAllUsers();
void addUser(User user);
void updateUser(User user);
void deleteUser(int id);
}
XML映射文件
<mapper namespace="com.example.UserMapper">
<select id="getUserById" resultType="User">
SELECT * FROM User WHERE id = #{id}
</select>
<select id="getAllUsers" resultType="User">
SELECT * FROM User
</select>
<insert id="addUser">
INSERT INTO User(name, password) VALUES(#{name}, #{password})
</insert>
<update id="updateUser">
UPDATE User SET name = #{name}, password = #{password} WHERE id = #{id}
</update>
<delete id="deleteUser">
DELETE FROM User WHERE id = #{id}
</delete>
</mapper>
{}和${}的区别和使用
#{}
用于预编译SQL语句的占位符,可以防止SQL注入攻击。${}
用于拼接SQL语句,需要注意SQL注入的风险。
示例:
<select id="getUserById" resultType="User">
SELECT * FROM User WHERE id = #{id}
</select>
<select id="getUserByName" resultType="User">
SELECT * FROM User WHERE name = '${name}'
</select>
CRUD操作详解
增加数据
以下代码展示了如何使用Mybatis增加一条数据。
实现UserMapper接口
public interface UserMapper {
void addUser(User user);
}
XML映射文件
<insert id="addUser">
INSERT INTO User(name, password) VALUES(#{name}, #{password})
</insert>
调用实现
User user = new User();
user.setName("John");
user.setPassword("123456");
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.addUser(user);
session.commit();
session.close();
查询数据
以下代码展示了如何使用Mybatis查询数据。
实现UserMapper接口
public interface UserMapper {
User getUserById(int id);
}
XML映射文件
<select id="getUserById" resultType="User">
SELECT * FROM User WHERE id = #{id}
</select>
调用实现
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
session.close();
System.out.println(user.getName());
更新数据
以下代码展示了如何使用Mybatis更新数据。
实现UserMapper接口
public interface UserMapper {
void updateUser(User user);
}
XML映射文件
<update id="updateUser">
UPDATE User SET name = #{name}, password = #{password} WHERE id = #{id}
</update>
调用实现
User user = new User();
user.setId(1);
user.setName("John Updated");
user.setPassword("654321");
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.updateUser(user);
session.commit();
session.close();
删除数据
以下代码展示了如何使用Mybatis删除数据。
实现UserMapper接口
public interface UserMapper {
void deleteUser(int id);
}
XML映射文件
<delete id="deleteUser">
DELETE FROM User WHERE id = #{id}
</delete>
调用实现
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.deleteUser(1);
session.commit();
session.close();
Mybatis高级特性
动态SQL
动态SQL允许根据不同的条件生成不同的SQL语句。
使用if标签
<select id="getUserByName" resultType="User">
SELECT * FROM User
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="password != null">
AND password = #{password}
</if>
</where>
</select>
使用foreach标签
<delete id="deleteUsersByIds">
DELETE FROM User WHERE id IN
<foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
#{item}
</foreach>
</delete>
分页查询
Mybatis提供了RowBounds
类来实现分页查询。
使用RowBounds
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.getAllUsers(new RowBounds(0, 10));
session.close();
一级与二级缓存
Mybatis支持一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,二级缓存是Mapper级别的缓存。
启用二级缓存
在mybatis-config.xml
中配置:
<cache/>
在Mapper XML文件中配置:
<cache/>
Mybatis与Spring集成
Mybatis与Spring整合的基本步骤
- 使用Spring的
SqlSessionFactoryBean
创建SqlSessionFactory
对象。 - 使用
MapperScannerConfigurer
扫描Mapper接口并生成Mapper对象。 - 在Spring配置文件中配置数据源和事务管理器。
创建Spring配置文件
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
使用注解简化Mybatis开发
Mybatis支持使用注解来配置SQL语句,减少了XML文件的使用。
使用注解
@Select("SELECT * FROM User WHERE id = #{id}")
User getUserById(@Param("id") int id);
Mybatis与Spring的事务管理
Spring提供了声明式事务管理机制,可以与Mybatis无缝结合。
配置事务管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
配置事务属性
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* com.example.service.*.*(..))"/>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" isolation="READ_COMMITTED" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>