MyBatis框架-开发方式+参数传递+#{}、${}+返回值处理+查询结果封装为对象+resultType

一、开发方式

MyBatis-Dao层Mapper接口化开发

二、注意事项

1、Mapper接口与Mapper.xml映射文件要满足4个对应

(1)Mapper接口的全类名必须与Mapper映射文件中的namespace相同

(2)Mapper接口中的每一个方法名在Mapper映射文件中都要有一个id为方法名的标签相对应

(3)Mapper映射文件中的标签的参数类型必须与Mapper接口中的对应方法的参数类型相同

(4)Mapper映射文件中的标签的结果类型必须与Mapper接口中的对应方法的结果类型相同

三、参数传递

1、单参数传递

直接使用方法的参数名传递参数

java 复制代码
Admin findAdminById(int id);
XML 复制代码
<select id="findAdminById" parameterType="int" resultType="Admin">
         select * from admin where id = #{id}
     </select>

2、少参数传递

使用注解标签传递参数

java 复制代码
Admin login(@Param("acc") String account, @Param("pwd") String password);
XML 复制代码
<select id="login" resultType="Admin">
          select * from admin where account = #{acc} and password = #{pwd}
    </select>

3、多参数传递

使用对象传递参数

java 复制代码
void saveAdmin(Admin admin);
XML 复制代码
<insert id="saveAdmin" parameterType="admin">
           insert into admin(account,password,gender)value(#{account},#{password},#{gender})
    </insert>

注意:执行增删改sql语句时必须要提交数据库事务(一次与数据库交互的过程管理)

两种提交数据库事务的方式

方式一

给定参数设置为自动提交数据库事务

java 复制代码
sqlSessionFactory.openSession(true);

方式二

调用方法手动提交数据库事务

java 复制代码
sqlSession.commit();

对比两种方式,最好使用第二种,可以使得多条sql在遇到异常时保持状态一致,要么都提交成功,要么都提交失败,避免出现交钱不下单问题

四、#{}表达式和${}表达式

1、#{}表达式

(1)作用:传递参数值

(2)传递方式:预编译方式传递

(3)优点:安全,避免出现or 1=1表内数据全部删除的情况

2、${}表达式

(1)作用:传递列名

(2)传递方式:字符串拼接方式传递

(3)优点:

优点一:通过加''可实现参数值传递

优点二:可以实现排序列名传递和数据显示列名传递两个功能

五、insert标签的3个属性,获取插入数据的主键值

1、useGeneratedKeys 设置方法是否返回此条数据的主键值

2、keyColumn 设置类中谁来接收主键值

3、keyProperty 设置表中谁为主键(只针对当前返回主键值这个过程)

XML 复制代码
 <insert id="saveAdmin" parameterType="admin" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
           insert into admin(account,password,gender)value(#{account},#{password},#{gender})
    </insert>

六、单元测试

1、功能:实现对单个方法进行测试

2、配置:

将junit包导入到项目中

XML 复制代码
<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>provided</scope>
</dependency>

3、使用:注意:单元测试的方法必须是public访问权限修饰符

java 复制代码
@Test
     public void find(){
         System.out.println("你好");
     }

七、查询接口

1、返回值为一个值

java 复制代码
int findAdminCount();
XML 复制代码
<select id="findAdminCount" resultType="java.lang.Integer">
           select count(*) from admin
    </select>

2、返回值为一个对象

java 复制代码
Admin findAdminById(int id);
XML 复制代码
<select id="findAdminById" parameterType="int" resultType="Admin">
         select * from admin where id = #{id}
     </select>

3、返回值为多个对象

java 复制代码
List<Admin> findAdmins();
XML 复制代码
<select id="findAdmins" resultType="com.ffyc.mybatispro.model.Admin">
        select * from admin
    </select>

注意:必须使用集合去接收返回回来的多个对象,否则就会

八、单表自动将查询结果中的记录封装为一个对象需要注意的事项

1、模型类中一定要有无参构造方法,否则就会

并且在模型类中一定要对私有属性全部实现get和set方法

2、数据库表中的列名一定要与对应模型类中的属性名相同,否则就会

快捷方式:java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局设置实现自动转换,即就是adminPhone与admin_phone相对应

实现方式:在全局配置中添加此配置

XML 复制代码
<setting name="mapUnderscoreToCamelCase" value="true"/>

九、方法中传递String类型的参数时,必须使用注解标签@Param与参数值绑定才能将将参数值正确传到sql中,否则就会

正确做法:

java 复制代码
List<Admin> findAdmins(@Param("col") String col);
XML 复制代码
<select id="findAdmins" resultType="com.ffyc.mybatispro.model.Admin" parameterType="string">
        select * from admin order by ${col}
    </select>

十、resultType特殊处理结果集

1、作用:

处理模型类的属性名与数据库列名不对应的问题

2、使用

XML 复制代码
<resultMap id="adminMap" type="admin">
        <id property="id" column="id"></id>
        <result property="account" column="account"></result>
        <result property="password" column="password"></result>
        <result property="gender" column="gen"></result>
        <result property="adminPhone" column="admin_phone"></result>
    </resultMap>
    <select id="findAdminById" parameterType="int" resultMap="adminMap">
         select id,password,account,gen as gender,admin_phone from admin where id = #{id}
     </select>

解析:resultMap中的id属性是POJO类,是唯一标识,sql语句的查询结果被对应的resultMap接收,type属性是结果类,内部的id标签映射主键,result标签映射非主键,property设置POJO类的属性名,column设置查询结果的列名

相关推荐
m0_699659561 分钟前
QT知识点复习
开发语言·qt
南玖yy5 分钟前
C语言:数组的介绍与使用
c语言·开发语言·算法
米码收割机19 分钟前
【python】tkinter实现音乐播放器(源码+音频文件)【独一无二】
开发语言·python·pygame
星如雨グッ!(๑•̀ㅂ•́)و✧30 分钟前
Java NIO全面详解
java·python·nio
笛柳戏初雪34 分钟前
Python中的函数(下)
开发语言·python
美味小鱼44 分钟前
初识Cargo:Rust的强大构建工具与包管理器
开发语言·rust·cargo
c-c-developer1 小时前
C++ Primer 标准库类型string
开发语言·c++
山茶花开时。1 小时前
[SAP ABAP] Debug Skill
开发语言·sap·abap
奥顺互联V1 小时前
yes镜像站群/PHP驱动的镜像站群架构实践
开发语言·架构·开源·php
taopi20242 小时前
android java系统弹窗的基础模板
android·java·开发语言