本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。
博客涉及框架的重要知识点,根据序号学习即可。
目录
本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。
1、重要标签
1.1动态SQL
(1)动态SQL是MyBatis的强大特性之一,能够完成不同条件下不同的sql拼接
(2)<if>标签
①当某个字段是必填字段或非必填字段时,如果有不确定的字段传入,那么程序应该如何实现?——使用<if>标签,对字段做出判断
②例子:
a、接口定义
Integer insertUserByCondition(UserInfo userInfo);
b、Mapper.xml实现
【对gender字段进行非空校验】
<insert id="insertUserByCondition">
insert into userinfo(username,password,age,
<if test="gender !=null"> gender, </if> phone)
values(#{username},#{password},#{age},
<if test="gender !=null"> #{gender}, </if> #{phone})
</insert>
c、注解方式
直接把上面的内容,使用<script></script>标签括起来就可以了,非常不推荐!!!
(3)<trim>标签
①上述的插入用户的功能,只是有一个gender字段可能是选填项,如果有多个字段,一般考虑使用标签结合标签,对多个字段都采取动态生成的方式
②标签中由如下属性:
prefix:表示整个语句块,以prefix的值作为前缀
suffix:表示整个语句块,以suffix的值作为后缀
prefixOverrides:表示整个语句块要去除掉的前缀
suffixOverrides:表示整个语句块要去除掉的后缀
③调整上述的Mapper.xml
<insert id="insertUserByCondition">
insert into userinfo
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="username !=null"> username, </if>
<if test="password !=null"> password, </if>
<if test="age !=null"> age, </if>
<if test="gender !=null"> gender, </if>
<if test="phone !=null"> phone </if>
</trim>
values
<trim prefix="(" suffix=")" suffixOverrides=",">
(#{username},#{password},#{age},
<if test="username !=null"> #{username}, </if>
<if test="password !=null"> #{password}, </if>
<if test="age !=null"> #{age}, </if>
<if test="gender !=null"> #{gender}, </if>
<if test="phone!=null"> #{phone}</if> )
</trim>
</insert>
(4)<where>标签
①根据属性做where条件查询时,可以使用<where>标签
②例子:
a、接口定义
List<UserInfo> queryByCondition();
b、Mapper.xml实现
<select id="queryByCondition" resultType="UserInfo">
select id,username,age,gender,phone,delete_flag
from userinfo
<where>
<if test="username != null"> and name = #{username},</if>
<if test="age != null">and age = #{age},</if>
<if test="delete_flag != null">and delete_flag = #{deleteFlag},</if>
</where>
</select>
(5)<set>标签
①根据传入的属性来更新数据,可以使用标签来指定动态内容
②例子:
a、接口定义
Integer updateUserByCondition(UserInfo userInfo)
b、Mapper.xml实现:
<update id="updateUserByCondition">
update userinfo
<set>
<if test="username != null"> name = #{username},</if>
<if test="age != null"> age = #{age},</if>
<if test="delete_flag != null"> delete_flag = #{deleteFlag},</if>
</set>
where id = #{id}
</update>
③<set>:动态的在SQL语句中插入set关键字,并会删除额外的逗号(用于更新语句中),这个标签也可以使用<trim prefix="set" suffixOverrides=",">替换
(6)<foreach>标签
①对集合进行遍历可以使用该标签。标签有如下属性:
collection:绑定方法参数中集合,如List,Set,Map或数组对象
item:遍历时的每一个对象
open:语句块开头的字符串
close:语句块结束的字符串
separator:每次遍历之间间隔的字符串
②例子:
a、接口定义
void deleteById(List<Integer> ids);
b、Mapper.xml实现
<delete id="deleteByIds">
delete from userinfo where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
(7)<include>标签
①在xml映射文件中配置的SQL,有时会存在很多重复的片段,此时就会有很多冗余的代码,我们可以将重复的代码进行抽取,通过<sql>标签封装SQL片段,然后在通过<include>标签进行引用
②<sql>:定义可重用的的SQL片段
<include>:通过属性refid,指定包含的SQL片段
③例子
<sql id="commonSelect">
select id,name,gender,birthday from student
</sql>
<!--根据id查询学生-->
<select id="getById" resultType="org.fanhuiling.pojo.Student">
<include refid="commonSelect"></include>
where id=#{id}
</select>
1.2 其他
2、#{}与${}的区别
2.1 #{}与${}的使用
(1)使用Integer作为参数
① #{ }为参数赋值
@Select("select username,password,age,gender,phone from userinfo where id=#{ }")
UserInfo queryById(Integer id);
打印SQL语句日志如下:
select username,password,age,gender,phone from userinfo where id=?
我们输入的参数id 并没有在后面拼接,而是使用?进行占位,这种就称为预编译SQL
② ${ }为参数赋值
@Select("select username,password,age,gender,phone from userinfo where id=${ }")
UserInfo queryById(Integer id);
打印SQL语句日志如下:
select username,password,age,gender,phone from userinfo where id=1
我们输入的参数1就直接与SQL语句进行了拼接
(2)使用String作为参数
① #{ }为参数赋值
@Select("select username,password,age,gender,phone from userinfo where username=#{ }")
UserInfo queryByName(String name);
打印SQL语句日志如下:
select username,password,age,gender,phone from userinfo where username=?
② ${ }为参数赋值
@Select("select username,password,age,gender,phone from userinfo where username=${ }")
UserInfo queryByName(String name);
打印SQL语句日志如下:
select username,password,age,gender,phone from userinfo whereusername=zhansan
我们输入的参数zahnsan拼接在SQL 语句后了,但是这样操作会报错,因为zhangsan是字符串,在SQL语句中应该用引号包裹,然而使用${ }不会拼接单引号' ',所以程序会报错。不过可手动添加引号,不推荐!!
2.2 #{}与${}的区别
(1)#{ }使用的是预编译SQL,通过?占位的方式,提前对SQL进行编译,然后把参数填充到SQL语句中,#{ }会根据出纳书类型,自动拼接单引号
(2) ${ }会直接进行字符串替换,一起对SQL进行编译。如果参数为字符串类型,需要手动添加上引号
(3)#{ }是预编译SQL,而${ }是即时SQL
(4)更推荐使用预编译SQL,一是性能更高【预编译SQL,编译一次后就会把SQL语句给缓存起来,后面需要再次使用该SQL语句时,不会再次编译,只是输入的参数不同罢了,省去了解析优化的过程,以此来提高效率】,二是更安全【防止SQL注入,正常情况下where name="admin"是可以正常登录的,但是将"admin"改成" ' or 1='1' "=》where name =' ' or 1='1'始终为真,也可以登录,这就是SQL注入的典型例子】
3、配置文件
3.1 配置日志
# 配置 mybatis 的日志,指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
3.2 配置大驼峰
# 开启 mybatis 的驼峰命名自动映射开关
mybatis.configuration.map-underscore-to-camel-case=true
3.3配置映射文件路径
# 配置 mybatis 的映射文件路径(需要修改成对应值)
mybatis.mapper-locations=classpath*:mapper/*.xml
4、数据库连接池
4.1 什么是数据库连接池
(1)数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接池,而不是重新创建一个新的
①无连接池:每次执行SQL语句,要先创还能一个新的连接对象,然后执行SQL语句,SQL语句执行完,再关闭连接对象释放资源,这种重复的创建连接、销毁连接比较消耗资源
②有连接池:程序启动时,会在数据库连接池中创建一定数量的Connection对象,当客户请求数据库连接池,会从数据库连接池中获取Connection对象,然后执行SQL、SQL语句执行完毕后,再把Connection归还给连接池
(2)作用:使用数据库连接池,避免频繁的创建连接,销毁连接
(3)优点:减少了网络开销;资源重用;提升了系统的性能
4.2 使用
(1)常见的数据库连接池:C3P0、DBCP、Druid、Hikari
(2)目前比较流行的是Druid、Hikari,SpringBoot默认是Hikari(日本研发的, 大NO特NO),咱们还是使用优秀的阿里巴巴开发的Druid连接池吧!直接在pom.xml文件里面添加相应依赖即可使用
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
5、MySQL数据库开发企业规范
5.1 表名规范
(1)表名,字段名使用小写字母或数字,单词之间用下划线分割。尽量避免出现数字开头或者两个下划线中间只出现数字。数据库字段名的修改代价很大,所以字段名是需要慎重考虑的
(2)MySQL在Windows下不区分大小写,但是在Linux下默认是区分大小写的,所以,最好数据库名,表名,字段名都是小写
5.2 表的设计规范
(1)在表的设计中,除了实体需要的字段名之外,还需要必备的三字段:id、create_time、update_time【id为自增主键,步长为1;create_time、update_time的类型均为datetime,create_time为创建时间,update_time为更新时间】
(2)有同等含义的字段即可,字段名不做强制要求
5.3 表的查询
在表的查询中,避免使用*作为查询的字段列表,select * 是一个非常危险的操作,当数据量特别大的时候,还没有查询完,内存就占满了,真的真的特别危险,所以在查询时最好表明需要哪些字段