- 一、实体类属性名 和 数据库表列名 不一致,不能自动封装数据
- 1、起别名
- 2、resultMap
- 3、小结
- 二、sql的参数问题
- 1、占位符
- 2、传递多个参数的方式(要不就是实体类映射,要不就是@Param)
- 3、使用map集合(不常用)
- 三、mybatis-动态sql
- 2.1 、where 标签和 if 标签
- 2.2、where 标签
- 2.3、choose (when, otherwise)
- 2.4、trim (where, set)
- 2.5、foreach
- 四、mybatis注解开发和xml开发
一、实体类属性名 和 数据库表列名 不一致,不能自动封装数据
数据库中的字段名以—来命名的时候,这个时候实体类的驼峰命名方式就与数据库表的字段名无法映射成功
解决办法:
利用sql片段给字段名起别名,并且提高复用性
id, brand_name as brandName, company_name as companyName, ordered, description, status
在sql语句中使用include标签进行引用
2、resultMapselect from tb_brand;
使用resultMap来定义字段和属性的映射关系
sql语句的编写
自动生成resultMap 的方法
-
在mybatis-config的配置文件中加上
```注意,settings的位置在configuration标签的第一个 -
在mapper.xml文件中,定义resultMap 标签,开启autoMapping
就可以自动的匹配下换线驼峰
3、小结
- ==起别名:==在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样
- 可以定义 片段,提升复用性
- ==resultMap:==定义 完成不一致的属性名和列名的映射
-
#{} :执行SQL时,会将 #{} 占位符替换为?,将来自动设置参数值。从上述例子可以看出使用#{} 底层使用的是 PreparedStatement
-
${} :拼接SQL。底层使用的是 Statement,会存在SQL注入问题。
我们还是直接使用的是#{}
- 特殊字符的问题
映射配置文件是xml类型的问题,而 > < 等这些字符在xml中有特殊含义,所以此时我们需要将这些符号进行转义,所以我们要先进行转义
放入CDATA里面的内容中的特殊的字符,会自动的进行转义
2、传递多个参数的方式(要不就是实体类映射,要不就是@Param)
- 使用@param
@Param里面的内容要与sql语句中的占位符的名称一致,告诉编译器,userName的值是传递给userName所占的那个?
ListTremFind1(@Param("userName") int userName);
**当传递一个参数的时候,一定要加上@Param **
- 将要传递的参数进行封装,封装为一个对象,传递对象
ListTremFind(Brand brand);
注意,使用封装对象进行传递的时候,要保证对象中的成员变量与sql语句中的占位符中的名称一致,这样才能映射成功
例:
第一个占位符的名称为brandName,那么被封装的实体类中的成员变量名称也必须为brandName
concat 是mysql的拼接函数
3、使用map集合(不常用)如果mapper接口方法是单个map集合类型,不需要加@Param注解,映射配置文件中#{}中名称需要和map集合的键名保持一致
将要传递的参数存储到map集合中,要注意的是,map集合的key值必须和sql语句中的占位符的名称一致,才能保证映射成功,将值传递成功。
将要传递的参数封装进map集合
Map map = new HashMap();
map.put("status" , status);
map.put("companyName", companyName);
map.put("brandName" , brandName);
- 小结
相对于三种方式,我们常用的还是是前二种(@Param和实体类)
1、为什么使用动态sql呢?
当我们进行多条件查询的时候,用户肯定不会所有的条件都填写,这个时候我们的SQL语句就不能那样写的,动态sql就出现啦
2、Mybatis对动态SQL有很强大的支撑:
-
if
-
choose (when, otherwise)
-
trim (where, set)
-
foreach
if 标签:条件判断
- test 属性:逻辑表达式
如上的这种SQL语句就会根据传递的参数值进行动态的拼接
判断之后执行的sql语句就变成了
select * from tb_brand WHERe brand_name like concat('%',?,'%')
2.2、where 标签
- 作用:
- 替换where关键字
- 会动态的去掉第一个条件前的 and
- 如果所有的参数没有值则不加where关键字
select * from tb_brand and brand_name like concat('%',#{brandName},'%') and company_name like concat('%',#{companyName},'%') and status = #{status}
注意,使用where标签的时候需要给每个条件前都加上 and 关键字。where会动态的去掉第一个and
2.3、choose (when, otherwise)我们不想使用所有的条件,而只是想从多个条件中选择一个使用,这个时候就要使用choose 标签了
如上图所示,在查询时只能选择 品牌名称、当前状态、企业名称 这三个条件中的一个,但是用户到底选择哪儿一个,我们并不能确定。这种就属于单个条件的动态SQL语句。
这种需求需要使用到 choose(when,otherwise)标签 实现, 而 choose 标签类似于Java 中的switch语句。
otherwise标签就类似于switch 的default 当都不满足的时候就返回otherwise标签中的内容
2.4、trim (where, set) 2.5、foreach动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)
比如:查询多个条件的sql语句
- item:表⽰集合中每⼀个元素进⾏迭代时的别名;
- index:指定⼀个名字,⽤于表⽰在迭代过程中,每次迭代到的位置;
- open:表⽰该语句以什么开始;
- separator:表⽰在每次进⾏迭代之间以什么符号作为分隔 符;
- close:表⽰以什么结束;
- collection:要遍历的集合
遍历foreach时的一个问题,如果传递的集合时空集合,这个时候就会报错,解决办法
使用 if 或者 choose 标签,对集合进行判断
test="list.size >0 and list !=null"
例如
四、mybatis注解开发和xml开发
注解开发——适合简单的sql语句
- @Insert()
@Delete()
@Update()
@Select()
xml配置文件
语句复杂的
引用官网的一句话:
使用注解来映射简答语句会使代码显得更加简洁,但对于稍微复杂一点的语句,java注解不仅力不从心,还会让你本来就复杂的SQL语句更加混乱不堪,因此,如果你需要做一些很复杂的操作,最好用xml来操作语句
永远不要拘泥于一种方式,你可以很轻松的在基于注释和XML的语句映射方式自由移植和切换



