目录
总结:
前言:
MyBatis是一款用于持久层的、轻量级的半自动化ORM框架,封装了所有JDBC操作以及设置查询参数和获取结果集的操作,支持自定义SQL、存储过程和高级映射。它通过XML或注解方式配置SQL语句,并支持动态SQL,用条件判断进行查询可以实现SQL复用。MyBatis的优势在于减少了50%以上的代码量,是最简单的持久化框架,小巧并且简单易学。与JDBC相比,MyBatis通过参数映射方式可以将参数灵活地配置在SQL语句中的配置文件中,避免在Java类中配置参数。同时,MyBatis通过输出映射机制将结果集的检索自动映射成相应的Java对象,避免对结果集手工检索。
1.准备工作:
首先是需要在pom.xml文件中添加:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
然后需要在mybatis-config.xml文件中添加如下内容,这个文件需要自己手动创建,然后把以下内容自己复制。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--加载properties文件-->
<properties resource="db.properties"/>
<!--配置类的别名-->
<typeAliases>
<package name="com.fs.entity"/>
</typeAliases>
<!--environments: 环境复数
default: 默认使用那个环境, environment的id值
-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.user}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!--加载sql映射文件-->
<mappers>
<mapper resource="UserMapper.xml"/>
<mapper resource="OrderMapper.xml"/>
</mappers>
</configuration>
数据库配置文件和xml文件需要在同一目录,这里可以自己配置。
其中mappers中添加相对应的mapper.xml文件路径
2. 创建实体类:
接下来,需要创建对应的实体类和Mapper接口。例如,我们要操作一个User表,可以创建如下的实体类,这里我们使用的一个lombok插件中的注解,使用@data可以省略get/set方法
package com.fs.entity;
import lombok.Data;
import lombok.ToString;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Data
@ToString(callSuper=true) //调用父类toString()
public class User extends BaseEntity{
private String username;
private String password;
private String sex;
private Date brithday;
private String address;
/**关联属性: 订单的关联属性*/
private List<Order> orders = new ArrayList<>();
}
创建相对应mapper接口
package com.fs.mapper;
import com.fs.entity.User;
public interface UserMapper {
/**
* 表关联查询
* 根据用户id查询用户信息以及订单信息
* @param uid 用户id
* @return
*/
User queryUserAndOrdersById(Integer uid);
/**
* 分多条sql
* 根据用户id查询用户信息以及订单信息
* @param uid 用户id
* @return
*/
User queryUserAndOrdersById2(Integer uid);
}
3.创建相对应的xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fs.mapper.UserMapper">
<!--手动映射-->
<resultMap id="userBaseMap" type="User">
<!--User类映射-->
<id column="id" property="id"/>
<result column="name" property="username"/>
<result column="password" property="password"/>
<result column="sex" property="sex"/>
<result column="brithday" property="brithday"/>
<result column="address" property="address"/>
</resultMap>
<resultMap id="userOrderMap" type="User" extends="userBaseMap">
<!--关联属性的映射
集合的关联属性 collection标签来映射
collection属性:
property: 关联属性名
javaType: 关联属性的数据类型 不写
ofType: 集合关联属性的元素的类型, 映射那个对象 必须
-->
<collection property="orders" ofType="Order">
<!--字段与关联属性对象的属性的映射-->
<id property="id" column="oid"/>
<result property="userId" column="userid"/>
<result property="createtime" column="createtime"/>
<result property="state" column="state"/>
<!--配置它的关联属性-->
</collection>
</resultMap>
<select id="queryUserAndOrdersById" parameterType="int" resultMap="userOrderMap">
select u.*, o.id oid ,o.userid,o.createtime ,o.state from tb_user u join tb_order o
on u.id = o.userid
where u.id = #{id}
</select>
<resultMap id="userOrderMap2" type="User" extends="userBaseMap">
<!--
select: 查询关联属性的statementId: namespace+statementId
-->
<collection property="orders" ofType="Order" select="com.fs.mapper.OrderMapper.queryById"
column="id"
></collection>
</resultMap>
<select id="queryUserAndOrdersById2" parameterType="int" resultMap="userOrderMap2">
select * from tb_user u where u.id = #{id}
</select>
</mapper>
其中,namespace表示对应的Mapper接口的全限定名,id表示对应的方法名称,resultType表示返回结果的类型,#{...}表示参数值。
4. 通过mybatis操作数据库
编写测试方法,进行测试
package com.fs.mapper;
import com.fs.entity.User;
import com.fs.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import static org.junit.Assert.*;
public class UserMapperTest {
@Test
public void queryUserAndOrdersById() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.queryUserAndOrdersById(4);
System.out.println(user);
sqlSession.close();
}
@Test
public void queryUserAndOrdersById2() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.queryUserAndOrdersById2(4);
System.out.println(user);
sqlSession.close();
}
}
总结:
本文介绍了如何使用MyBatis操作数据库,包括准备工作、创建实体类和Mapper接口、创建Mapper XML文件以及使用MyBatis操作数据库。同时,还介绍了一些高级特性,例如动态SQL、参数映射、结果集映射。总的来说,MyBatis是一种开源的持久层框架,它可以将SQL语句与JAVA代码分离,使得程序员可以更加专注于业务逻辑的编写。在实际使用中,需要根据具体的情况选择不同的映射方式,以满足不同场景下的需求。使用MyBatis操作数据库可以提高开发效率,降低代码耦合度,使得代码更加易于维护。