Mybatis

一、MyBatis

1.MyBatis是一款优秀的持久层框架,用于简化JDBC的开发。

2.官网:https://mybatis.org/mybatis-3/zh/index.html

二、JDBC

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

image-20230722191740989

2.本质:

(1)sun公司官方定义的一套操作所有关系型数据库的规范,即接口;

(2)各个数据库厂商去实现这套接口,提供数据库驱动jar包;

(3)我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的驱动类。

三、数据库连接池

1.数据库连接池

(1)数据量库连接池是个容器,负责分配、管理数据库连接(Connection);

(2)它允许应用重复使用一个现有的数据库连接,而不是再建立一个;

(3)释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏。

2.优势

(1)资源重用;

(2)提升系统响应速度;

(3)避免数据库连接遗漏。

3.标准接口:DataSource

(1)官方(sun)提供的数据库连接池接口,由第三方组织实现此接口。

(2)功能:获取链接。

4.Druid(德鲁伊)

(1)Druid连接池是阿里巴巴开源的数据库连接池项目;

(2)功能强大,性能优秀,是Java语言最好的数据库连接池之一。

(3)切换Druid数据库连接池:

官方网址:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter

image-20230722194632343

四、lombok

1.Lombok是一个实用的Java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString的灭火方法,并可以自动化生成日志变量,简化java语言开发、提高效率。

image-20230722195541602

image-20230722200334828

2.注意事项:Lombok会在编译时,自动生成对应的java代码。当我们使用lombok时,还需要安装一个lombok的插件(idea自带)。

五、Mybatis基础操作

1.删除

(1)接口方法:

​ @Delete("delete from emp where id = #{id}")

​ public void delete(Integer id);

(2)注意事项:如果mapper接口方法只有一个普通类型的参数,#{...}里面的属性名可以随便写,如#{id}、#{value}。

2.预编译SQL

(1)性能更高;

image-20230724103620030

(2)更安全(防止SQL注入)。

SQL注入:通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。

3.参数占位符

(1)#{...}:

  • 执行SQL时,会将#{...}替换为?,生成预编译SQL,会自动设置参数值;
  • 使用时机:参数传递,都使用#{...};

(2)${...}:

  • 拼接SQL。直接将参数拼接在SQL语句中,存在注入问题;
  • 使用时机:如果对表名、列表进行动态设置时使用。

4.新增

(1)接口方法:

​ @Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +
​ "values (#{username},#{name},#{gender},#{image},#{jib},#{entrydate},#{deptId},#{createTime},#{updateTime})")
​ public void insert(Emp emp);
}

(2)主键返回:

  • 在数据添加成功后,需要获取插入数据库数据的主键。
  • 实现:@Options(keyProperty = "id",useGeneratedKeys = true)

5.更新

接口方法:

​ @Update("update emp set username = #{username},name = #{name},gender = #{gender}," +
​ "image = #{image},job = #{job},entrydate = #{entrydate},dept_id = #{deptId}," +
​ "create_time = #{createTime},update_time = #{updateTime} where id = #{id}")
​ public void update(Emp emp);

6.查询

(1)根据ID查询:

​ @Select("select * from emp where id =#{id}")
​ public Emp select(Integer id);

(2)条件查询:

​ @Select("select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and " +
​ "entrydate between #{begin} and #{end} order by update_time desc")
​ public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);

(3)参数名说明:

  • 在springBoot的2.x版本

    image-20230724152246728

  • 在springBoot的1.x版本/单独使用mybatis

    image-20230724152336767

7.数据封装

(1)实体类属性名和数据库查询返回的字段名一致,mybatis会自动封装;

(2)如果实体属性名和数据库查询返回的字段名不一致,不能自动封装。

(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 select(Integer id);

  • 手动结果映射:通过@Results及@Result进行手动结果映射。

    image-20230724120727469

  • 开启驼峰命名(推荐):如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射。

    mybatis.configuration.map-underscore-to-camel-case=true

六、XML映射文件

1.规范:

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

(2)XML映射文件的namespace属性与Mapper接口全类名一致。

(3)XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。

2.使用Mybatis的注解,主要是来完成一些简单的增删改查功能。如果要实现复杂的SQL功能,建议使用XML来配置映射语句。

3.官方说明:https://mybatis.net.cn/getting-started.html

七、动态SQL

1.随着用户的输入或外部条件的变化而变化的SQL语句,我们称为动态SQL

2.<if>:

(1)用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则会拼接SQL。

(2)形式:<if test="name!=null">...</if>

3.<where>:where元素只会在子元素有内容的情况下才插入where子句。而且会自动去除字句开头的and或or。

4.<set>:动态的在行首插入set关键字,并会删除额外的逗号。(用在update语句中)

5.<foreach>:

(1)XML映射文件:

image-20230724165859379

(2)属性:

  • collection:集合名称;
  • item:集合遍历出来的元素/项;
  • separator:每一次遍历使用的分隔符;
  • open:遍历开始前拼接的片段;
  • close:遍历结束后拼接的片段。

6.<sql>:定义可重用的SQL片段。

7.<include>:通过属性refid,指定包含的sql片段。

posted @ 2023-07-24 17:14  __YJC  阅读(48)  评论(0)    收藏  举报