spring集成mybaits以注解方式完成连表查询练习

题目:
        以注解的方式完成连表查询
                1、查询全部员工信息,要求显示部门名称
                2、根据姓名模糊查询员工信息

自己看完,建一个简单的员工表和部门表。

1、先创建一个maven模块,这里直接建的普通maven模块,你也可以用quickStart骨架

 2、引入必要的依赖

    <dependencies>
        <!--junit:用于测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!--mysql连接器-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.24</version>
        </dependency>
        <!--druid:数据源,根据它连接到数据库-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.4</version>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>
        <!--spring-context:IOC容器-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.22</version>
        </dependency>
        <!--spring-jdbc:用于spring连接数据库-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.3</version>
        </dependency>
        <!--mybatis-spring:Mybatis集成spring-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.5</version>
        </dependency>
    </dependencies>

别忘了刷新 

3、 创建实体类
        Employee

package com.gc.bean;

public class Employee {
    private Integer emId;   //员工ID
    private String emName;  //员工姓名
    private String emAddress;//员工地主之
    private Dept dept;  //所在部门

    public Employee(){}

    public Employee(Integer emId, String emName, String emAddress, Dept dept) {
        this.emId = emId;
        this.emName = emName;
        this.emAddress = emAddress;
        this.dept = dept;
    }

    public Integer getEmId() {
        return emId;
    }

    public void setEmId(Integer emId) {
        this.emId = emId;
    }

    public String getEmName() {
        return emName;
    }

    public void setEmName(String emName) {
        this.emName = emName;
    }

    public String getEmAddress() {
        return emAddress;
    }

    public void setEmAddress(String emAddress) {
        this.emAddress = emAddress;
    }

    public Dept getDept() {
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "emId=" + emId +
                ", emName='" + emName + '\'' +
                ", emAddress='" + emAddress + '\'' +
                ", dept=" + dept +
                '}';
    }
}

        Dept

package com.gc.bean;

public class Dept {
    private Integer deptId; //部门编号
    private String deptName;//部门名称

    public Dept(){}
    public Dept(Integer deptId, String deptName) {
        this.deptId = deptId;
        this.deptName = deptName;
    }

    public Integer getDeptId() {
        return deptId;
    }

    public void setDeptId(Integer deptId) {
        this.deptId = deptId;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "deptId=" + deptId +
                ", deptName='" + deptName + '\'' +
                '}';
    }
}

4、创建Dao接口

        EmployeeDao

package com.gc.dao;

import com.gc.bean.Dept;
import com.gc.bean.Employee;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface EmployeeDao {
    /**
     * 1、查询全部员工信息
     * @return
     */
    @Select("select * from employee")
    @Results({
            @Result(column = "emId",property = "emId"),
            @Result(column = "emName",property = "emName"),
            @Result(column = "emAddress",property = "emAddress"),
            @Result(
                    property = "dept",
                    column = "deptId",
                    javaType = Dept.class,
                    one = @One(select = "com.gc.dao.DeptDao.selectByName")
            )
    })
    List<Employee> selectAll();

    /**
     * 2、根据姓名模糊查询员工信息
     * @return
     */
    @Select("select * from employee where emName like concat('%',#{name},'%')")
    @Results({
            @Result(column = "emId",property = "emId"),
            @Result(column = "emName",property = "emName"),
            @Result(column = "emAddress",property = "emAddress"),
            @Result(
                    property = "dept",
                    column = "deptId",
                    javaType = Dept.class,
                    one = @One(select = "com.gc.dao.DeptDao.selectByName")
            )
    })
    List<Employee> selectByName(String name);
}

         DeptDao

package com.gc.dao;

import com.gc.bean.Dept;
import org.apache.ibatis.annotations.Select;

public interface DeptDao {
    /**
     * 根据dpetId查询部门对象
     * @return
     */
    @Select("select * from Dept where deptId=#{deptId}")
    Dept selectByName(Integer id);
}

5、创建Service接口和实现类

package com.gc.service;

import com.gc.bean.Employee;

import java.util.List;

public interface EmployeeService {
    List<Employee> selectAll();

    List<Employee> selectByName(String name);
}
package com.gc.service.impl;

import com.gc.bean.Employee;
import com.gc.dao.EmployeeDao;
import com.gc.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
@Component("employeeService")   //将类的对象生成Bean,交给IOC容器管理
public class EmployeeServiceImpl implements EmployeeService {
    @Autowired      //将Dao接口对象生成Bean,交由IOC容器管理
    private EmployeeDao employeeDao;

    @Override
    public List<Employee> selectAll() {
        return employeeDao.selectAll();
    }

    @Override
    public List<Employee> selectByName(String name) {
        return employeeDao.selectByName(name);
    }
}

6、配置数据源、配置Mybatis(替代MybatisConfig.xml)和配置Spring(替代applicationContext.xml)

        1)配置文件(db.properties)

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql:///mybatis_DB?characterEncoding=utf-8
jdbc.username=root
jdbc.password=1234

        2)配置数据源(jdbcDataSource)

package com.gc.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;

