入门
配置SQL提示
JDBC介绍
JDBC:(Java DataBase Connectivity),就是使用Java语言操作关系型数据库的一套API
本质
sun公司官方定义的一套操作所有关系型数据库的规范,即接口
各个数据库厂商去实现这套接口,提供数据库驱动jar包
我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
数据库连接池
数据库连接池是个容器,负责分配、管理数据库连接(Connection)
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏
优势
资源重用
提升系统响应速度
避免数据库连接遗漏
标准接口:DataSource
官方(sun)提供的数据库连接池接口,由第三方组织实现此接口
功能:获取连接 Connection getConnection() throws SQLException;
切换Druid数据库连接池
lombok
Lombok是一个实用的]ava类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率
原理:在程序编译的时候根据上面的注解来决定为这个类生成什么样的方法
注意事项
Lombok会在编译时,自动生成对应的java代码。我们使用lombok时,还需要安装一个lombok的插件(idea自带)
基础操作
准备
1.准备数据库表 emp
2.创建一个新的springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动、lombok)
3.application.properties中引入数据库连接信息
4.创建对应的实体类 Emp(实体类属性采用驼峰命名)
5.准备Mapper接口 EmpMapper
删除
Delete语句在执行时是有返回值的,只不过目前不需要所以设置成了void,如果有返回值,该返回值代表的含义是此次操作影响的记录数
如何拿到返回值:
注意事项
如果mapper接口方法形参只有一个普通类型的参数,#{..}里面的属性名可以随便写,如:#{id}、#{value}
“?”是参数占位符,这条SQL语句在运行的时候会使用下面这条参数(16)来替换掉上面的参数占位符,然后删除ID为16的这条员工信息
Updates为0代表的是当前操作的记录数为0,因为之前ID为16的数据已经删除掉了
#{id}会被?替代生成这样一个预编译的SQL,那么在执行的时候会把SQL语句以及下面的16一同发送给数据库,数据库在执行这样的SQL语句的时候会把16替换掉?,来删除ID为16的员工信息
预编译SQL
优势:
性能更高
更安全(防止SQL注入)
SQL注入
SQL注入是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法
count值大于0代表用户名和密码都正确,为0代表其中一个错误
在预编译的SQL语句中,无论输入什么样的字符串,他会把整个字符串作为一个参数传递给password,这样就避免了SQL注入问题,安全性更高
如果选择的是Mybatis这样的框架,怎样选择预编译的SQL语句呢?
只需要在定义SQL语句的时候使用#{...}这个占位符,那么最后生成的就是预编译的SQL语句,#{...}最终会被?代替
参数占位符
(性能较低,存在SQL注入的问题)
小结
新增
如果有多个参数,可以使用实体类将多个参数封装起来,在SQL语句当中就可以使用#{...}这样的参数占位符的形式来获取这个对象当中的属性。属性名都是使用驼峰命名的,不要写成字段名
主键返回
描述:在数据添加成功后,需要获取插入数据库数据的主键。如:添加套餐数据时,还需要维护套餐菜品关系表数据
小结
上图解析:
先定义一个接口方法,在上面加入@insert注解(insert代表执行的是一个插入操作),然后定义一个insert语句(如上图);由于插入时要传入的参数比较多,推荐使用一个实体对象进行封装,然后在SQL语句中使用#{...}来获取传入进来的一个一个的属性值,大括号内写入的是属性名而不是字段名;插入完成之后需要获取返回的主键就需要插入一个@Options注解,然后指定两个属性:useGeneratedKeys代表的是要获取返回来的主键;keyPropety代表的是返回来的主键往emp对象中的那个属性封装<指定id就是往id属性封装>
更新
查询
根据ID查询
后三个值为null的原因:
实体类属性名 和 数据库表查询返回的字段名一致,mybatis会自动封装
如果实体类属性名 和 数据库表查询返回的字段名不一致,不能自动封装
解决方案:
column是字段名,property是属性
数据封装
条件查询
%表示模糊查询,但是#{}不能出现在‘’内,因为#{}最终生成的是预编译的SQL,最终是要被?替代的,而?这个参数占位符是不能出现在''内的
修改:
如何解决上面问题?
此时生成的SQL语句就是预编译的SQL语句
参数名说明
XML映射文件
规范
XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)
XML映射文件的namespace属性为Mapper接口全限定名一致
XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致
动态SQL
随着用户的输入或外部条件的变化而变化的SQL语句,我们称为动态SQL
<if>
<if>:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL
<where>标签的作用:
1.动态生成where关键字:会根据子标签动态的判断里面的条件。如果里面的条件都不成立,就不会生成where关键字;如果有一个条件成立,就会生成where关键字
2.自动去除掉条件前面多余的and或者or
<foreach>
主要用于批量操作当中,用于循环遍历
#{id}代表每一次遍历出来的元素
属性
collection:集合名称
item:集合遍历出来的元素/项
separator:每一次遍历使用的分隔符
open:遍历开始前拼接的片段
close:遍历结束后拼接的片段
<sql><include>
<sql>:定义可重用的 SQL片段
<include>:通过属性refid,指定包含的sql片段