Mybatis小技巧
#{}和${}
-
#{}:先编译sql语句,再给占位符传值,底层是PreparedStatement实现。可以防⽌sql注⼊,⽐较常⽤。
-
${}:先进⾏sql语句拼接,然后再编译sql语句,底层是Statement实现。存在sql注⼊现象。只有在需要 进⾏sql语句关键字拼接的情况下才会⽤到。
-
如果需要SQL语句的关键字放到SQL语句中,只能使用${},因为#{}是以值的形式放到SQL语句当中。如:选择升序还是降序,asc和desc传进去
拼接表名
实际开发中,有的表数据量⾮常庞⼤,可能会采⽤分表⽅式进⾏存储,⽐如每天⽣成⼀张 表,表的名字与⽇期挂钩,例如:2022年8⽉1⽇⽣成的表:t_user20220108。2000年1⽉1⽇⽣成的 表:t_user20000101。此时前端在进⾏查询的时候会提交⼀个具体的⽇期,⽐如前端提交的⽇期为: 2000年1⽉1⽇,那么后端就会根据这个⽇期动态拼接表名为:t_user20000101。有了这个表名之后,将 表名拼接到sql语句当中,返回查询结果。
需要用${}
<mapper namespace="com.xit.mybatis.mapper.LogMapper">
<select id="selectAllByTable" resultType="com.xit.mybatis.pojo.Log">
select * from t_log_${date}
</select>
</mapper>
批量删除
/** * 批量删除 * @param ids * @return */ int deleteMore(@Param("ids") String ids);
<!--int deleteMore(@Param("ids") String ids);--> <delete id="deleteMore"> delete from t_user where id in (${ids}) </delete>
模糊查询:LIKE
需求:根据汽车品牌进行模糊查询
SELECT* FROM T_CAR WHERE BRAND LIKE'%奔驰%';
SELECT * FROM T_CAR WHERE BRAND LIKE '%比亚迪%';
第一种方案:
%${BRAND]%
第二种方案:CONCAT函数,这个是MYSQL数据库当中的一个函数,专门进行字符串拼接
CONCAT('%',#{BRAND},'%')
第三种方案:
CONCAT('%','${BRAND}','%')
第四种方案:
% BRAND]T%
4.模糊查询:like
需求:根据汽车品牌进行模糊查询
select *from t_car where brand like '%奔驰%';
select *from t car where brand like '%比业迪%';
第一种方案:
'%${brand}%'
第二种方案:
concat函数,这个是mysql数据库当中的一个函数,专门进行字符串拼接concat('%',#{brand},'%')
第三种方案:
concat('%','${brand}','%')
第四种方案:
"%"#{brand}"%"
resultType取别名
注意标签位置,要在properties后面
typeAlias
<configuration>
<properties resource="jdbc.properties"/>
<!-- 起别名-->
<typeAliases>
<typeAlias type="com.xit.mybatis.pojo.Car" alias="aaa"/>
</typeAliases>
</configuration>
package
<typeAliases>
<!--将这个包下的所有的类全部自动起别名。别名就是类简名。不区分大小写。.-->
<package name="com.powernode.mybatis.pojo"/>
</typeAliases>
resultMap
<--若字段名和实体类中的属性名不一致,则可以通过resultMap设置自定义映射
resultMap:设置自定义映射
属性:
id:表示自定义映射的唯一标识
type:查询的数据要映射的实体类的类型
子标签:
id:设置主键的映射关系
result:设置普通字段的映射关系
association:设置多对一的映射关系
collection:设置一对多的映射关系
属性:
property:设置映射关系中实体类中的属性名
column:设置映射关系中表中的字段名
-->
<resultMap id="userMap" type="User">
<id property="id" column="id"></id>
<result property="userName" column="user_name"></result>
<result property="password" column="password"></result>
<result property="age" column="age"></result>
<result property="sex" column="sex"></result>
</resultMap>
<!--List<User> testMohu(@Param("mohu") String mohu);-->
<select id="testMohu" resultMap="userMap">
<!--select * from t_user where username like '%${mohu}%'-->
select id,user_name,password,age,sex from t_user where user_name like concat('%',#{mohu},'%')
</select>
若字段名和实体类中的属性名不一致,但是字段名符合数据库的规则(使用_),实体类中的属性名符合Java的规则(使用驼峰)此时也可通过以下两种方式处理字段名和实体类中的属性的映射关系.
-
可以通过为字段起别名的方式,保证和实体类中的属性名保持一致.
-
可以在MyBatis的核心配置文件中设置一个全局配置信息mapUnderscoreToCamelCase,可以在查询表中数据时,自动将_类型的字段名转换为驼峰.
例如:字段名user_name,设置了mapUnderscoreToCamelCase,此时字段名就会转换为userName
插⼊数据时获取⾃动⽣成的主键
场景模拟: t_clazz(clazz_id,clazz_name) t_student(student_id,student_name,clazz_id)
-
添加班级信息
-
获取新添加的班级的id
-
为班级分配学生,即将某学的班级id修改为新添加的班级的id
/**
* 添加用户信息
* @param user
* @return
* useGeneratedKeys:设置使用自增的主键
* keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参
数user对象的某个属性中
*/
int insertUser(User user);
<!--int insertUser(User user);-->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
insert into t_user values(null,#{username},#{password},#{age},#{sex})
</insert>
动态设置表名
/**
* 动态设置表名,查询所有的用户信息
* @param tableName
* @return
*/
List<User> getAllUser(@Param("tableName") String tableName);
<!--List<User> getAllUser(@Param("tableName") String tableName);-->
<select id="getAllUser" resultType="User">
select * from ${tableName}
</select>