public class jdbcDataSource {
    @Value("${jdbc.driver}")    //给属性赋值
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String userName;
    @Value("${jdbc.password}")
    private String password;

    @Bean("dataSource")     //将方法返回的对象生成Bean,交给IOC容器管理
    public DruidDataSource getDataSource(){
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setDriverClassName(driver);
            dataSource.setUrl(url);
            dataSource.setUsername(userName);
            dataSource.setPassword(password);
            return dataSource;
    }
}

        3)配置Mybatis

package com.gc.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;

public class MybatisConfig {
    @Bean
    public SqlSessionFactoryBean getFactory(@Autowired DruidDataSource dataSource){
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        //factoryBean.setTypeAliasesPackage("com.gc.bean");   //设置别名,没有用到xml文件所以不需要
        return factoryBean;
    }

    @Bean
    public MapperScannerConfigurer getMapperScannerConfigurer(){
        MapperScannerConfigurer configurer = new MapperScannerConfigurer();
        configurer.setBasePackage("com.gc.dao");    //扫描指定包
        return configurer;
    }
}

        4)配置Spring

package com.gc.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;

@Configuration          //将类设置为核心配置类
@ComponentScan("com.gc")//扫描只当包类上的注解
@PropertySource("classpath:db.properties") //读取根目录下的db.properties配置文件
@Import({jdbcDataSource.class,MybatisConfig.class}) //导入jdbcDataSource类和MybatisConfig类
public class SpringConfig {
}

7、测试

package com.gc.test;

import com.gc.bean.Employee;
import com.gc.config.SpringConfig;
import com.gc.service.EmployeeService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.List;

public class EmployeeTest {
    //返回EmployeeService对象
    public EmployeeService getService(){
        //加载核心配置类
        ApplicationContext cxt = new AnnotationConfigApplicationContext(SpringConfig.class);
        return (EmployeeService) cxt.getBean("employeeService");
    }

    @Test
    public void SelectAll(){
        List<Employee> employeeList = getService().selectAll();
        for(Employee employee:employeeList){
            System.out.println(employee);
        }
    }

    @Test
    public void selectByName(){
        List<Employee> employeeList = getService().selectByName("2");
        for(Employee employee:employeeList){
            System.out.println(employee);
        }
    }
}

最后看下,我的目录结构
 

 博主正处于学习spring阶段,有一起学习的可以和我交流。冲冲冲

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC --- 获取请求参数、域对象共享数据、视图

一、SpringMVC获取请求参数 1.1、通过ServletAPI获取 将 HttpServletRequest 作为控制器方法的形参&#xff0c;此时 HttpServletRequest 类型的参数表示封装了当前请求的请求报文的对象 RequestMapping("/param/servletAPI")public String getParamByServletAPI(H…

从零开始实现一个C++高性能服务器框架----配置模块

此项目是根据sylar框架实现&#xff0c;是从零开始重写sylar&#xff0c;也是对sylar丰富与完善 项目地址&#xff1a;https://gitee.com/lzhiqiang1999/server-framework 简介 项目介绍&#xff1a;实现了一个基于协程的服务器框架&#xff0c;支持多线程、多协程协同调度&am…

【C++】多态(下)

文章目录1.单继承中的虚函数表整体代码用程序打印虚表如何寻找到虚表地址虚表存在哪里&#xff1f;2.多继承中的虚函数表整体代码寻找虚表地址注意事项多继承重写后的func1的地为什么地址不同&#xff1f;ptr1调用函数——一次jmpptr2 调用函数——多次jmp1.单继承中的虚函数表…

window环境 python ide 安装教程分享

一、 右键-以管理员身份运行 python.exe&#xff08;以安装 3.8 的为例&#xff0c;安 装方法是一样的哈&#xff09; 二、选择你的安装方式。 特别注意&#xff1a;需要把 Add Python ** to PATH 勾选上 ②Customize installation 是自定义安装&#xff0c;安装位置你可以自己…

链表【左程云:Java】

