3.Mybatis 注解方式的基本用法

本文介绍了Mybatis使用注解进行开发的方法,包括修改全局配置文件加载Mapper接口,注解实现复杂关系映射,如@Select、@Insert、@Update、@Delete的使用。详细讲解了一对一和一对多查询的注解配置,并给出了具体的代码示例。
摘要由CSDN通过智能技术生成

Mybatis 也可以使用注解开发方式,这样我们就可以减少编写 Mapper映射文件了。下面介绍用户的增删改查。

3.1 修改全局配置文件

在mybatis 全局文件中 通过package标签或者mapper标签的class属性加载mapper接口即可。

    <mappers>
          <mapper class="com.xa92.mapper.UserMapper"></mapper>
    </mappers>

3.2 使用注解实现复杂关系映射开发

实现复杂关系映射之前我们可以在映射文件中通过配置来实现,但通过后我们发现并没 有@ResultMap 这个注解。我们可以使用

@Results 注解,@Result 注解,@One 注解,@Many 注解。

  • @Insert:实现新增

  • @Update:实现更新

  • @Delete:实现删除

  • @Select:实现查询

  • @Result:实现结果集封装

    @Result 中 属性介绍:

    column 数据库的列名

    Property 需要装配的属性名

    one 需要使用的@One 注解(@Result(one=@One)()))

    many 需要使用的@Many 注解(@Result(many=@many)()))

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

    @Results 注解代替的是标签

    该注解中可以使用单个@Result 注解,也可以使用@Result 集合

    @Results({@Result(),@Result()})或@Results(@Result())

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

    代替了标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。

    @One 注解属性介绍:

    select 指定用来多表查询的 s qlmapper

    fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。

    使用格式:

    @Result(column=" “,property=”“,one=@One(select=”"))

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

    代替了标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合。注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType(一般为 ArrayList)但是注解中可以不定义; 使用格式:

    @Result(property=“”,column=“”,many=@Many(select=“”))

  • @SelectProvider: 实现动态 SQL 映射

3.3 @select 注解

在UserMapper 中添加如下注解方法。

    @Results(id="userResultMap",value = {
       @Result(property = "id", column = "id",id = true),
            @Result(property = "id", column = "userName"),
            @Result(property = "sex", column = "sex"),
            @Result(property = "birthday", column = "birthday"),
            @Result(property = "address", column = "address")
    })
    @Select("select id,user_name,sex,birthday,address" +
            " from t_user where id = #{id} ")
    List<UserInfo> findUserById(Long id);

上面@Results 对应的就是 XML中的resultMap元素,使用这个注解可以实现属性映射。

参数上加上Id = true,代表此属性为主键列,对应 XML中的

那么如果UserMapper 有多个查询条件,需要@Results共用,在MyBatis 3.3.0 及以前版本,注解定义的 @Results 不能共用。但是从Mybatis 3.3.1版本开始,、

@Results注解增加了一个id属性,设置了id属性后,就可以通过id属性直接引用同一个@Results配置,示例代码如下:

    @ResultMap("userResultMap")
    @Select("select id,user_name,sex,birthday,address from t_user")
    List<UserInfo> selectAll();

    @Results(id="userResultMap",value = {
       @Result(property = "id", column = "id",id = true),
            @Result(property = "id", column = "userName"),
            @Result(property = "sex", column = "sex"),
            @Result(property = "birthday", column = "birthday"),
            @Result(property = "address", column = "address")
    })
    @Select("select id,user_name,sex,birthday,address" +
            " from t_user where id = #{id} ")
    List<UserInfo> findUserById(Long id);

使用 @ResultMap(“userResultMap”)可以直接对设置好的resultMap进行直接引用。

测试代码如下:

 @Test
    public void selectAll(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try{
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            List<UserInfo> userList = mapper.selectAll();
            System.out.println(userList);
        }finally{
            sqlSession.close();
        }
    }
    
        @Test
    public void findUserById(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try{
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            UserInfo userInfo = mapper.findUserById(1L);
            System.out.println("inert success....."+userInfo);
        }finally{
            sqlSession.close();
        }
    }

查询日志:

[com.xa02.mapper.UserMapper.selectAll]-==>  Preparing: select id,user_name,sex,birthday,address from t_user 
[com.xa02.mapper.UserMapper.selectAll]-==> Parameters: 
[com.xa02.mapper.UserMapper.selectAll]-<==      Total: 9

