6.MyBatis

MyBatis

介绍:

  • MyBatis是一款优秀的持久层(dao层)框架,用于简化JDBC的开发;
  • MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github;
  • 官网:https://mybatis.org/mybatis-3/zh/index.html

步骤:

1.准备工作:

创建springboot工程、数据库表user、实体类User

2.引入Mybatis的相关依赖,配置Mybatis(数据库连接信息):

选择依赖:
在springboot工程中,勾选MyBatis Framework和MySQL Driver两项依赖
数据库连接四要素:
  • 在application.properties文件中写入
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#数据库连接的url,mybatis为数据库名
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis

#连接数据库的用户名
spring.datasource.username=root

#连接数据库的密码
spring.datasource.password=1234

#指定mybatis输出日志的位置,输出控制台;
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

#开启驼峰命名:如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射;
mybatis.configuration.map-underscore-to-camel-case=true

3.编写SQL语句(注解/XML):

  • 注解:
@Mapper //在运行时,会自动生成该接口的实现类对象(代理对象),并且将该对象交给IOC容器管理
public interface UserMapper{
	@Select("select * from user")
	public List<User> list();
}

4.单元测试:

package com.caihongjia;

import com.caihongjia.mapper.UserMapper;
import com.caihongjia.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class SpringbootMybatisQuickstartApplicationTests {

    @Autowired //依赖注入
    private UserMapper userMapper;

    @Test
    public void testListUser(){
        List<User> list = userMapper.list();
        list.stream().forEach(user -> {
            System.out.println(user);
        });
    }

}

JDBC介绍:

  • JDBC:(Java DataBase Connectivity),就是使用Java语言操作关系型数据库的一套API;

本质:

  • sun公司官方定义的一套操作所有关系型数据库的规范,既接口;
  • 各个数据库厂商去实现这套接口,提供数据库驱动jar包
  • 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类;

例子:

<dependency>
	<groupId>com.mysql</groupId>
	<artifactId>mysql-connector-j</artifactId>
	<scope>runtime</scope>
</dependency>

数据库连接池:

介绍:

  • 数据库连接池是个容器,负责分配、管理数据库连接(Connection);
  • 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
  • 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏;

优势:

  • 资源重用;
  • 提升系统响应速度;
  • 避免数据库连接遗漏;

连接池技术:

  • 标准接口:DataSource

    • 官方(sun)提供的数据库连接池接口,由第三方组织实现此接口;
    • 功能:获取连接:
    Connection getConnection() throws SQLException;
    
  • 常见产品:

    • C3P0;
    • DBCP;
    • Druid(德鲁伊);
    • Hikari(追光者,springboot默认连接池);
  • Druid(德鲁伊)

    • Druid连接池是阿里巴巴开源的数据库连接池项目;
    • 功能强大,性能优秀,是Java语言最好的数据库连接池之一;
    <dependency>
       <groupId>com.alibaba</groupId>
       <artifactId>druid-spring-boot-starter</artifactId>
       <version>1.2.8</version>
    </dependency>
    

lombok:

  • lombok是一个实用的Java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率;
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
注解 作用
@Getter/@Setter 为所有的属性提供get/set方法
@ToString 会给类自动生成易阅读的toString方法
@EquealsAndHashCode 根据类所拥有的非静态字段自动重写equals方法和hashCode方法
@Data 提供了更综合的生成代码功能(@Getter + @Setter + @ToString + @EqualsAndHashCode)
@NoArgsConstructor 为实体类生成无参的构造器方法
@AllArgsConstructor 为实体类生成除了static修饰的字段之外带有各参数的构造器方法

基础操作:

参数占位符:

#{...}:
  • 执行SQL时,会将#{...}替换为?,生成预编译SQL,会自动设置参数值;
  • 使用时间:参数传递,都使用#{...};
  • 现在开发都是使用#
${...}:
  • 拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入问题;
  • 使用时机:如果对表名、列表进行动态设置时使用;

预编译SQL:

  • 优势:
    • 性能更高;
    • 更安全(防止SQL注入);

删除操作:

