一、{}和${}的使用:
- 1、如果想向sql语句中拼接mysql关键字。只能使用${}
- 因为#{}是以值的形式放到sql语句中,它传入时会自动加一个 ‘’
案例:
如果要查询数据库中的User信息,将查询到的信息按照某一个 条件 进行排序输出
sql 语句:
select * from t_user group by #{排序条件} ${排序方式}
java语句:
* 查询所有用户,并且按照降序或升序排列
* @param param1 根据什么字段进行排序
* @param param2 传入的排序类型,升序(asc) 降序(desc)
*
* @return 返回排序好的User信息
*/
List<User> selectAllUserByAgeIsAseOrDesc(String param1,String param2);
这里有一个问题:
详见 csdn: mybatis问题小计——传入参数报错(Not Found)
- 2、表名拼接
- 案例:
- 加入要存储日志信息到数据库中,所有日志信息存储到一个数据表中,
数据量太大,影响查询效率,并且也不方便查询
这是时候就需要分表查询,将日期设置为log_日期(log_20230101)
这时就要用到${}
占位符进行拼接表名
- 加入要存储日志信息到数据库中,所有日志信息存储到一个数据表中,
- 案例:
- 3、批量删除:
- 删除的SQL语句是:
delete from t_user where id in(${id})
java语句:
int deleteButchById(String id);
如果传入一个字符串:“1,2,3,4,5”
使用${}
后,最终拼接的SQL 语句就是:delete from t_user in (1,2,3,4,5)
最终删除的就是id为1 2 3 4 5 的这几条记录
如果使用#{},拼接后的Java语句是:delete from t_user in (?)
传入id后,结果为:delete from t_user in ('1,2,3,4,5')
sql语句加了' '
导致出错
- 删除的SQL语句是:
- 4、模糊查询:
- like
使用${}
进行模糊查询
SQL语句:select * from t_user where name like '%${like}%'
java:
List<User> users = mapper.selectUserByLike("张");
最终拼接后:查询姓名中有张这个字的user
select * from t_user where name like '%张%'
使用#{}
进行模糊查询:
SQL语句:使用concat()
函数进行拼接
select * from t_user where name like concat('%',#{like},'%')
java:
List<User> users = mapper.selectUserByLike("张");
最终拼接后:查询姓名中有张这个字的user
- like
select * from t_user where name like ('%',?,'%')
select * from t_user where name like ('%',张,'%')
使用${}+concat()
进行模糊查询:【鸡肋】
SQL语句:使用concat()函数进行拼接
select * from t_user where name like concat('%','${like}','%')
java:
List<User> users = mapper.selectUserByLike("张");
最终拼接后:查询姓名中有张这个字的user
select * from t_user where name like ('%','张','%')
总结:
就这四种方式:
1、like '%${like}%'
2、like concat('%',#{like},'%')
3、like concat('%','${like}','%')
4、like '%'#{like}'%'
二、 起别名机制
使用<typeAlias>
标签【不推荐】
mybatis-config.xml文件:
<!--起别名机制-->
<typeAliases>
<!--属性 type是设置给那个类型取别名
alias是为这个类型起的别名>-->
<typeAlias type="mybatis.pojo.User" alias="User"></typeAlias>
<typeAlias type="mybatis.pojo.Log" alias="Log"></typeAlias>
</typeAliases>
XXXMapper.xml文件:
返回类型使用mybatis-config.xml文件中配置的别名
<select id="selectUserByName" resultType="User">
select id,name,age,sex
from t_user where name = #{name};
</select>
别名不区分大小写
注意:namespace不能使用别名
使用<package name = 在这里填要返回类型类所在的包">标签;
- 如:将com.hyp.pojo包下的所有类自动起别名 别名就是类的简名
<package name ="com.hyp.pojo>:
<!--起别名机制-->
<typeAliases>
<package name ="com.hyp.pojo>
</typeAliases>
三、mybatis-config.xml中的mappers标签
<mappers>
<mapper resource="userMapper.xml"/>
<mapper resource="logMapper.xml"/>
<mapper class=""/>
<mapper url=""/>
</mappers>
- mapper标签中,
- resource表示从项目的根路径加载
- class 可以写接口的全限定名,前提是
XXXMapper接口要和XXXMapper.xml文件放在同一个包下
XXXMapper.xml文件的文件名一定要和XXXMapper接口的接口名一致- 例如:
UserMapper
在mybatis.Mapper包
下
那么UserMapper.xml文件就要放在同一目录下
在resource目录下创建目录 mybatis/Mapper
这样就可以在mybatis-config.xml文件中的Mapper使用 class 配置
- 例如:
但是有一个问题,如果存在10000个pojo类,那我们要写10000个mapper标签吗?
不是,使用package这个标签只需要给这个标签的name属性赋值为 接口所在包的包名就可自动配置所有接口的XXXMapper.xml文件
如:
<package name = "mybatis.Mapper">
<mappers>
<package name = "mybatis.Mapper">
</mappers>
注意:
使用class 和 package 需要在resources目录下建目录在resources下创建目录时,不能像创建包一样:
com.hyp.mybatis……
而需要这样:
com/hyp/mybatis……
四、创建模板文件
打开IDEA的Serring选项找到editor下的File额 and Templates
五、获取自动生成的主键
应用场景:
- 一个人对应多种职位,在插入这个人的同时插入这个人的职位。
- 在另一张表中,设置外键为人员表的id属性,然后获取插入的人的信息的id,给另一张表的外键属性赋值
使用:
在xml文件中:
属性:userGeneratedKey
使用自动生成的主键值
KeyProperty
指定主键值赋值给对象的那个属性,
这个就是赋值给User对象的id属性
<insert id="insertUserUseGenerateKey" useGeneratedKeys="true" keyProperty="id">
insert into t_user(id,name,age,sex) value (null,#{name},#{age},#{sex})
</insert>
@Test
public void testInsertUserUseGenerateKey(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(null, "小韩1", 21, "男");
mapper.insertUserUseGenerateKey(user);
System.out.println(user.getId());
sqlSession.commit();
MybatisUtils.close(sqlSession);
}
运行结果: