mybits注解详解

一、mybatis 简单注解
关键注解词 :
@Insert : 插入sql , 和xml insert sql语法完全一样
@Select : 查询sql, 和xml select sql语法完全一样
@Update : 更新sql, 和xml update sql语法完全一样
@Delete : 删除sql, 和xml delete sql语法完全一样
@Param : 入参
@Results : 结果集合
@Result : 结果

1.bean领域模型

package cn.xm.exam.bean.common;import java.util.Date;import org.apache.struts2.json.annotations.JSON;
/*** 查询年龄大于55岁的人()* @author QiaoLiQiang* @time 2018年1月25日下午4:03:02*/
public class Message {private String messageid;private String name;private String idcode;private String sex;private Date birthday;private String emptype;private String isdispose;public String getMessageid() {return messageid;}public void setMessageid(String messageid) {this.messageid = messageid == null ? null : messageid.trim();}public String getName() {return name;}public void setName(String name) {this.name = name == null ? null : name.trim();}public String getIdcode() {return idcode;}public void setIdcode(String idcode) {this.idcode = idcode == null ? null : idcode.trim();}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex == null ? null : sex.trim();}@JSON(format="yyyy-MM-dd")public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getEmptype() {return emptype;}public void setEmptype(String emptype) {this.emptype = emptype == null ? null : emptype.trim();}public String getIsdispose() {return isdispose;}public void setIsdispose(String isdispose) {this.isdispose = isdispose == null ? null : isdispose.trim();}@Overridepublic String toString() {return "Message [messageid=" + messageid + ", name=" + name + ", idcode=" + idcode + ", sex=" + sex+ ", birthday=" + birthday + ", emptype=" + emptype + ", isdispose=" + isdispose + "]";}}

2.Mapper接口定义:

MessageCustomMapper.java(最后五个方法注解实现)

package cn.xm.exam.mapper.common.custom;import java.sql.SQLException;
import java.util.List;
import java.util.Map;import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;import cn.xm.exam.bean.common.Message;/*** 消息mapper(查询内部外部年龄超过55的人)* * @author QiaoLiQiang* @time 2018年1月25日下午4:07:45*/
public interface MessageCustomMapper {/*** 根据员工类型查询超过55岁的人* * @return* @param empType:员工类型:0短委,1内部* @throws SQLException*/public List<Message> getMessageByEmptype(String empType) throws SQLException;/*** 修改消息的状态(设置为已读 1)* * @param messageId*            消息ID* @return* @throws SQLException*/public int updateMessageStatusByMessageId(String messageId) throws SQLException;/*** 测试注解使用Mybatis*/@Insert(" insert into message values (#{messageid,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{idcode,jdbcType=CHAR}, #{sex,jdbcType=VARCHAR}, #{birthday,jdbcType=DATE}, #{emptype,jdbcType=VARCHAR},#{isdispose,jdbcType=VARCHAR})")public int insertIntoByAnnotation(Message message) throws SQLException;@Select("select * from message where messageid = #{messageId}")public Message getMessageById(@Param("messageId")String messageId)throws SQLException;@Update("update message set name=#{name} where messageid=#{messageid}")public int updateMessageById(Message message)throws SQLException;@Select("select * from message where messageid = #{messageId}")public Map getMessageMapById(@Param("messageId")String messageId)throws SQLException;@Delete("delete from message where messageid = #{messageId}")public int deleteByMessageId(@Param("messageId")String messageid)throws SQLException;}

MessageCustomMapper.xml(只实现部分方法)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.xm.exam.mapper.common.custom.MessageCustomMapper"><!-- 查询未读的消息,每次显示6条 --><select id="getMessageByEmptype" parameterType="string"resultType="cn.xm.exam.bean.common.Message">select * from message where empType=#{value} and isDispose='0' limit 0,6</select><!-- 根据ID设置消息状态 --><update id="updateMessageStatusByMessageId">update message set isDispose='1' where messageid = #{value}</update>
</mapper>

3.测试如下:

