赞
踩
@Select("select id,username,delete_flag as deleteFlag,create_time as createTime,update_time as updateTime from userInfo")
List<UserInfo> selectUserInfo();
@Results(id = "resultMap", value = {
@Result(column = "delete_flag", property = "deleteFlag"),
@Result(column = "create_time", property = "createTime"),
@Result(column = "update_time", property = "updateTime")
})
@Select("select * from userInfo")
List<UserInfo> selectUserInfo2();
配置一次之后下一次就可以直接使用这个对应关系.
@ResultMap("resultMap")
@Select("select * from userInfo")
public List<UserInfo> getUserInfoAll();
此处的参数和指定结果映射中的id相对应.
mybatis:
configuration:
map-underscore-to-camel-case: true #自动驼峰转换
List<UserInfo> selectAll2();
<resultMap id="BaseMap" type="com.tuanzi.ssm.springmybatis.model.UserInfo">
<id column="id" property="id"/>
<result column="delete_flag" property = "deleteFlag"/>
<result column = "create_time" property = "createTime"/>
<result column = "update_time" property = "updateTime"/>
</resultMap>
<select id="selectAll2" resultMap="BaseMap">
select * from userInfo
</select>
@Select("select * from userinfo where id=#{id}")
List<UserInfo> getUserInfoById(Integer id);
@Select("select * from userinfo where id=${id}")
List<UserInfo> getUserInfoById2(Integer id);
从${}的运行结果我们可以看出此时的传参变成了直接拼接字符串.并会不跟据传入参数的类型来进行灵活转化.
@Select("select * from userinfo where username = #{userName}")
List<UserInfo> getUserInfoByUsername(String userName);
@Select("select * from userinfo where username = ${userName}")
List<UserInfo> getUserInfoByUsername2(String userName);
#{}运行结果:
此时代码正常执行,正确执行的sql语句为: select * from userinfo where username = ‘admin’
${}运行结果:
此时代码执行会报错, 报的是SQLSyntaxErrorException, 由上述的图片我们可以看出直接拼接的内容与正确的sql的差别, 缺少’'/“”
#{} 使用的是预编译SQL, 通过 ? 占位的方式, 提前对SQL进行编译, 然后把参数填充到SQL语句中. #{} 会根据参数类型, 自动拼接引号 ‘’ .${} 会直接进行字符替换, 一起对SQL进行编译. 如果参数为字符串, 需要加上引号 ‘’
由于没有对用户输入进行充分检查,而SQL又是拼接而成,在用户输入参数时在参数中添加⼀些SQL关键字,达到改变SQL运行结果的目的,也可以完成恶意攻击。
' or 1='1
@Test
void queryByName() {
List<UserInfo> userInfos = userInfoMapper.queryByName("' or 1='1");
System.out.println(userInfos);
}
可以看出来, 查询的数据并不是自己想要的数据. 假设如果这是用户的登录,那么即使在不知道用户密码的情况下,也可以通过sql注入进行登录所以用于查询的字段,尽量使用 #{} 预查询的方式. SQL注入是⼀种非常常见的数据库攻击手段, SQL注入漏洞也是网络世界中最普遍的漏洞之一.
@Select("select * from userInfo order by id #{order} ")
List<UserInfo> selectUserInfoOrder(String order);
//也存在sql注入的问题,解决方法,可以使用穷举的方式进行校验.
//也可以定义两个接口直接写死
@Select("select * from userInfo order by id ${order} ")
List<UserInfo> selectUserInfoOrder2(String order);
@Select("select id, username, age, gender, phone, delete_flag, create_time,
update_time " +"from userinfo where username like '%#{key}%' ")
List<UserInfo> queryAllUserByLike(String key);
此时代码执行会报错,很明显多了一个’', 如果把#{}改成${}可以解决问题,但会出现SQL注入的风险,解决方法是使用concat函数来解决问题
@Select("select id, username, age, gender, phone, delete_flag, create_time,
update_time " +"from userinfo where username like concat('%',#{key},'%')")
List<UserInfo> queryAllUserByLike(String key);
数据库连接池: 是用于管理数据库连接的一种技术,它允许应用程序重复使用现有的数据库连接,而不是为每次操作重新建立连接。
数据库连接池通过维护一定数量的数据库连接,对外提供获取和返回连接的方法,避免了频繁创建和释放数据库连接所带来的性能开销。在多用户网络应用中,数据库连接是一种关键的、昂贵的资源。如果每次操作都打开一个物理连接,并在使用后关闭,会导致系统性能低下。为了解决这个问题,连接池技术被提出和应用.
连接池的工作原理
连接池的注意事项
SpringBoot默认使用的是hikari数据库连接池
常见的数据库连接池
Druid的maven依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>1.2.21</version>
</dependency>
此时的运行结果:
Integer insertUserByCondition(UserInfo userInfo);
Mapper.xml实现:
<insert id="insertUserByCondition"> INSERT INTO userinfo ( username, `password`, age, <if test="gender != null"> gender, </if> phone) VALUES ( #{username}, #{age}, <if test="gender != null"> #{gender}, </if> #{phone}) </insert>
<insert id="insertUserInfoByCondition"> insert into userinfo <trim prefix="(" suffix=")" prefixOverrides=","> <if test="username!=null"> username </if> <if test="password!=null"> ,password </if> <if test="age!=null"> ,age </if> <if test="gender!=null"> ,gender </if> </trim> values <trim prefix="(" suffix=")" prefixOverrides=","> <if test="username!=null"> username </if> <if test="password!=null"> ,password </if> <if test="age!=null"> ,age </if> <if test="gender != null"> ,#{gender} </if> </trim> </insert>
此时就可以根据传的值来动态调整SQL语句了.
<select id="queryUserInfoByCondition" resultType="com.tuanzi.ssm.springmybatis.model.UserInfo">
select * from userinfo
<where>
<if test="age!=null">
age = #{age}
</if>
<if test="gender!=null">
and gender = #{gender}
</if>
<if test="deleteFlag!=null">
and delete_flag = #{deleteFlag}
</if>
</where>
</select>
只会在子元素有内容的情况下才插入where子句,而且会自动去除子句开头的AND或OR 以上标签也可以使用 替换, 但是此种情况下, 当子元素都没有内容时, where关键字也会保留
<update id="updateUserInfoByCondition"> update userInfo <set> <if test="password!=null"> password = #{password} </if> <if test="age!=null"> ,age = #{age} </if> <if test="gender!=null"> ,gender = #{gender} </if> </set> where id = #{id} </update>
<delete id="batchDeleteByIds">
delete from userinfo where id in
<foreach collection="ids" open="(" close=")" item="id" separator=",">
#{id}
</foreach>
</delete>
<sql id="selectAllUserInfo">
select * from userInfo
</sql>
<select id="selectAll" resultType="com.tuanzi.ssm.springmybatis.model.UserInfo">
<include refid="selectAllUserInfo"></include>
</select>
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。