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

相关推荐
救救孩子把6 分钟前
深入理解 Java 对象的内存布局
java
落落落sss8 分钟前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
万物皆字节14 分钟前
maven指定模块快速打包idea插件Quick Maven Package
java
夜雨翦春韭20 分钟前
【代码随想录Day30】贪心算法Part04
java·数据结构·算法·leetcode·贪心算法
简单.is.good26 分钟前
【测试】接口测试与接口自动化
开发语言·python
我行我素,向往自由27 分钟前
速成java记录(上)
java·速成
一直学习永不止步33 分钟前
LeetCode题练习与总结:H 指数--274
java·数据结构·算法·leetcode·数组·排序·计数排序
邵泽明33 分钟前
面试知识储备-多线程
java·面试·职场和发展
Yvemil71 小时前
MQ 架构设计原理与消息中间件详解(二)
开发语言·后端·ruby
程序员是干活的1 小时前
私家车开车回家过节会发生什么事情
java·开发语言·软件构建·1024程序员节