Mybatis注解

用注解替代Mybatis映射文件的书写

回顾注解

注解 Annotation 是从JDK1.5开始引入的新技术

注解的作用:

1.不是程序本身,对程序作出解释

2.可以被其他程序读取到

Annotation格式

注解是以@注解名的方式在代码中实现的,可以添加一些参数值

如:@SuppressWarnings(value="unchecked")

注解使用的位置:

package、class、method、field 等上面,相当于给他们添加了额外的辅助信息。

注解的分类:

1.元注解:

@Target:用于描述注解的使用范围

@Retention:用于描述注解的生命周期

@Documented:说明该注解将被包含在javadoc 中

@Inherited:说明子类可以继承父类中的该注解

@Repeatable:可重复注解

2.内置注解

@Override: 重写检查

@Deprecated:过时

@SuppressWarnings: 压制警告

@FunctionalInterface: 函数式接口

3.自定义注解

public @interface MyAnno{}

我们可以用注解替代xml文件的书写

Mybatis常用注解

@Insert:实现新增 和 xml中 <insert> sql语法完全一样

@Update:实现更新

@Delete:实现删除

@Select:实现查询

@Result:实现结果集封装

@Results:可以与@Result 一起使用,封装多个结果集

@ResultMap:实现引用@Results 定义的封装

@One:实现一对一结果集封装

@Many:实现一对多结果集封装

@SelectProvider: 实现动态 SQL 映射

@ResultMap : 引用结果集合

@SelectKey : 获取最新插入

使用方法

第一步,在全局配置文件里的配置映射

<mappers>
    <mapper class="com.cy.mybatis.mapper.UserMapper"/>
</mappers>

第二步,在mapper接口的方法的上面添加注解

@Select("select * from user where uid = #{uid}")
    public User findUserById(int uid);

第三步,创建会话调用此方法

其他例子

1.ResultMap映射

把数据库中的列与实体类中名字不同的字段进行映射

//ResultMap映射
    @Select("select * from user where uid = #{uid}")
    @Results(id="UserMap",value={
        @Result(id = true,column = "uid",property = "uid"),
        @Result(column = "uname",property = "username")
    })
    public User findUserById(int id);

通过id可再次使用写好的ResultMap(注解里的参数如果只有“value={}”则可以不写”value=“)

//复用ResultMap映射
    @Select("select * from user where uid = #{uid}")
    @ResultMap("UserMap")
    public User findUserById2(int id);

2.使用注解@SelectKey可以获取自动增长主键

//获取插入之后的行的id值
    @Insert("insert into user(uname,sex) values(#{uname},#{sex})")
    @SelectKey(before = false,keyColumn = "uid",keyProperty = "uid",statement = "select last_insert_id()" ,resultType = int.class)
    public void insertUser(User user);

3.使用注解@Param可以映射参数(@Insert完成增加)

   @Insert("insert into user(uid,uname,sex) values(#{uid},#{uname},#{sex})")
    public void insertUser1(@Param("uid") int uid,@Param("uname")String username,@Param("sex") String sex);

4.使用注解@Update完成修改

//修改
    @Update("update user set uname=#{uname},address=#{address} where uid=#{uid}")
    public void updateUser(User user);

5.使用注解@One完成一对一关联映射(一个订单对应一个用户):

注意:

要在order的实体类中创建一个User属性

private User user;
//用One代替association
    @Results({
            @Result(id = true,column = "oid",property = "oid"),
            @Result(column = "usejavar_id",property = "userid"),
            @Result(column = "user_id",property = "user",one = @One(select = "com.cy.mybatis.mapper.UserMapper.findUserById1"))
    })
    @Select("select orders.* from orders where oid=#{oid}")
    public Order findOrderById(int oid);

6.使用注解@Many完成一对多关联映射(一个订单对应多个订单详情):

注意:

要在Order的实体类中创建一个Orderdetail集合

private List<Orderdetail> orderdetails;
//用Many代替collection
   @Select("select * from orderdetail where order_id=#{orderid}")
   @Results({
           @Result(column = "order_id",property = "orderid"),
           @Result(column = "items_id",property = "itemsid"),
           @Result(column = "items_num",property = "itemsnum")
   })
   public List<Orderdetail> findOrderDetailsByOid(int order_id);
​
   @Results({
           @Result(id = true,column = "oid",property = "oid"),
           @Result(column = "user_id",property = "userid"),
           @Result(column = "oid",property = "orderdetails",many = @Many(select = "com.cy.mybatis.mapper.UserMapper.findOrderDetailsByOid"))
   })
   @Select("select orders.* from orders where oid=#{oid}")
   public Order findOrderByoid(int oid);

附上创建数据库的代码

1.商品表(items):

