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设置查询结果的列名

相关推荐
喔喔咿哈哈10 分钟前
【手撕 Spring】 -- Bean 的创建以及获取
java·后端·spring·面试·开源·github
码农小丘12 分钟前
了解springboot国际化用途以及使用
java·spring boot·spring
卡皮巴拉吖16 分钟前
【JavaEE初阶】多线程上部
java·jvm·java-ee
tian-ming17 分钟前
JavaWeb后端开发知识储备1
java·spring boot·nginx·spring·maven
spy47_18 分钟前
JavaEE 重要的API阅读
java·笔记·java-ee·api文档阅读
夏微凉.21 分钟前
【JavaEE进阶】Spring AOP 原理
java·spring boot·后端·spring·java-ee·maven
只因在人海中多看了你一眼23 分钟前
Java EE 技术基础知识体系梳理
java·java-ee
杨过姑父28 分钟前
org.springframework.context.support.ApplicationListenerDetector 详细介绍
java·前端·spring
理想不理想v38 分钟前
使用JS实现文件流转换excel?
java·前端·javascript·css·vue.js·spring·面试
hutaotaotao40 分钟前
c语言用户不同命令调用不同函数实现
c语言·开发语言