mybatis

### 1. 关于MyBatis的基本使用
 
1. 添加一系列依赖:`mysql-connector-java`、`commons-dbcp`、`junit`、`mybatis`、`mybatis-spring`、`spring-context/spring-webmvc`、`spring-jdbc`;
 
2. 关于配置:配置数据库连接、在Spring中读取数据库连接的配置、配置数据源、配置接口文件的位置、配置SQL语句的XML文件的位置及所使用的数据源;
 
3. 关于抽象方法:必须写在接口中;如果需要执行的操作是增、删、改类型的,使用`Integer`作为返回值类型,如果需要执行的操作是查询类型的,则将返回值声明为所期望的类型(能够封装查询结果的类型);方法的名称可以自定义,不允许重载;可以根据所执行的SQL语句中不确定的值(SQL语句中有哪些问号)来设计方法的参数列表,当方法的参数超过1个时,必须为每一个参数添加`@Param`注解,并在注解中指定名称;
 
4. 关于配置XML映射:XML的根节点必须有文档声明;根节点`<mapper>`必须配置对应的接口;根据需要执行的SQL语句的类型选择子级节点;如果执行的是增加数据的操作,可以配置`useGeneratedKeys="true"`和`keyProperty="属性名"`来获取自增的字段的值;如果执行的是查询操作,则必须配置`resultType`或`resultMap`中的1个属性(二选一),在配置`resultType`时,取值为返回值类型的全名,如果返回值是`List`集合类型的,只需要配置为集合中的元素的类型,例如返回`List<User>`时,配置`resultType`的值就是`User`类的全名;在编写SQL语句时,所有的变量值都使用`#{}`格式的占位符,占位符中的名称应该是参数名,或对象型的参数中的属性名;
 
5. 每写完一个功能,或者改动了一个功能,都应该及时的执行单元测试!
 
### 2. 动态SQL--foreach【重要】
 
动态SQL:在配置SQL语句时,可以添加例如`<if>`、`<foreach>`相关的配置,最终可以根据参数值不同,生成不同的SQL语句!
 
在配置MyBatis中映射的SQL语句时,可以添加`<foreach>`实现对参数的遍历!
 
例如:需要实现“根据若干个id批量删除用户数据(一次性删除若干条)”。
 
需要执行的SQL语句大致是`delete from t_user where id in (?,?,?)`,其中,问号的数量是开发者无法确定的,应该是由软件的使用者来决定的!
 
在设计抽象方法时,应该使用某1个参数来表示若干个即将被删除的数据的id,例如使用`List<Integer>`就可以表示多个`id`,也可以使用`Integer[]`或`Integer...`,所以,抽象方法可以设计为:
 
    Integer deleteByIds(List<Integer> ids);
 
    Integer deleteByIds(Integer[] ids);
 
    Integer deleteByIds(Integer... ids);
 
然后,需要配置以上某个抽象方法的映射:
 
    <delete id="deleteByIds">
        DELETE FROM t_user WHERE id IN (
            <foreach collection="array" item="id" separator=",">
                #{id}
            </foreach>
        )
    </delete>
 
关于`<foreach>`节点的配置:
 
- `collection`属性:表示被遍历的参数!当抽象方法的参数只有1个时,当参数的类型是`List`集合时,取值为`list`,当参数的类型是数组或可变参数时,取值为`array`;当抽象方法的参数有多个时,肯定添加了`@Param`注解,此处的取值就是注解中配置的名称;
 
- `item`属性:表示遍历过程中每个元素的名称,也是子级中`#{}`中的名称,是自定义的名称;
 
- `separator`属性:表示遍历的各个值用什么符号分隔;
 
- `open`属性与`close`属性:表示遍历生成的SQL语句片断的最左侧字符串和最右侧字符串。
 
### 3. 动态SQL--if【一般】
 
关于`<if>`的使用格式大致是:
 
    <select id="find"  
        resultType="cn.tedu.mybatis.User">
        SELECT * FROM t_user
        <if test="where != null">
        WHERE  
            ${where}
        </if>
        <if test="orderBy != null">
        ORDER BY  
            ${orderBy}
        </if>
        <if test="offset != null and count != null">
        LIMIT  
            #{offset}, #{count}
        </if>
    </select>
 
注意:强烈不推荐使用这种做法,使用1个查询的配置完成若干种查询需求!
 
### 4. 关于#{}和${}格式的占位符【理解】
 
最简化原则:先全部使用`#{}`格式的占位符,如果不可用,则改为`${}`格式的占位符!
 
使用`#{}`占位符时,MyBatis是预编译处理的,即各个占位符都会先使用`?`进行占位,并进行编译,编译通过后,再将值代进SQL语句中执行;简单的说,使用`#{}`格式的占位符只能表示某个“值”,并且,由于是预编译的,所以,不必关心值的类型,例如值是字符串类型的,也不必考虑使用单引号`'`框住值的问题;
 
使用`${}`占位符时,MyBatis并不会预编译,而是先将占位符中的值代进SQL语句,进行单纯的字符串拼接,然后再编译,最后执行,所以,必须保证拼接后的SQL语句是符合SQL语法的,否则会导致编译错误,最直接的表现就是例如字符串类型的值需要使用单引号`'`框住,同时,由于并没有使用编译的做法,还存在SQL注入的风险!简单的说,使用这种格式的占位符时,既需要考虑值的数据类型的问题,还需要考虑SQL注入的风险,应该是“能不这么用,就不这么用”!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饭九钦vlog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值