您的位置:首页 > 娱乐 > 八卦 > Mybatis

Mybatis

2025/4/28 8:22:01 来源:https://blog.csdn.net/m0_56508224/article/details/140504214  浏览:    关键词:Mybatis

目录

一、Mybatis入门

1.JDBC

2.数据库连接池

3.lombok

二、基础操作

1.删除

根据主键删除

日志输出

预编译SQL 

2.新增

新增(主键返回)

3.更新 

4.查询

根据ID查询

数据封装

三、映射文件

四、动态SQL

:用于判断条件是否成立

:where元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND或OR

案例:完善更新员工功能

:动态的在行首插入SET关键字,并会删掉额外的逗号

sql片段


一、Mybatis入门

1.JDBC

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

2.数据库连接池

  • 数据库连接池是个容器,负责分配,管理数据库连接
  • 允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个

标准接口:DataSource

  • 官方sun提供的数据库连接池接口,由第三方组织实现

常见产品

  • Druid:阿里巴巴开源
  • Hikari(Springboot默认)

3.lombok


二、基础操作

1.删除

  • 根据主键删除
 //根据ID删除数据@Delete("delete from mybatis.emp where id = #{id}")public void delete(Integer id);
//    public int delete(Integer id);
  • 日志输出

  • 预编译SQL 

优势:性能高 安全性好(防止SQL注入)

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

2.新增

 //新增员工@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 void insert(Emp emp);
新增(主键返回)
  • 描述:在数据添加成功后,需要获取插入数据库数据的主键。
  • 如:添加套餐数据时,还需要维护套餐菜品关系表数据

  • 实现
//获取返回的主键 
@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 void insert(Emp emp);

3.更新 

  • SQL语句
update emp set username = '',name = '',gender = '',image = '',job = '',entrydate = '',dept_id = '',update_time = '' where id = 1;
  • 接口方法
   //更新员工@Update("update emp set username = #{username},name = #{name},gender = #{gender},image = #{image},job = #{job},entrydate = #{entrydate},dept_id = #{deptId},\n" +"               update_time = #{updateTime} where id = #{id}")public void update(Emp emp);

4.查询

根据ID查询
  • SQL语句
select * from emp where id = 20
  • 接口方法
 //根据ID查询员工@Select("select * from emp where id = #{id}")public Emp getById(Integer id);
数据封装

  • 解决方案
//方案一:给字段起别名,让别名与实体类属性一致
//    @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注解手动映射封装
//    @Results({
//            @Result(column = "dept_id",property = "deptId"),
//            @Result(column = "create_time",property = "createTime"),
//            @Result(column = "update_time",property = "updateTime")
//    })
//    @Select("select * from emp where id = #{id}")
//    public Emp getById(Integer id);//最简单:开启Mybatis的驼峰命名自动映射开关
mybatis.configuration.map-underscore-to-camel-case=true
  • 条件查询

SQL语句

-- 根据条件查询
select * from emp where name like concat('%','张','%') and gender = 1 and entrydate between '2010-01-01' and '2020-01-01' order by update_time desc ;

接口方法

@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);

三、映射文件

1.XML映射文件


四、动态SQL

  • <if>:用于判断条件是否成立

  • <where>:where元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND或OR

<!--resultType: 单条记录封装的类型--><select id="list" resultType="com.itheima.pojo.Emp"><include refid="commonSelect"/><where><if test="name != null">name like concat('%', #{name}, '%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if></where>order by update_time desc</select>

案例:完善更新员工功能

  • 需求:动态更新员工信息,如果更新时传递有值,则更新;如果更新时没有传递值,则不更新
 <!-- 动态更新员工--><update id="update2">update emp<set><if test="username != null">username = #{username},</if><if test="name != null">name = #{name},</if><if test="gender != null">gender = #{gender},</if><if test="image != null">image = #{image},</if><if test="job != null">job = #{job},</if><if test="entrydate != null">entrydate = #{entrydate},</if><if test="deptId != null">dept_id = #{deptId},</if><if test="updateTime != null">update_time = #{updateTime}</if></set>where id = #{id}</update>
  • <set>:动态的在行首插入SET关键字,并会删掉额外的逗号

  • <foreach>

   <!--批量删除员工 (18,19,20)--><!--collection: 遍历的集合item: 遍历出来的元素separator: 分隔符open: 遍历开始前拼接的SQL片段close: 遍历结束后拼接的SQL片段#{id}:每次遍历出来的元素--><delete id="deleteByIds">delete from emp where id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach></delete>
  • sql片段

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com