用注解替代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');