步骤
  1. 在mapper接口中,定义一个删除数据的抽象方法;
  2. 在删除数据的方法上添加注解@Delete;
  3. 如果有参数,使用#{参数名}来获取传过来的参数;
  4. 返回值为int类型,表示影响的记录数,可以不要返回值;
例子:
@Mapper
public interface EmpMapper {
    
    //根据ID删除数据
    @Delete("delete from emp where id = #{id}")
    public int delete(Integer id);
}
注意事项:
  • 如果mapper接口方法形参只有一个普通类型的参数,#{...}里面的属性名可以随便写。如:#{id}、#{value};

新增操作:

步骤:
  1. 在mapper接口中,定义一个新增数据的抽象方法;
  2. 在新增数据的方法上添加注解@Insert;
  3. 拥有多个参数,可以使用一个实体类当做参数传递,使用#{属性名}来获取传过来的参数中的对应属性;
  4. 返回值为int类型,表示影响的记录数,可以不要返回值;
主键返回:
  • 在数据添加成功后,需要获取插入数据库数据的主键;

  • 使用@Options注解来实现;

  • @Options(keyProperty = "id",useGeneratedKeys = true);会自动将生成的主键值,赋值给emp对象的id属性;

  • useGeneratedKeys = true:允许将自增的主键id返回回来;

  • keyProperty = "id":将返回回来的主键id,赋值给实体类的id属性;

例子:
@Mapper
public interface EmpMapper {
    
    //新增员工
    @Options(useGeneratedKeys = true,keyProperty = "id")
    @Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, 		update_time) " + "VALUES (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
    public int insert(Emp emp);
}

更新操作:

步骤:
  1. 在mapper接口中,定义一个更新数据的抽象方法;
  2. 在更新数据的方法上添加注解@Update;
  3. 拥有多个参数,可以使用一个实体类当做参数传递,使用#{属性名}来获取传过来的参数中的对应属性;
  4. 返回值为int类型,表示影响的记录数,可以不要返回值;
例子:
@Mapper
public interface EmpMapper {
    
    //更新员工
    @Update("update emp set username=#{username},name=#{name},gender=#{gender},image=#{image},job=#{job},entrydate=#{entrydate},dept_id=#{deptId},update_time=#{updateTime} where id=#{id} ")
    public int update(Emp emp);
}

查询操作:

步骤:
  1. 在mapper接口中,定义一个查询数据的抽象方法;
  2. 在查询数据的方法上添加注解@Select;
  3. 返回的数据可以使用对应的实体类中来封装;
数据封装:
  • 起别名:在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样;
@Select("select id, username, password, name, gender, image, job, entrydate, dept_id deptId, create_time createTime, update_time updateTime from emp where id=#{id}")
public Emp getById(Integer id);
  • 手动结果映射:通过@Results及@Result进行手动结果映射;
    • column表示数据库字段名,property表示实体类属性名;
@Select("select * from emp where id=#{id}")
@Results({
        @Result(column="dept_id",property = "deptId"),
        @Result(column="create_time",property = "createTime"),
        @Result(column="update_time",property = "updateTime")
})
public Emp getById(Integer id);
  • 开启驼峰命名:如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射
    • 在application.properties中设置;
#开启驼峰命名:如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射;
mybatis.configuration.map-underscore-to-camel-case=true
concat()函数:
  • mysql自带的函数;
  • 将concat()中的参数拼接在一起;

XML映射文件:

规范:

  • XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名);

  • XML映射文件的banespace属性为Mapper接口全限定名一致;
  • XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致;

格式:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

属性:

属性 描述
id 在命名空间中唯一的标识符,可以被用来引用这条语句;
resultType 单条记录所封装的类型;如果是集合,那应该设置为集合包含的类型,而不是集合本身的类型

插件:

PageHelper分页插件:

  • 引入依赖:
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.6</version>
</dependency>
  • 使用:
PageHelper.startPage(pageNum,pageSize);//参数一:页数;参数二:分页记录数
List<Emp> list = empMapper.list();
Page<Emp> page = (Page<Emp>)list;
  • 与分页有关的都是插件来实现的,只需要写简单的查询就可以了;
posted @ 2023-11-24 17:52  回家太晚太悲催  阅读(12)  评论(0编辑  收藏  举报