package cn.xm.exam.test.daoTest;import java.sql.SQLException;
import java.util.Map;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import cn.xm.exam.bean.common.Message;
import cn.xm.exam.mapper.common.custom.MessageCustomMapper;/*** mybatis注解测试* * @author QiaoLiQiang* @time 2018年3月10日下午3:47:40*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/application*")
public class MybatisAnnotationTest {@Autowiredprivate MessageCustomMapper messageCustomMapper;@Testpublic void testAdd() throws SQLException{Message message = new Message();message.setSex("1");message.setMessageid("001");message.setName("张三");int result = messageCustomMapper.insertIntoByAnnotation(message);System.out.println(result);}@Testpublic void testSelect() throws SQLException{Message result = messageCustomMapper.getMessageById("001");System.out.println(result);}@Testpublic void testUpdate() throws SQLException{Message message = new Message();message.setSex("2");message.setMessageid("001");message.setName("李四");int result = messageCustomMapper.updateMessageById(message);System.out.println(result);}@Testpublic void testSelectMap() throws SQLException{Map result = messageCustomMapper.getMessageMapById("001");System.out.println(result);}@Testpublic void testDelete() throws SQLException{int result = messageCustomMapper.deleteByMessageId("001");System.out.println(result);}
}

结果:

(1)testAdd方法:

在这里插入图片描述

(2)testSelect方法:
在这里插入图片描述

(3)testUpdate方法:

在这里插入图片描述

(4)testSelectMap方法:(测试返回类型是Map)

{sex=1, name=李四, messageid=001}

(5)testDelete方法:

1

二、动态SQL

对应关系如下

@Insert :@InsertProvider
@Select :@SelectProvider
@Update :@UpdateProvider
@Delete :@DeleteProvider

四个provider注解标识 使用了动态SQL, 使用语法格式 :

@UpdateProvider(type = UserProvider.class, method =

如何使用动态SQL:

public class UserProvider {/*** udpate* @param UserDO userDO* @return*/public String updateSQL(final UserDO userDO) {return new SQL() {{UPDATE("t_user");SET("gmt_modified = now()");if (userDO.getUserName() != null) {SET("user_name = #{userName}");}WHERE("id = #{id}}");}}.toString();}
}

由此可见动态SQL还是用XML写SQL语句比较方便

本文提到的知识点比较基础, 如需深入了解见官网文档or看下源码。

总结:
  1、xml 和 注解 如何选择 ? 因人而异, 每个人的撸码各有各的习惯, xml 、注解各有优缺点, xml的缺点 : 当模型属性有变更时, 需要从DO改到DAO改到xml, 想想就蛋疼了~ xml也有优点 , SQL片段复用方便, 语法平易近人, 不像注解, 构造个动态语句, 还得建个类, 而且当你需要构造一段SQL被多处引用时, annotation 显得无能为力了~重复写相同的SQL片段, 代码就显得冗余了, 这时必须借助 xml来抽取共同使用。吐槽了下mybatis注解, 那注解岂不是毫无用处? no , mybatis 适合模型属性经常变更的场景, 因为可以结合反射, 正则匹配动态构造SQL(纯粹瞎歪歪, 个人想法, 应该可以实现, 改天撸一发)。可以说, mybatis的注解 优点 很好弥补了 xml缺点。两者互补~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用python装饰器计算函数运行时间的实例

使用python装饰器计算函数运行时间的实例 装饰器在python里面有很重要的作用&#xff0c; 如果能够熟练使用&#xff0c;将会大大的提高工作效率 今天就来见识一下 python 装饰器&#xff0c;到底是怎么工作的。 本文主要是利用python装饰器计算函数运行时间 一些需要精确的计算…

SQLServer用存储过程实现插入更新数据

实现 1&#xff09;有同样的数据&#xff0c;直接返回&#xff08;返回值&#xff1a;0&#xff09;。 2&#xff09;有主键同样。可是数据不同的数据。进行更新处理&#xff08;返回值&#xff1a;2&#xff09;&#xff1b; 3&#xff09;没有数据&#xff0c;进行插入数据处…

[pytorch、学习] - 9.1 图像增广

参考 9.1 图像增广 在5.6节(深度卷积神经网络)里我们提过,大规模数据集是成功应用神经网络的前提。图像增广(image augmentation)技术通过对训练图像做一系列随机改变,来产生相似但又不相同的训练样本,从而扩大训练数据集的规模。图像增广的另一种解释是,随机改变训练样本可以…

mysql绿色版安装

导读&#xff1a;MySQL是一款关系型数据库产品&#xff0c;官网给出了两种安装包格式&#xff1a;MSI和ZIP。MSI格式是图形界面安装方式&#xff0c;基本只需下一步即可&#xff0c;这篇文章主要介绍ZIP格式的安装过程。ZIP Archive版是免安装的。只要解压就行了。 一、首先下…

在微信浏览器字体被调大导致页面错乱的解决办法

iOS的解决方案是覆盖掉微信的样式&#xff1a; body { /* IOS禁止微信调整字体大小 */-webkit-text-size-adjust: 100% !important; } 安卓的解决方案是通过 WeixinJSBridge 对象将网页的字体大小设置为默认大小&#xff0c;并且重写设置字体大小的方法&#xff0c;让用户不能在…

[pytorch、学习] - 9.2 微调

参考 9.2 微调 在前面得一些章节中,我们介绍了如何在只有6万张图像的Fashion-MNIST训练数据集上训练模型。我们还描述了学术界当下使用最广泛规模图像数据集ImageNet,它有超过1000万的图像和1000类的物体。然而,我们平常接触到数据集的规模通常在这两者之间。 假设我们想从图…

Springboot默认加载application.yml原理

