本文提供了Mybatis资料的全面入门教程,涵盖了Mybatis的基本概念、环境搭建、核心接口、持久化映射、动态SQL以及高级特性。通过丰富的示例代码,帮助新手快速掌握Mybatis的使用方法,是学习Mybatis资料的绝佳指南。
Mybatis资料入门教程:新手必看指南 MyBatis简介MyBatis的基本概念
MyBatis是一个持久层框架,它通过一种简单的接口和灵活的配置来实现数据库操作。MyBatis使用XML或注解来配置和映射原生的SQL到Java应用中,使得开发人员能够更加直接地与数据库交互。
MyBatis和其他持久层框架的区别
MyBatis与其他持久层框架(如Hibernate)的主要区别在于其对SQL语句的直接控制。Hibernate等框架使用对象-关系映射(ORM)方式来自动处理SQL语句,而MyBatis允许开发人员直接编写SQL语句,这在某些情况下提供了更高的灵活性和性能控制。
MyBatis的核心优势
- 灵活性:MyBatis允许开发人员直接编写SQL语句,提供了极大的灵活性。
- 性能:由于开发人员可以控制SQL,因此可以优化性能。
- 简化:MyBatis的配置相对简单,易于学习和使用。
- 定制化:可以针对不同的数据库进行定制化优化。
下载和配置MyBatis
- 下载MyBatis:可以从MyBatis官网下载最新版本的MyBatis库。
- 配置环境:将下载的MyBatis库添加到项目的类路径中,确保项目能够访问到MyBatis的库文件。
创建第一个MyBatis应用程序
- 创建数据库表:首先创建一个简单的数据库表。
- 编写配置文件:编写
mybatis-config.xml
配置文件。 - 编写Mapper接口:定义一个接口,供MyBatis调用。
- 编写Mapper XML文件:定义SQL语句。
示例代码
数据库表定义:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mybatis-config.xml
配置文件:
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
Mapper接口:
public interface UserMapper {
User selectUser(int id);
}
Mapper XML文件:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUser" resultType="com.example.model.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
创建数据库连接并执行查询:
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);
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUser(1);
System.out.println(user);
}
}
}
MyBatis的核心接口
SqlSession和SqlSessionFactory
SqlSessionFactory
用于创建SqlSession
,SqlSession
用于执行数据库操作。
示例代码
创建SqlSessionFactory
:
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
获取SqlSession
并执行查询:
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUser(1);
System.out.println(user);
} finally {
session.close();
}
Mapper接口和SqlMapper配置文件详解
Mapper接口直接映射到SQL语句,通过映射文件配置SQL语句。
示例代码
Mapper接口:
public interface UserMapper {
User selectUserById(int id);
void insertUser(User user);
}
Mapper XML文件:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUserById" resultType="com.example.model.User">
SELECT * FROM user WHERE id = #{id}
</select>
<insert id="insertUser" keyProperty="id">
INSERT INTO user(name, age) VALUES(#{name}, #{age})
</insert>
</mapper>
使用XML映射文件
通过XML文件定义映射关系。
示例代码
定义映射关系:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUserById" resultType="com.example.model.User">
SELECT * FROM user WHERE id = #{id}
</select>
<insert id="insertUser" keyProperty="id">
INSERT INTO user(name, age) VALUES(#{name}, #{age})
</insert>
</mapper>
使用注解进行持久化映射
通过注解定义映射关系。
示例代码
Mapper接口:
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User selectUserById(int id);
@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
void insertUser(User user);
}
映射一对一和一对多关系
通过关联映射定义一对一和一对多关系。
示例代码
一对一关系:
<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="UserResultMap" type="com.example.model.User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<association property="address" javaType="com.example.model.Address" column="address_id">
<id property="id" column="address_id"/>
<result property="street" column="street"/>
<result property="city" column="city"/>
</association>
</resultMap>
<select id="selectUserWithAddressById" resultMap="UserResultMap">
SELECT u.*, a.id AS address_id, a.street, a.city
FROM user u
LEFT JOIN address a ON u.address_id = a.id
WHERE u.id = #{id}
</select>
</mapper>
一对多关系:
<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="UserResultMap" type="com.example.model.User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<collection property="orders" javaType="java.util.List" ofType="com.example.model.Order" column="user_id">
<id property="id" column="id"/>
<result property="product" column="product"/>
<result property="quantity" column="quantity"/>
</collection>
</resultMap>
<select id="selectUserWithOrdersById" resultMap="UserResultMap">
SELECT u.*, o.id AS id, o.product, o.quantity
FROM user u
LEFT JOIN order o ON u.id = o.user_id
WHERE u.id = #{id}
</select>
</mapper>
MyBatis的持久化映射
使用XML映射文件
通过XML文件定义映射关系。
示例代码
定义映射关系:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUserById" resultType="com.example.model.User">
SELECT * FROM user WHERE id = #{id}
</select>
<insert id="insertUser" keyProperty="id">
INSERT INTO user(name, age) VALUES(#{name}, #{age})
</insert>
</mapper>
使用注解进行持久化映射
通过注解定义映射关系。
示例代码
Mapper接口:
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User selectUserById(int id);
@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
void insertUser(User user);
}
映射一对一和一对多关系
通过关联映射定义一对一和一对多关系。
示例代码
一对一关系:
<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="UserResultMap" type="com.example.model.User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<association property="address" javaType="com.example.model.Address" column="address_id">
<id property="id" column="address_id"/>
<result property="street" column="street"/>
<result property="city" column="city"/>
</association>
</resultMap>
<select id="selectUserWithAddressById" resultMap="UserResultMap">
SELECT u.*, a.id AS address_id, a.street, a.city
FROM user u
LEFT JOIN address a ON u.address_id = a.id
WHERE u.id = #{id}
</select>
</mapper>
一对多关系:
<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="UserResultMap" type="com.example.model.User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<collection property="orders" javaType="java.util.List" ofType="com.example.model.Order" column="user_id">
<id property="id" column="id"/>
<result property="product" column="product"/>
<result property="quantity" column="quantity"/>
</collection>
</resultMap>
<select id="selectUserWithOrdersById" resultMap="UserResultMap">
SELECT u.*, o.id AS id, o.product, o.quantity
FROM user u
LEFT JOIN order o ON u.id = o.user_id
WHERE u.id = #{id}
</select>
</mapper>
MyBatis的动态SQL
条件查询
根据条件动态生成SQL语句。
示例代码
条件查询:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUsersByCondition" resultType="com.example.model.User">
SELECT * FROM user
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
</mapper>
动态添加参数
根据参数动态生成SQL语句。
示例代码
动态添加参数:
<mapper namespace="com.example.mapper.UserMapper">
<update id="updateUser">
UPDATE user
<set>
<if test="name != null">name = #{name},</if>
<if test="age != null">age = #{age},</if>
</set>
WHERE id = #{id}
</update>
</mapper>
动态更新语句
根据条件动态生成更新语句。
示例代码
动态更新语句:
<mapper namespace="com.example.mapper.UserMapper">
<update id="updateDynamicUser">
UPDATE user
<set>
<if test="name != null">name = #{name},</if>
<if test="age != null">age = #{age},</if>
</set>
WHERE id = #{id}
</update>
</mapper>
MyBatis的高级特性
分页查询
通过SQL语句实现分页查询。
示例代码
分页查询:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUsersByPage" resultType="com.example.model.User">
SELECT * FROM user
LIMIT #{offset}, #{limit}
</select>
</mapper>
事务管理
MyBatis通过SqlSession
管理事务。
示例代码
事务管理:
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
try {
User user = new User();
user.setName("John");
user.setAge(30);
mapper.insertUser(user);
session.commit();
} catch (Exception e) {
session.rollback();
throw e;
}
}
异步执行
MyBatis通过AsyncSqlSession
实现异步执行。
示例代码
异步执行:
try (AsyncSqlSession asyncSqlSession = sqlSessionFactory.openAsyncSession()) {
UserMapper mapper = asyncSqlSession.getMapper(UserMapper.class);
mapper.insertUser(new User());
asyncSqlSession.startAsync();
}
``
复杂示例——事务管理:
```java
try(SqlSession session = sqlSessionFactory.openSession()) {
UserMapper userMapper = session.getMapper(UserMapper.class);
OrderMapper orderMapper = session.getMapper(OrderMapper.class);
try {
User user = new User();
user.setName("John");
user.setAge(30);
userMapper.insertUser(user);
Order order = new Order();
order.setUser(user);
order.setProduct("ProductA");
order.setQuantity(1);
orderMapper.insertOrder(order);
session.commit();
} catch (Exception e) {
session.rollback();
throw e;
}
}
复杂示例——异步执行:
try (AsyncSqlSession asyncSqlSession = sqlSessionFactory.openAsyncSession()) {
UserMapper userMapper = asyncSqlSession.getMapper(UserMapper.class);
OrderMapper orderMapper = asyncSqlSession.getMapper(OrderMapper.class);
Future<User> userFuture = asyncSqlSession.executeAsync(() -> {
User user = new User();
user.setName("John");
user.setAge(30);
userMapper.insertUser(user);
return user;
});
Future<Order> orderFuture = asyncSqlSession.executeAsync(() -> {
User user = userFuture.get();
Order order = new Order();
order.setUser(user);
order.setProduct("ProductA");
order.setQuantity(1);
orderMapper.insertOrder(order);
return order;
});
asyncSqlSession.startAsync();
// 处理回调或异常
userFuture.addListener(runnable -> {
try {
User user = userFuture.get();
System.out.println("User inserted: " + user);
} catch (Exception e) {
System.err.println("Error inserting user");
}
}, asyncSqlSession.getExecutor());
orderFuture.addListener(runnable -> {
try {
Order order = orderFuture.get();
System.out.println("Order inserted: " + order);
} catch (Exception e) {
System.err.println("Error inserting order");
}
}, asyncSqlSession.getExecutor());
}
``
通过以上内容,新手可以更好地理解Mybatis的基本概念、环境搭建、核心接口、持久化映射、动态SQL以及高级特性。希望这些示例代码和概念解释能够帮助你入门MyBatis。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章