REATE TABLE `items` (
    `iid` INT(11) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(32) NOT NULL COMMENT '商品名称',
    `price` FLOAT(10,1) NOT NULL COMMENT '商品定价',
    `detail` TEXT COMMENT '商品描述',
    `pic` VARCHAR(64) DEFAULT NULL COMMENT '商品图片',
    `createtime` DATETIME NOT NULL COMMENT '生产日期',
    PRIMARY KEY (`iid`)
) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
​
INSERT INTO `items` VALUES (1, '台式机', '3000.0', '该电脑质量非常好!!!!', null, '2015-02-03 13:22:53');
INSERT INTO `items` VALUES (2, '笔记本', '6000.0', '笔记本性能好,质量好!!!!!', null, '2015-02-09 13:22:57');
INSERT INTO `items` VALUES (3, '背包', '200.0', '名牌背包,容量大质量好!!!!', null, '2015-02-06 13:23:02'); 
用户表(user):

CREATE TABLE `user` (
  `uid` int(11) NOT NULL auto_increment,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `birthday` date default NULL COMMENT '生日',
  `sex` char(1) default NULL COMMENT '性别',
  `address` varchar(256) default NULL COMMENT '地址',
  PRIMARY KEY  (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
​
INSERT INTO `user` VALUES ('1','王五',NULL,'男',NULL);
INSERT INTO `user` VALUES ('10','张三','2014-07-10','女','北京市');
INSERT INTO `user` VALUES ('16','张小明',NULL,'男','河南郑州');
INSERT INTO `user` VALUES ('22','陈小明',NULL,'女','河南郑州');
INSERT INTO `user` VALUES ('24','张三丰',NULL,'男','河南郑州');
INSERT INTO `user` VALUES ('25','陈小明',NULL,'男','河南郑州');
INSERT INTO `user` VALUES ('26', '王五', null, null, null);
INSERT INTO `user` VALUES ('28', '赵四', '2017-05-03', '男', '辽宁');
INSERT INTO `user` VALUES ('29', '小灰灰', '2017-05-03', '女', '西安');

2.用户表(user):

CREATE TABLE `user` (
  `uid` int(11) NOT NULL auto_increment,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `birthday` date default NULL COMMENT '生日',
  `sex` char(1) default NULL COMMENT '性别',
  `address` varchar(256) default NULL COMMENT '地址',
  PRIMARY KEY  (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `user` VALUES ('1','王五',NULL,'男',NULL);
INSERT INTO `user` VALUES ('10','张三','2014-07-10','女','北京市');
INSERT INTO `user` VALUES ('16','张小明',NULL,'男','河南郑州');
INSERT INTO `user` VALUES ('22','陈小明',NULL,'女','河南郑州');
INSERT INTO `user` VALUES ('24','张三丰',NULL,'男','河南郑州');
INSERT INTO `user` VALUES ('25','陈小明',NULL,'男','河南郑州');
INSERT INTO `user` VALUES ('26', '王五', null, null, null);
INSERT INTO `user` VALUES ('28', '赵四', '2017-05-03', '男', '辽宁');
INSERT INTO `user` VALUES ('29', '小灰灰', '2017-05-03', '女', '西安');

3.订单表(orders):

CREATE TABLE `orders` (
  `oid` int(11) NOT NULL auto_increment,
  `user_id` int(11) NOT NULL COMMENT '下单用户id',
  `number` varchar(32) NOT NULL COMMENT '订单号',
  `createtime` datetime NOT NULL COMMENT '创建订单时间',
  `note` varchar(100) default NULL COMMENT '备注',
  PRIMARY KEY  (`oid`),
  KEY `FK_order_1` (`user_id`),
  CONSTRAINT `FK_order_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`uid`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
​
INSERT INTO `orders` VALUES ('3', '1', '1000010', '2015-02-04 13:22:35', null);
INSERT INTO `orders` VALUES ('4', '1', '1000011', '2015-02-03 13:22:41', null);
INSERT INTO `orders` VALUES ('5', '10', '1000012', '2015-02-12 16:13:23', null);

4.订单明细表(orderdetail):

CREATE TABLE `orderdetail` (
  `odid` int(11) NOT NULL auto_increment,
  `order_id` int(11) NOT NULL COMMENT '订单id',
  `items_id` int(11) NOT NULL COMMENT '商品id',
  `items_num` int(11) default NULL COMMENT '商品购买数量',
  PRIMARY KEY  (`odid`),
  KEY `FK_orderdetail_1` (`order_id`),
  KEY `FK_orderdetail_2` (`items_id`),
  CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`order_id`) REFERENCES `orders` (`oid`),
  CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`iid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
​
INSERT INTO `orderdetail` VALUES ('1', '3', '1', '1');
INSERT INTO `orderdetail` VALUES ('2', '3', '2', '3');
INSERT INTO `orderdetail` VALUES ('3', '4', '3', '4');
INSERT INTO `orderdetail` VALUES ('4', '4', '2', '3');
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值