[com.xa02.mapper.UserMapper.findUserById]-==>  Preparing: select id,user_name,sex,birthday,address from t_user where id = ? 
[com.xa02.mapper.UserMapper.findUserById]-==> Parameters: 1(Long)
[com.xa02.mapper.UserMapper.findUserById]-<==      Total: 1

3.4 @insert注解

1.不需要返回主键值

    @Insert("insert into t_user(user_name,sex,birthday,address)values(#{userName},#{sex},#{birthday},#{address})")
    Integer insertUser(UserInfo userInfo);

2.返回自增主键值

在XML中需要如下配置:

<insert id="insertUser" parameterType="UserInfo" useGeneratedKeys="true" keyProperty="id">  
    INSERT INTO t_user(user_name,sex,birthday,address ) VALUES     
    (#{userName},#{sex},#{birthday},#{address}); 
</insert>

在接口中配置:

    @Insert("insert into t_user(user_name,sex,birthday,address)" +
            "values(#{userName},#{sex},#{birthday},#{address})")
    @Options(useGeneratedKeys = true,keyProperty = "id")
    Integer insertUser(UserInfo userInfo);

3.返回非自增主键

在XML中的配置

   <insert id="insertUser" parameterType="UserInfo" >
    <selectKey resultType="long" keyProperty="id" order="BEFORE">
        select max(id)+1 from t_user
    </selectKey>
        INSERT INTO t_user(id,user_name,sex,birthday,address ) VALUES
        (#{id},#{userName},#{sex},#{birthday},#{address});
    </insert>

在UserMapper中配置

    @Insert("insert into t_user(user_name,sex,birthday,address)" +
            "values(#{userName},#{sex},#{birthday},#{address})")
            
    @SelectKey(statement = "select max(id)+1 from t_user",
            keyProperty = "id",
            resultType = Long.class,
            before = false
    )
    Integer insertUser(UserInfo userInfo);

其中 before = false 等同于XML中的order= “before”

3.5 @update 和 @delete

    @Update("update t_user set user_name =#{userName},sex=#{sex},birthday=#{birthday},address=#{address} where id=#{id}")
    Integer updateUser(UserInfo userInfo);
    
    @Delete("delete from user where id=#{id}")
    Integer deleteUser(Long id);

3.6 复杂查询

首先准备三张表: 用户表、订单表、订单详情表、商品表

// 订单表
CREATE TABLE `t_order` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) DEFAULT NULL, // 用户ID
  `status` char(1) DEFAULT NULL, // 订单状态
  `amount` decimal(10,2) DEFAULT NULL, // 订单金额
  `create_time` datetime DEFAULT NULL, //订单创建时间
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

// 订单详情表
CREATE TABLE `t_order_detail` (
  `id` bigint(20) DEFAULT NULL,
  `order_id` bigint(20) DEFAULT NULL,//订单ID
  `product_id` bigint(20) DEFAULT NULL,// 商品ID
  `amout` decimal(10,0) DEFAULT NULL, // 金额
  `num` int(11) DEFAULT NULL // 商品数量
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3.6.1 一对一查询

需求: 根据订单Id查询出下订单的用户。

SQL:

select user_id from t_order where id = #{订单ID};
select * from t_user where id = #{用户ID}

代码实现

1.OrderMapper

public interface OrderMapper {
    @Results(id="orderResultMap",value = {
            @Result(property = "id", column = "id",id = true),
            @Result(property = "user_id", column = "userId"),
            @Result(property = "status", column = "status"),
            @Result(property = "amount", column = "birthday"),
            @Result(property = "create_time", column = "createTime"),
            //Result(one = @One(select = "namespace.id") 代替了<assocation>标签
            // select 代表查询哪个接口的方法获取数据
            // property: 要封装的属性名称
            // javaType : 要封装的实体类型
            // column: 即Order表中根据哪个字段去查询用户表
            @Result(one = @One(select = "com.xa02.mapper.UserMapper.findUserById")
                    ,property = "userInfo" ,
                    javaType = com.xa02.domain.UserInfo.class ,
                    column = "user_id")
    })
    @Select("select id,user_id,status,amount,create_time" +
            " from t_order where id = #{id} ")
    OrderInfo findOrderById(Long id);
}
  • @Result(one = @One(select = “namespace.id”) 代替了标签

  • select 代表查询哪个接口的方法获取数据

  • property: 要封装的属性名称,即在OrderInfo中中的变量名称

    public class OrderInfo {
        .....
        private UserInfo userInfo;
    }
    
    • javaType : 要封装的实体类型
    • column: 即Order表中根据哪个字段去查询用户表

2.UserMapper

public interface UserMapper {
    @Results(id="userResultMap",value = {
       @Result(property = "id", column = "id",id = true),
            @Result(property = "id", column = "userName"),
            @Result(property = "sex", column = "sex"),
            @Result(property = "birthday", column = "birthday"),
            @Result(property = "address", column = "address")
    })
    @Select("select id,user_name,sex,birthday,address" +
            " from t_user where id = #{id} ")
    UserInfo findUserById(Long id);
}

3.测试代码

@Test
    public void findOrderById(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try{
            OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
            OrderInfo orderInfo = orderMapper.findOrderById(6L);
            System.out.println("findOrderById....."+orderInfo);
        }finally{
            sqlSession.close();
        }
    }

日志如下:

[com.xa02.mapper.OrderMapper.findOrderById]-==>  Preparing: select id,user_id,status,amount,create_time from t_order where id = ? 
[com.xa02.mapper.OrderMapper.findOrderById]-==> Parameters: 6(Long)
[com.xa02.mapper.OrderMapper.findOrderById]-<==      Total: 1

[com.xa02.mapper.UserMapper.findUserById]-==>  Preparing: select id,user_name,sex,birthday,address from t_user where id = ? 
[com.xa02.mapper.UserMapper.findUserById]-==> Parameters: 1(Long)
[com.xa02.mapper.UserMapper.findUserById]-<==      Total: 1

3.6.2 一对多查询

需求: 查询某一个用户下的所有工单。

select *  from t_user 
seelct * from t_order where user_id = #{userId}

代码实现:

1.UserMapper

public interface UserMapper {

    @Results(id="userResultMap",value = {
            @Result(property = "id", column = "id",id = true),
            @Result(property = "id", column = "userName"),
            @Result(property = "sex", column = "sex"),
            @Result(property = "birthday", column = "birthday"),
            @Result(property = "address", column = "address"),
            @Result(column = "id" ,
                    many = @Many(select = "com.xa02.mapper.OrderMapper.findOrderByUserId"),
                    property = "orderInfoList" ,
                    javaType = List.class )
    })
    @Select("select id,user_name,sex,birthday,address from t_user")
    List<UserInfo> selectAll();

}

2.OrdderMapper

public interface OrderMapper {
    @Results(id="orderResultMap",value = {
            @Result(property = "id", column = "id",id = true),
            @Result(property = "user_id", column = "userId"),
            @Result(property = "status", column = "status"),
            @Result(property = "amount", column = "birthday"),
            @Result(property = "create_time", column = "createTime")
    })
    @Select("select id,user_id,status,amount,create_time" +
            " from t_order where user_id = #{userId} ")
    OrderInfo findOrderByUserId(Long userId);
}

3.UserInfo 类

public class UserInfo {
    private Long id;
    private String userName;
    private String sex;
    private Date birthday;
    private String address;

    private List<OrderInfo> orderInfoList;
}

4.测试类

    @Test
    public void selectAll(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try{
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            List<UserInfo> userList = mapper.selectAll();
            System.out.println(userList);
        }finally{
            sqlSession.close();
        }
    }

测试结果:

[com.xa02.mapper.UserMapper.selectAll]-==>  Preparing: select id,user_name,sex,birthday,address from t_user 
[com.xa02.mapper.UserMapper.selectAll]-==> Parameters: 
[com.xa02.mapper.OrderMapper.findOrderByUserId]-====>  Preparing: select id,user_id,status,amount,create_time from t_order where user_id = ? 
[com.xa02.mapper.OrderMapper.findOrderByUserId]-====> Parameters: 1(Long)
[com.xa02.mapper.OrderMapper.findOrderByUserId]-<====      Total: 2
[com.xa02.mapper.OrderMapper.findOrderByUserId]-====>  Preparing: select id,user_id,status,amount,create_time from t_order where user_id = ? 
[com.xa02.mapper.OrderMapper.findOrderByUserId]-====> Parameters: 2(Long)
[com.xa02.mapper.OrderMapper.findOrderByUserId]-<====      Total: 0
[com.xa02.mapper.OrderMapper.findOrderByUserId]-====>  Preparing: select id,user_id,status,amount,create_time from t_order where user_id = ? 
[com.xa02.mapper.OrderMapper.findOrderByUserId]-====> Parameters: 10(Long)
[com.xa02.mapper.OrderMapper.findOrderByUserId]-<====      Total: 0
[com.xa02.mapper.OrderMapper.findOrderByUserId]-====>  Preparing: select id,user_id,status,amount,create_time from t_order where user_id = ? 
[com.xa02.mapper.OrderMapper.findOrderByUserId]-====> Parameters: 11(Long)
[com.xa02.mapper.OrderMapper.findOrderByUserId]-<====      Total: 0
[com.xa02.mapper.OrderMapper.findOrderByUserId]-====>  Preparing: select id,user_id,status,amount,create_time from t_order where user_id = ? 
[com.xa02.mapper.OrderMapper.findOrderByUserId]-====> Parameters: 12(Long)
[com.xa02.mapper.OrderMapper.findOrderByUserId]-<====      Total: 0
[com.xa02.mapper.OrderMapper.findOrderByUserId]-====>  Preparing: select id,user_id,status,amount,create_time from t_order where user_id = ? 
[com.xa02.mapper.OrderMapper.findOrderByUserId]-====> Parameters: 13(Long)
[com.xa02.mapper.OrderMapper.findOrderByUserId]-<====      Total: 0
[com.xa02.mapper.OrderMapper.findOrderByUserId]-====>  Preparing: select id,user_id,status,amount,create_time from t_order where user_id = ? 
[com.xa02.mapper.OrderMapper.findOrderByUserId]-====> Parameters: 14(Long)
[com.xa02.mapper.OrderMapper.findOrderByUserId]-<====      Total: 0
[com.xa02.mapper.OrderMapper.findOrderByUserId]-====>  Preparing: select id,user_id,status,amount,create_time from t_order where user_id = ? 
[com.xa02.mapper.OrderMapper.findOrderByUserId]-====> Parameters: 15(Long)
[com.xa02.mapper.OrderMapper.findOrderByUserId]-<====      Total: 0
[com.xa02.mapper.OrderMapper.findOrderByUserId]-====>  Preparing: select id,user_id,status,amount,create_time from t_order where user_id = ? 
[com.xa02.mapper.OrderMapper.findOrderByUserId]-====> Parameters: 16(Long)
[com.xa02.mapper.OrderMapper.findOrderByUserId]-<====      Total: 0
[com.xa02.mapper.UserMapper.selectAll]-<==      Total: 9
[UserInfo{id=1, userName='zhangsan', sex='0', birthday=Tue Nov 17 15:07:08 CST 2020, address='上海市', orderInfoList=[OrderInfo{id=6, userId=1, status='1', amount=null, createTime=Wed Aug 31 10:31:56 CST 2022, userInfo=null}, OrderInfo{id=7, userId=1, status='1', amount=null, createTime=Thu Sep 01 11:11:35 CST 2022, userInfo=null}]}, UserInfo{id=2, userName='lisi', sex='0', birthday=Wed Nov 03 15:07:28 CST 2021, address='安徽省合肥市', orderInfoList=[]}, UserInfo{id=10, userName='tom', sex='1', birthday=Tue Sep 06 21:05:04 CST 2022, address='guangzhou', orderInfoList=[]}, UserInfo{id=11, userName='tom', sex='1', birthday=Tue Sep 06 21:11:37 CST 2022, address='guangzhou', orderInfoList=[]}, UserInfo{id=12, userName='tom', sex='1', birthday=Tue Sep 06 21:11:57 CST 2022, address='guangzhou', orderInfoList=[]}, UserInfo{id=13, userName='tom', sex='1', birthday=Tue Sep 06 21:28:36 CST 2022, address='wuhu', orderInfoList=[]}, UserInfo{id=14, userName='jack', sex='1', birthday=Tue Sep 06 22:57:55 CST 2022, address='shenzhen', orderInfoList=[]}, UserInfo{id=15, userName='jack', sex='1', birthday=Tue Sep 06 22:58:31 CST 2022, address='shenzhen', orderInfoList=[]}, UserInfo{id=16, userName='lili', sex='0', birthday=Tue Sep 06 23:06:17 CST 2022, address='shenzhen', orderInfoList=[]}]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统的功能模块主要是实现管理员服务端;首页、个人心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半夏_2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值