Springboot默认加载application.yml原理以及扩展 SpringApplication.run(…)默认会加载classpath下的application.yml或application.properties配置文件。公司要求搭建的框架默认加载一套默认的配置文件demo.properties&#xff0c;让开发人员实现“零”配置开发&#xff0c;但…

java 集合(Set接口)

Set接口&#xff1a;无序集合&#xff0c;不允许有重复值&#xff0c;允许有null值 存入与取出的顺序有可能不一致 HashSet:具有set集合的基本特性&#xff0c;不允许重复值&#xff0c;允许null值 底层实现是哈希表结构 初始容量为16 保存自定义对象时&#xff0c;保证数据的唯…

关于mac机抓包的几点基础知识

1. 我使用的抓包工具为WireShark&#xff0c;以下操作按我当前的版本(Version 2.6.1)做的&#xff0c;以前的版本或者以后的版本可能有稍微的区别。 2. 将mac设置为热点&#xff1a;打开系统偏好设置&#xff0c;点击共享&#xff1a; 然后点击WIFI选项&#xff0c;设置WIFI名…

SpringBoot启动如何加载application.yml配置文件

一、前言 在spring时代配置文件的加载都是通过web.xml配置加载的(Servlet3.0之前)&#xff0c;可能配置方式有所不同&#xff0c;但是大多数都是通过指定路径的文件名的形式去告诉spring该加载哪个文件&#xff1b; <context-param><param-name>contextConfigLocat…

[github] - git使用小结(分支拉取、版本回退)

1. 首次(fork项目之后) $ git clone [master] $ git branch -a $ git checkout -b [自己的分支名] [远程仓库的分支名]克隆的是主干网络 2. 再次拉取代码 $ git pull [master下选择分支名] [分支名] $ git push origin HEAD:[分支名]拉取首先得进入主仓(不是自己的远程仓)然后…

MYSQL 查看最大连接数和修改最大连接数

MySQL查看最大连接数和修改最大连接数 1、查看最大连接数show variables like %max_connections%;2、修改最大连接数set GLOBAL max_connections 200; 以下的文章主要是向大家介绍的是MySQL最大连接数的修改&#xff0c;我们大家都知道MySQL最大连接数的默认值是100, 这个数值…

阿里云服务器端口开放对外访问权限

登陆阿里云管理控制台 点击自己的实例 点击安全组配置 点击配置规则 点击添加安全组规则 配置出入放心&#xff0c;和开放的端口号&#xff0c;以及那些网段可以访问&#xff0c;这里设置所有网段都可以访问 转自&#xff1a;https://jingyan.baidu.com/article/95c9d20d624d1e…

PageHelper工作原理

数据分页功能是我们软件系统中必备的功能&#xff0c;在持久层使用mybatis的情况下&#xff0c;pageHelper来实现后台分页则是我们常用的一个选择&#xff0c;所以本文专门类介绍下。 PageHelper原理 相关依赖 <dependency><groupId>org.mybatis</groupId>&…

10-多写一个@Autowired导致程序崩了

再是javaweb实验六中&#xff0c;是让我们改代码&#xff0c;让它跑起来&#xff0c;结果我少注释了一个&#xff0c;导致一直报错&#xff0c;检查许久没有找到&#xff0c;最后通过代码替换逐步查找&#xff0c;才发现问题。 转载于:https://www.cnblogs.com/zhumengdexiaoba…

Java class不分32位和64位

1、32位JDK编译的java class在32位系统和64位系统下都可以运行&#xff0c;64位系统兼容32位程序&#xff0c;可以理解。2、无论是Linux还是Windows平台下的JDK编译的java class在Linux、Windows平台下通用&#xff0c;Java跨平台特性。3、64位JDK编译的java class在32位的系统…

包装对象

原文地址&#xff1a;https://wangdoc.com/javascript/ 定义 对象是JavaScript语言最主要的数据类型&#xff0c;三种原始类型的值--数值、字符串、布尔值--在一定条件下&#xff0c;也会自动转为对象&#xff0c;也就是原始类型的包装对象。所谓包装对象&#xff0c;就是分别与…

[C++] 转义序列

参考 C Primer(第5版)P36 名称转义序列换行符\n横向制表符\t报警(响铃)符\a纵向制表符\v退格符\b双引号"反斜杠\问号?单引号’回车符\r进纸符\f

vue使用(二)

本节目标&#xff1a; 1.数据路径的三种方式 2.{{}}和v-html的区别 1.绑定图片的路径 方法一&#xff1a;直接写路径 <img src"http://pic.baike.soso.com/p/20140109/20140109142534-188809525.jpg"> 方法二&#xff1a;在data中写路径&#xff0c;在…

typedef 为类型取别名

#include <stdio.h> int main() {   typedef int myint; // 为int 类型取自己想要的名字   myint a 10;   printf("%d", a);   return 0;} 其他类型的用法也是一样的 typedef 类型 自己想要取得名字; 转载于:https://www.cnblogs.com/hello-dummy/p/9…