一、单链表 1.单链表的节点结构 2.反转单向和双向链表 2.1 反转单向 package leetcode.链表;/*** author lin* creat 2022--12--12:50** https://leetcode.cn/problems/reverse-linked-list/*/ public class $_206反转链表 {public class ListNode {int val;ListNode next;L…

基于VHDL语言的汽车测速系统设计_kaic

摘 要 汽车是现代交通工具。车速是一项至关重要的指标。既影响着汽车运输的生产率,又关乎着汽车行驶有没有超速违章&#xff0c;还影响着汽车行驶时人们的人身安全。而伴随着我国国民的安全防范意识的逐步增强&#xff0c;人们也开始越来越关心因为汽车的超速而带来的极其严重…

一份sql笔试

1、 select substr(time,1,10),count(order_id),count(distinct passenger_id) from order where substr(time,1,7)2023-08 group by substr(time,1,10) order by substr(time,1,10);2、 select city_id from (select * from order where substr(time,1,7) 2022-08) t1 left j…

【新2023Q2押题JAVA】华为OD机试 - 打折买水果

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:打折买水果 题目 有 m m m…

Spring之属性填充

Spring给属性的方式一般有三种 1、通过在属性的添加Autowired注解 Component public class UserService {Autowiredprivate OrderService orderService;public void setOrderService(OrderService orderService) {this.orderService orderService;}public OrderService getO…

b站第一,Python自动化测试实战详细教学,3天教你学会自动化测试

目录 简介 Python自动化测试概述 Python自动化测试目标 Python自动化测试流程 1. 测试计划和设计 2. 测试脚本开发 3. 测试执行和管理 4. 测试维护和优化 Python自动化测试最佳实践 Python自动化测试工具和框架 结论 简介 自动化测试是软件开发过程中一个必不可少的…

【Django 网页Web开发】22. 实战项目:简单的文件上传(15)(保姆级图文)

目录实现效果1. url.py2. upload_list.html3. upload.py总结欢迎关注 『Django 网页Web开发』 系列&#xff0c;持续更新中 欢迎关注 『Django 网页Web开发』 系列&#xff0c;持续更新中 实现效果 1. url.py path(upload/list/, upload.upload_list),2. upload_list.html {% e…

Python中进程和线程到底有什么区别?

人生苦短&#xff0c;我用python python 安装包资料:点击此处跳转文末名片获取 一、进程和线程的关系 线程与进程的区别可以归纳为以下4点&#xff1a; 地址空间和其它资源&#xff08;如打开文件&#xff09;&#xff1a;进程间相互独立&#xff0c;同一进程的各线程间共享。…

操作系统(2.6)--进程通信

进程通信是指进程之间的信息交换。 在进程之间要传送大量数据时&#xff0c;应当利用OS提供的高级通信工具&#xff0c;该工具最主要的特点是: (1)使用方便。OS隐藏了实现进程通信的具体细节&#xff0c;向用户提供了一组用于实现高级通信的命令(原语)&#xff0c;用户可方便地…

ThreeJS-太阳球围绕旋转(二十四)

数学小知识&#xff1a; 我们根据旋转角度θ可以计算出任意时刻的x,y sinθ y0/r; 因此y0 rsinθ, cosθ x0/r,因此x0 rcosθ, 小拓展&#xff1a; y0^ x0^ - r^2*sinθ^2 r^2*cosθ^2 r^2*(sinθ^2 cosθ^2) r^2; 这也是为什么在极坐标方程中 y0 rsinθ, x0 rcos…

15_I.MX6ULL_LCD显示原理

目录 LCD简介 分辨率 像素格式 LCD屏幕接口 LCD时间参数 RGB LCD屏幕时序 像素时钟 显存 LCD简介 LCD全称是Liquid Crystal Display,也就是液晶显示器,是现在最常用到的显示器,手机、电脑、各种人机交互设备等基本都用到了LCD,最常见就是手机和电脑显示器了。LCD的构造…

帮公司面试了一个32岁的程序员,只因这一个细节,被我一眼看穿是培训班出来的,没啥工作经验...

首先&#xff0c;我说一句&#xff1a;培训出来的&#xff0c;优秀学员大有人在&#xff0c;我不希望因为带着培训的标签而无法达到用人单位和候选人的双向匹配&#xff0c;是非常遗憾的事情。 最近&#xff0c;在网上看到这样一个留言&#xff0c;引发了程序员这个圈子不少的…

ChatGPT全球大封号!数10万企业停摆:第一批玩AI的人,被AI给玩了

观点| Mr.K 主笔| Wendy.L 编辑| Emma来源| 技术领导力(ID&#xff1a;jishulingdaoli)3月31日&#xff0c;Open AI就开始无征兆的进行全球大封号&#xff0c;其中亚洲是重灾区&#xff0c;官方没有给出任何声明&#xff0c;具体原因不得而知。并且暂停了这些地区新账号的注…

【从零开始学习 UVM】6.4、UVM 激励产生 —— uvm_do 宏详解

请注意,start方法的call_pre_post字段设置为0,这意味着在使用这些序列宏时,序列的pre_body和post_body方法将永远不会被调用。否则,执行流程与通过start方法执行序列时类似。 文章目录 执行序列宏介绍Example执行序列宏介绍 使用序列宏的优点是可以使用内联约束,但是您失…

实验一 跨VLAN访问

目录 一、按照拓扑图配置VLAN&#xff0c;并实现跨VLAN间的访问。 二、实验环境 三、实验步骤 一、按照拓扑图配置VLAN&#xff0c;并实现跨VLAN间的访问。 1、配置好交换机的VLAN和各个终端的地址&#xff0c;实现各个VLAN内能连通。 2、开启两个交换机的VTY连接&#xff0…

基于STM32F103——XGZP6847D压力传感器+串口打印

基于STM32F103—XGZP6847D压力传感器串口打印基本介绍概述产品特点引脚的连接 (IIC通信)名称含义的介绍I2C通信协议 (设备地址是 0x6D)寄存器描述工作模式寄存器Reg0x30&#xff08;测量命令寄存器&#xff09;Reg0xA5Reg0xA6模式说明组合数据采集模式休眠数据采集模式代码编写…