本文介绍了MyBatis入门的相关内容,包括MyBatis的基本概念、优势和应用场景。文章还详细讲解了MyBatis的环境搭建、核心概念以及常用操作。此外,还涉及了MyBatis与Spring的集成和高级特性。
MyBatis简介 MyBatis是什么MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
MyBatis的核心接口是SqlSession,它提供了所有持久层操作的方法,如增删改查等。SqlSession的实例可以通过SqlSessionFactory的实例来获得,而SqlSessionFactory的实例又可以通过SqlSessionFactoryBuilder的实例来创建。
MyBatis的优势和应用场景MyBatis的优势包括:
- 灵活的SQL控制:允许使用原始SQL进行查询,可以直接编写SQL语句,也可以使用XML进行配置。
- 高性能:MyBatis在处理大量数据时性能很高,因为它没有过多的封装和对象转换。
- 易于维护:配置文件和SQL语句分离,使得系统维护更加简单。
- 简单易用:MyBatis学习曲线平缓,易于理解和使用。
应用场景包括:
- 数据访问层:直接操作数据库,进行数据的增删改查。
- 持久化层:将对象持久化到数据库中,实现对象与数据库表之间的映射。
- 大数据处理:在需要频繁操作数据库的情况下,MyBatis的高性能可以满足需求。
- 复杂查询:支持动态SQL,可以编写复杂的查询语句,适用于业务逻辑复杂的系统。
MyBatis与Hibernate等ORM框架的区别在于:
- SQL控制:Hibernate自动将对象映射为SQL,而MyBatis则需要手动编写SQL语句。
- 性能:MyBatis在性能上通常优于Hibernate,因为它没有Hibernate那样的对象-关系映射开销。
- 灵活性:MyBatis相对更加灵活,可以根据需要编写SQL语句,而Hibernate则更加面向对象,操作更加抽象。
- 缓存机制:MyBatis默认情况下没有缓存机制,而Hibernate内置了一级缓存。
可以通过MyBatis的官方网站下载MyBatis的最新版本。也可以使用Maven仓库自动管理依赖。
下面是一个具体的Maven依赖配置示例:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
数据库连接配置
MyBatis需要一个数据库连接配置文件,通常在resources目录下创建一个db-config.properties
文件,内容如下:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb
username=root
password=root
在代码中读取和使用这个配置文件,可以通过Java代码如下:
Properties props = new Properties();
props.load(new FileInputStream(new File("src/main/resources/db-config.properties")));
DataSource dataSource = BasicDataSourceFactory.createDataSource(props);
MyBatis核心概念
SqlSessionFactory和SqlSession
SqlSessionFactory是创建SqlSession的工厂。SqlSessionFactory的实例是线程不安全的,因此通常使用SqlSessionFactoryBuilder来创建。
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("MyBatisConfig.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
SqlSession是MyBatis工作的主要接口,它负责执行SQL语句,管理事务等。SqlSession的实例也是线程不安全的,每次需要时,都应该从SqlSessionFactory获取。
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> users = sqlSession.selectList("selectUsers");
Mapper接口和XML映射文件
Mapper接口是MyBatis中用于执行数据库操作的接口,每一个Mapper接口对应一个XML映射文件。例如,有一个UserMapper接口:
public interface UserMapper {
List<User> selectAllUsers();
}
对应的XML映射文件UserMapper.xml
如下:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectAllUsers" resultType="com.example.model.User">
SELECT * FROM users
</select>
</mapper>
MyBatis配置文件详解
MyBatis的核心配置文件MyBatisConfig.xml
,通常位于项目的resources目录下。配置文件主要包括环境配置、类型别名、映射器等。
<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/mapper/UserMapper.xml"/>
</mappers>
</configuration>
MyBatis常用操作
CRUD操作(增删改查)
增加(Insert)
在UserMapper接口中定义插入方法:
public interface UserMapper {
int insertUser(User user);
}
对应的XML映射文件:
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO users (id, name, age)
VALUES (#{id}, #{name}, #{age})
</insert>
查询(Select)
在UserMapper接口中定义查询方法:
public interface UserMapper {
List<User> selectUsers();
}
对应的XML映射文件:
<select id="selectUsers" resultType="com.example.model.User">
SELECT * FROM users
</select>
更新(Update)
在UserMapper接口中定义更新方法:
public interface UserMapper {
int updateUser(User user);
}
对应的XML映射文件:
<update id="updateUser" parameterType="com.example.model.User">
UPDATE users
SET name = #{name}, age = #{age}
WHERE id = #{id}
</update>
删除(Delete)
在UserMapper接口中定义删除方法:
public interface UserMapper {
int deleteUser(int id);
}
对应的XML映射文件:
<delete id="deleteUser" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
参数传递和结果映射
参数传递
参数可以通过多种方式传递到SQL语句中,例如:
<select id="getUserById" parameterType="int" resultType="com.example.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
结果映射
结果映射可以用来处理复杂的查询结果,例如:
<resultMap id="userResultMap" type="com.example.model.User">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
</resultMap>
<select id="selectUser" resultMap="userResultMap">
SELECT * FROM users WHERE name = #{name}
</select>
动态SQL的使用
MyBatis提供了多种动态SQL标签,例如:
<select id="selectUser" parameterType="map" resultType="com.example.model.User">
SELECT * FROM users
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
MyBatis与Spring集成
MyBatis与Spring整合的原因
MyBatis与Spring整合的原因在于:
- 依赖注入:Spring的依赖注入可以简化MyBatis的配置,减少硬编码的配置。
- 事务管理:Spring的事务管理可以简化MyBatis的事务处理。
- 统一配置:将MyBatis配置和Spring配置统一管理,提高维护性。
MyBatis-Spring提供了一些工具类,例如SqlSessionFactoryBean
和SqlSessionTemplate
,这些工具类可以简化MyBatis与Spring的整合。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg>
<ref bean="sqlSessionFactory"/>
</constructor-arg>
</bean>
配置和使用Mapper接口
在Spring配置文件中定义Mapper接口:
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
然后可以在Spring bean中使用Mapper接口:
@Autowired
private UserMapper userMapper;
public void getUserById(int id) {
User user = userMapper.selectUserById(id);
// 处理user
}
MyBatis与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"/>
<property name="configLocation" value="classpath:MyBatisConfig.xml"/>
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg>
<ref bean="sqlSessionFactory"/>
</constructor-arg>
</bean>
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
MyBatis高级特性
分页查询
分页查询可以通过SQL的LIMIT子句实现,例如:
<select id="selectUserPage" parameterType="map" resultType="com.example.model.User">
SELECT * FROM users
LIMIT #{offset}, #{limit}
</select>
也可以使用MyBatis的PageHelper插件实现分页:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
在Mapper接口中定义分页方法:
public interface UserMapper {
List<User> selectUserPage(int offset, int limit);
}
使用PageHelper插件:
PageHelper.startPage(pageNum, pageSize);
List<User> users = userMapper.selectUserPage();
Page<User> userPage = (Page<User>) users;
一对一和一对多关联查询
在一对一关联查询中,例如查询用户及其对应的账号信息:
<resultMap id="userAccountMap" type="com.example.model.User">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<association property="account" javaType="com.example.model.Account">
<id column="account_id" property="id"/>
<result column="account_name" property="name"/>
</association>
</resultMap>
<select id="selectUserAccount" resultMap="userAccountMap">
SELECT u.id, u.name, u.age, a.id as account_id, a.name as account_name
FROM users u
LEFT JOIN accounts a ON u.id = a.user_id
</select>
在一对多关联查询中,例如查询用户及其所有订单信息:
<resultMap id="userOrderMap" type="com.example.model.User">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<collection property="orders" javaType="java.util.List" ofType="com.example.model.Order">
<id column="order_id" property="id"/>
<result column="order_name" property="name"/>
</collection>
</resultMap>
<select id="selectUserOrders" resultMap="userOrderMap">
SELECT u.id, u.name, u.age, o.id as order_id, o.name as order_name
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
</select>
延迟加载和缓存机制
延迟加载
延迟加载可以通过fetchType="lazy"
属性设置:
<association property="account" javaType="com.example.model.Account" fetchType="lazy">
<id column="account_id" property="id"/>
<result column="account_name" property="name"/>
</association>
缓存机制
MyBatis支持一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,二级缓存是Mapper级别的缓存。
<cache/>
在Mapper配置文件中开启二级缓存:
<mapper namespace="com.example.mapper.UserMapper">
<cache/>
<select id="selectUser" resultType="com.example.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
通过缓存可以提高查询性能,减少数据库访问次数。
共同学习,写下你的评论
评论加载中...
作者其他优质文章