MyBatis基础步骤

  • 准备工作:

    • 创建SpringBoot工程,引入MyBatis相关依赖(MySQL Driver、MyBatis Framework)

    • 准备数据库表、实体类

    • 配置MyBatis(application.properties中配置数据库连接信息)

      1
      2
      3
      4
      5
      6
      spring.datasource.url=jdbc:mysql://localhost:3306/web
      spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
      spring.datasource.username=root
      spring.datasource.password=1234

      mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
  • 编写MyBatis程序:编写持久层接口,定义SQL(通过注解、XML的方式)

    以SELECT语句为例:

    1
    2
    3
    4
    5
    @Mapper
    public interface UserMapper {
    @Select("select * from user")
    public List<User> findAll(){}
    }

    测试程序:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @SpringBootTest // SpringBoot单元测试注解,当前测试类中测试方法运行是,会启动SpringBoot项目
    class SpringbootMybatisQuickstartApplicationTests {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testFindAll() {
    List<User> users = userMapper.findAll();
    users.forEach(System.out::println);
    }
    }

数据库连接池

数据库连接池为容器,负责分配、管理数据库连接。允许应用程序重复使用一个现有的数据库连接,而不是重写建立一个。同时会释放空闲时间超过最大空闲时间的连接,避免连接遗漏。

切换DataSource:

1
springboot.datasource.type=com.alibaba.druid.pool.DruidDataSource

删除语句

#{...}占位符,执行时会替换为?,生成预编译SQL,并将输入传递进去。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 删除指定ID的用户
* @param id 用户ID
*/
@Delete("delete from user where id = #{id}")
public void deleteById(Integer id);

/**
* 删除指定ID的用户
* @param id 用户ID
* @return 影响的行数
*/
@Delete("delete from user where id = #{id}")
public Integer deleteById(Integer id);

添加语句

传入参数为一个类对象,Insert注解根据占位符内容读取对象内的属性。

1
2
3
4
5
6
7
8
/**
* 添加用户
* @param user
* @return 影响的行数
*/
@Insert("insert into user(username, password, name, age) " +
"values (#{username}, #{password}, #{name}, #{age})")
public Integer insertUser(User user);

更新语句

与添加语句类似。

1
2
3
4
5
6
7
8
9
10
/**
* 更新用户信息
* @param user
* @return 影响的行数
*/
@Update("update user set username=#{username}," +
"password=#{password}," +
"name=#{name}," +
"age=#{age} where id = #{id}")
public Integer updateUser(User user);

查询语句

编译后字节码文件中不会保存传入参数名称,需要使用@Param声明。基于Springboot官方骨架创建的项目(pom.xml中指定了springboot父工程),接口编译时会保留形参名,可以省略。

1
2
3
4
5
6
7
8
/**
* 根据用户名查询用户
* @param username 用户名
* @param password 密码
* @return 用户
*/
@Select("select * from user where username=#{username} and password=#{password}")
public User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);

XML映射配置

规则:

  • XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下。
  • XML映射文件的namespace属性为Mapper接口全限定名一致。
  • XML映射文件中sql语句的id与Mapper接口中的方法名、返回类型一致。

com.example.mapper.UserMapperMapper接口:

1
2
3
4
@Mapper
public interface UserMapper{
public List<User> findAll();
}

对应的XML映射文件resources/com/example/mapper/UserMapper.xml

1
2
3
4
5
6
<mapper namespace="com.example.mapper.UserMapper">
<!-- resultType:查询返回的单条记录 -->
<select id="findAll" resultType="com.example.pojo.User">
select id, username, password, name, age from user
</select>
</mapper>

application.properties中配置XML映射文件位置:

1
mybatis.mapper-locations=classpath:mapper/*.xml

动态SQL:可以根据请求的参数动态修改SQL语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<mapper namespace="com.example.mapper.UserMapper">
<select id="list" resultType="com.example.pojo.Emp">
select e.*, d.name from emp e left join dept d on e.dept_id = d.id
<where>
<if test="name != null and name != ''">
e.name like concat('%', #{name}, '%')
</if>
<if test="gender != null">
and e.gender = #{gender}
</if>
<if test="begin != null and end != null">
and e.entry_date between #{begin} and #{end}
</if>
</where>
order by e.update_time desc
</select>
</mapper>

指定封装信息

如果查询返回的字段名与属性名不对应或比较复杂,则使用resultMap替代resultType进行指定。