From 52818a7539c725de67a2d9728147a4daa62cd932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=96=E5=BF=83=E5=A6=8D?= <2392642810@qq.com> Date: Mon, 8 Jan 2024 22:11:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...33\345\273\272\345\256\271\345\231\250.md" | 53 -- ...50\350\247\243\345\274\200\345\217\221.md" | 383 ++++++++++++ ... mybatis\346\225\264\345\220\210spring.md" | 451 ++++++++------ ...0231229 \346\225\264\345\220\210spring.md" | 448 ++++++++------ .../20240102 SpringMVC.md" | 390 ++++++------ .../20240102 \347\254\224\350\256\260.md" | 182 ------ ...26\344\270\200\347\202\271\347\211\210.md" | 449 ++++++++++++++ ...5 \346\234\200\347\273\210\347\211\210.md" | 568 ++++++++++++++++++ 8 files changed, 2123 insertions(+), 801 deletions(-) delete mode 100644 "03 \350\265\226\345\277\203\345\246\215/20231227 \345\210\233\345\273\272\345\256\271\345\231\250.md" create mode 100644 "03 \350\265\226\345\277\203\345\246\215/20231227 \346\263\250\350\247\243\345\274\200\345\217\221.md" rename "03 \350\265\226\345\277\203\345\246\215/20240103 \347\254\224\350\256\260.md" => "03 \350\265\226\345\277\203\345\246\215/20240102 SpringMVC.md" (39%) delete mode 100644 "03 \350\265\226\345\277\203\345\246\215/20240102 \347\254\224\350\256\260.md" create mode 100644 "03 \350\265\226\345\277\203\345\246\215/20240103 SpringMVC\350\277\233\345\214\226\344\270\200\347\202\271\347\211\210.md" create mode 100644 "03 \350\265\226\345\277\203\345\246\215/20240105 \346\234\200\347\273\210\347\211\210.md" diff --git "a/03 \350\265\226\345\277\203\345\246\215/20231227 \345\210\233\345\273\272\345\256\271\345\231\250.md" "b/03 \350\265\226\345\277\203\345\246\215/20231227 \345\210\233\345\273\272\345\256\271\345\231\250.md" deleted file mode 100644 index b6caf78..0000000 --- "a/03 \350\265\226\345\277\203\345\246\215/20231227 \345\210\233\345\273\272\345\256\271\345\231\250.md" +++ /dev/null @@ -1,53 +0,0 @@ -创建容器 - -加载多个配置文件 - -```java -ApplicationContext ctx = new ClassPathXmlApplicationContext("bean1.xml", "bean2.xml"); -``` - - - -Spring提供@Component注解的三个衍生注解 - -@Controller:用于表现层bean定义 - -@Service:用于业务层bean定义 - -@Repository:用于数据层bean定义 - -```java -@Repository("bookDao")public class BookDaoImpl implements BookDao {} -@Servicepublic class BookServiceImpl implements BookService {} - -``` - -Spring3.0开启了纯注解开发模式,使用Java类替代配置文件,开启了Spring快速开发赛道Java类代替Spring核心配置文件, - -@Configuration注解用于设定当前类为配置类@ComponentScan注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式 - -```java -@ComponentScan({com.mdd.service","com.mdd.dao"}) - -``` - -```java -//加载配置文件初始化容器 -ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); -//加载配置类初始化容器 -ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class); - -``` - -依赖注入 - -使用@Autowired注解开启自动装配模式(按类型) - -```java -@Servicepublic class BookServiceImpl implements BookService { @Autowired private BookDao bookDao; public void setBookDao(BookDao bookDao) { this.bookDao = bookDao; } public void save() { System.out.println("book service save ..."); bookDao.save(); }} - -``` - -注意:自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法 - -注意:自动装配建议使用无参构造方法创建对象(默认),如果不提供对应构造方法,请提供唯一的构造方法 \ No newline at end of file diff --git "a/03 \350\265\226\345\277\203\345\246\215/20231227 \346\263\250\350\247\243\345\274\200\345\217\221.md" "b/03 \350\265\226\345\277\203\345\246\215/20231227 \346\263\250\350\247\243\345\274\200\345\217\221.md" new file mode 100644 index 0000000..65a9069 --- /dev/null +++ "b/03 \350\265\226\345\277\203\345\246\215/20231227 \346\263\250\350\247\243\345\274\200\345\217\221.md" @@ -0,0 +1,383 @@ +### 1 配置pom.xml文件 + +```xml + + + + 4.0.0 + + com.yina + untitled07 + 1.0-SNAPSHOT + + + + org.springframework + spring-context + 5.2.25.RELEASE + + + + + com.alibaba + druid + 1.1.23 + + + + + org.mybatis + mybatis + 3.5.2 + + + + + com.mysql + mysql-connector-j + 8.1.0 + + + + + org.mybatis + mybatis-spring + 2.0.5 + + + + + org.springframework + spring-jdbc + 5.2.25.RELEASE + + + + junit + junit + 4.13.2 + test + + + + org.springframework + spring-test + 5.2.25.RELEASE + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 6 + 6 + + + + + +``` + +### 2 在域名包(com.yina)下创建domain包下创建User实体类 + +```java +package com.yina.domain; + +public class User { + private int id; + private String username; + private int age; + private String gender; + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", username='" + username + '\'' + + ", age=" + age + + ", gender='" + gender + '\'' + + '}'; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public User() { + } + + public User(int id, String username, int age, String gender) { + this.id = id; + this.username = username; + this.age = age; + this.gender = gender; + } +} +``` + +### 3 在resources包下创建jdbc.properties文件 + +```properties +jdbc.driver = com.mysql.cj.jdbc.Driver +jdbc.url = jdbc:mysql:///db_2023?useSSL=false&allowPublicKeyRetrieval=true +jdbc.username = root +jdbc.password = root +``` + +### 4 在域名包(com.yina)下创建config包创建JdbcConfig类 + +```java +package com.yina.config; + +import com.alibaba.druid.pool.DruidDataSource; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; + +import javax.sql.DataSource; + + +public class JdbcConfig { + @Value("${jdbc.driver}") + private String driver; + @Value("${jdbc.url}") + private String url; + @Value("${jdbc.username}") + private String username; + @Value("${jdbc.password}") + private String password; + // 整合DataSource + @Bean + public DataSource dataSource(){ + DruidDataSource ds = new DruidDataSource(); + ds.setDriverClassName(driver); + ds.setUrl(url); + ds.setUsername(username); + ds.setPassword(password); + return ds; + } +} +``` + +### 5 在域名包(com.yina)下创建service包创建UserService接口 + +```java +package com.yina.service; + +public interface UserService { + void findAll(); +} +``` + +### 6 在service包创建impl包创建UserServiceImpl类 + +```java +package com.yina.service.impl; + +import com.yina.mapper.UserMapper; +import com.yina.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Service; + +//@Component("service") 表示是一个bean +//@Component("service") +//业务层 +@Service +//有这个才可以使用text.properties里设置的变量 +@PropertySource({"classpath:jdbc.properties"}) +public class UserServiceImpl implements UserService { +// 这个是为了在ApplicationContext.xml文件的自动配对注入 + @Autowired + private UserMapper userMapper; + + @Override + public void findAll(){ + System.out.println("我是业务层,我开始我的业务逻辑了,"); +// 调用UserMapper里的方法,要创建对象创建setter方法并在ApplicationContext.xml文件里创建对象文件 + userMapper.finaAll(); + } +} + +``` + +### 7 在域名包(com.yina)下创建mapper包创建UserMapper接口 + +```java +package com.yina.mapper; + +import com.yina.domain.User; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +public interface UserMapper { + @Select("select * from tb_user") + List finaAll(); + + List selectByCognition(User user); +} +``` + +### 8 在config包下创建MybatisConfig类 + +```java +package com.yina.config; + +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.mapper.MapperScannerConfigurer; +import org.springframework.context.annotation.Bean; + +import javax.sql.DataSource; + +public class MybatisConfig { + // 整合Mybatis + // sql + @Bean + public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){ + SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean(); + ssfb.setTypeAliasesPackage("com.yina.domain"); + ssfb.setDataSource(dataSource); + return ssfb; + } + // mapper + @Bean + public MapperScannerConfigurer mapperScannerConfigurer(){ + MapperScannerConfigurer msc = new MapperScannerConfigurer(); + msc.setBasePackage("com.yina.mapper"); + return msc; + } +} +``` + +### 9 在config包下创建SpringConfig类 + +```java +package com.yina.config; + +import org.springframework.context.annotation.*; + +//因为注解了所以不需要那个xml文件 +//@Configuration声明这是一个配置类 +@Configuration +//扫域名包,如果报错就多扫描几次 +//@ComponentScan("com.yina") 声明要将哪些包下的bean放入容器 +@ComponentScan({"com.yina.mapper","com.yina.service"}) // 如果要扫过个包要扫数据的形式 +@Import({JdbcConfig.class, MybatisConfig.class}) +@PropertySource({"classpath:jdbc.properties"}) +//这个是核心配置文件,只做配置 +public class SpringConfig { +} +``` + +### 10 在resources包下创建域名包(com.yina)下创建mapper包下创建UserMapper.xml + +```xml + + + + + + +``` + +### 11 在service包下创建App类 + +```java +package com.yina; + +import com.yina.config.SpringConfig; +import com.yina.domain.User; +import com.yina.mapper.UserMapper; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +import java.util.List; + +public class App { + public static void main(String[] args) { + // 1 通过spring配置文件,获取到ioc容器 +// ApplicationContext ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml"); +// 这里的userMapper是ApplicationContext.xml里的id + // 两种方式都可以但是第一个比较好用 + // FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext("D:\\javaproject\\untitled07\\src\\main\\resources\\ApplicationContext.xml"); + AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class); + // 2 通过ioc容器的getBean方法 + // 面向接口编程,用接口去保存其实现类的对象 + // UserMapper userMapper = (UserMapper) ctx.getBean("userMapper"); + // 直接通过bean的类型获取,前提是这个类型是唯一 +// UserMapper userMapper = ctx.getBean(UserMapper.class); +// userMapper.finaAll(); +// UserService service = ctx.getBean(UserService.class); +// service.findAll(); +// 通过SpringConfig拿DataSource类型的值 + UserMapper userMapper = ctx.getBean(UserMapper.class); + List list = userMapper.finaAll(); + System.out.println(list); + } +} +``` + +### 12 在test包下java包下创建域名包(com.yina)下创建Test01测试类 + +```java +package com.yina; + +import com.yina.config.SpringConfig; +import com.yina.domain.User; +import com.yina.mapper.UserMapper; +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 java.util.List; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = SpringConfig.class) +public class Test01 { + @Autowired + private UserMapper userMapper; + @Test + public void test01(){ + List all = userMapper.finaAll(); + System.out.println(all); + } +} +``` + diff --git "a/03 \350\265\226\345\277\203\345\246\215/20231228 mybatis\346\225\264\345\220\210spring.md" "b/03 \350\265\226\345\277\203\345\246\215/20231228 mybatis\346\225\264\345\220\210spring.md" index c9b0192..c047934 100644 --- "a/03 \350\265\226\345\277\203\345\246\215/20231228 mybatis\346\225\264\345\220\210spring.md" +++ "b/03 \350\265\226\345\277\203\345\246\215/20231228 mybatis\346\225\264\345\220\210spring.md" @@ -1,110 +1,117 @@ -1. 打开IDEA,新建一个项目(模块),开启MySQL - -2. 编写Pom.mxl文件,导入相关依赖的坐标 - -~~~ xml - - - 4.0.0 - - com.mdd - spring_02 - 1.0-SNAPSHOT - - - 8 - 8 - UTF-8 - - - - - org.springframework - spring-context - 5.1.10.RELEASE - - - - org.springframework - spring-jdbc - 5.1.10.RELEASE - - - org.springframework - spring-test - 5.1.10.RELEASE - - - - org.mybatis - mybatis - 3.5.13 - - - - org.mybatis - mybatis-spring - 2.0.5 - - - - com.mysql - mysql-connector-j - 8.1.0 - - - - junit - junit - 4.13.2 - test - - - - com.alibaba - druid - 1.1.23 - - - -~~~ +#### 1.打开IDEA,新建一个项目(模块),开启MySQL + +#### 2.编写Pom.mxl文件,导入相关依赖的坐标 -3. 创建数据库的相关表,列,并导入数据 -4. 在src下的 main下的 java里新建包com.mdd.domain,并在 domain下创建实体类 Brand +#### 3.创建数据库的相关表,列,并导入数据 + +#### 4.在src下的 main下的 java里域名包(com.mdd)创建domain包,并在 domain下创建实体类 Brand ~~~ java +package com.nct.domain; + public class Brand { - // id 主键 private Integer id; - // 品牌名称 private String brandName; - // 企业名称 private String companyName; - // 排序字段 private Integer ordered; - // 描述信息 private String description; - // 状态:0:禁用 1:启用 private Integer status; - // 无参、全参、get,set方法、tostring方法 + + @Override + public String toString() { + return "Brand{" + + "id=" + id + + ", brandName='" + brandName + '\'' + + ", companyName='" + companyName + '\'' + + ", ordered=" + ordered + + ", description='" + description + '\'' + + ", status=" + status + + '}'; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public Integer getOrdered() { + return ordered; + } + + public void setOrdered(Integer ordered) { + this.ordered = ordered; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Brand() { + } + + public Brand(Integer id, String brandName, String companyName, Integer ordered, String description, Integer status) { + this.id = id; + this.brandName = brandName; + this.companyName = companyName; + this.ordered = ordered; + this.description = description; + this.status = status; + } +} ~~~ -5. 编写代理接口 com.mdd.mapper.BrandMapper.java ,用来从数据库从获取数据 +#### 5.编写代理接口 在com.nct.包下创建mapper包创建BrandMapper代理接口,用来从数据库从获取数据 -~~~ java +```java +package com.nct.mapper; + +import com.nct.domain.Brand; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +// 代理接口,用来获取数据库数据 public interface BrandMapper { - // 给不符字段添加别名(解决数据为null的问题) - @Select("select id, brand_name brandName, company_name companyName, ordered, description, status from tb_brand") - // 查询所有数据 - List findAll(); - // 根据相应条件查询,动态SQL - List selectByCondition(Brand brand); + // 写增删改查的各种方法 + // 1 查所有Brand + // 使用别名是因为字段名和实体类的变量不一致,会导致查询结果为空 + @Select("select id,brand_name as brandName,company_name as companyName,ordered,description,status from tb_brand") // 简单的语句可以直接使用注解开发 + List findAll(); // 因为查询结果是集合所以用集合 } -~~~ +``` -6. 在 com.mdd.config 目录下,编写Spring核心配置类文件SpringConfig.java,写上@Configuration注解,将这个类变成配置类 +#### 6.在 com.nct包下创建config 包,编写Spring核心配置类文件SpringConfig.java,写上@Configuration注解,将这个类变成配置类 ~~~ java @Configuration @@ -114,19 +121,26 @@ public class SpringConfig { } ~~~ -7. 在 com.mdd.config 目录下,编写 JdbcConfig.java也就是mysql驱动配置类文件 +7.在 com.mdd.config 目录下,编写 JdbcConfig.java也就是mysql驱动配置类文件 ~~~ java +package com.nct.config; + +import com.alibaba.druid.pool.DruidDataSource; +import org.springframework.context.annotation.Bean; + +import javax.sql.DataSource; + public class JdbcConfig { - // jdbc负责连接mysql,配置驱动,url,用户名,密码 - // spring如何加载第三方的Bean,通过写一个方法,返回这个bea 的类弄。并上这个方法上写一个注解@Bean + // jdbc负责连接mysql,配置驱动,url,用户名,密码 + // 通过写一个方法,返回这个bean的类型,并上这个方法写一个注解@Bean,让这个spring加载第三方的bean @Bean public DataSource dataSource(){ - // 此时 DataSource 为实现类,需通过 druid 代理 dataSource + // 这里要用DruidDataSource DruidDataSource ds = new DruidDataSource(); - // 配置连接四要素:驱动、url、密码、用户名 + // 配置连接四要素:驱动,url,用户名,密码 ds.setDriverClassName("com.mysql.cj.jdbc.Driver"); - ds.setUrl("jdbc:mysql://localhost:3306/mybatis?useSSl=false"); + ds.setUrl("jdbc:mysql:///db_2023?useSSL=false&allowPublicKeyRetrieval=true"); ds.setUsername("root"); ds.setPassword("root"); return ds; @@ -134,119 +148,165 @@ public class JdbcConfig { } ~~~ -8. 在 com.mdd.config 目录下,编写MybatisConfig.java配置类文件 +#### 8.再次编写Spring核心配置类文件SpringConfig.java + +```java +package com.nct.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +// @Configuration声明此类是一个配置类 +@Configuration +// 导入JdbcConfig +@Import(JdbcConfig.class) +public class SpringConfig { +} +``` + +#### 9.在com.nct目录下创建App测试类 + +```java +package com.nct; + +import com.nct.config.SpringConfig; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +import javax.sql.DataSource; + +public class App { + public static void main(String[] args) { + // 1 通过Spring核心配置文件,获取IOC容器 + ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class); + // 2 通过IOC容器对象的getBean获取对应的bean(对象) + DataSource dataSource = ctx.getBean(DataSource.class); + System.out.println(dataSource); + + } +} +``` + +#### 10.在config包创建MybatisConfig类 + +```java +package com.nct.config; + +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.mapper.MapperScannerConfigurer; +import org.springframework.context.annotation.Bean; + +import javax.sql.DataSource; -~~~ java public class MybatisConfig { - // 这里做两件事,1.获取SqlSessionFactoryBean 2.获取Mapper代理的包 - //1.获取SqlSessionFactoryBean + // 1 获取SqlSessionFactoryBean @Bean public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){ SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean(); - // ssfb 也要做两件事:1.设置实体类的别名 2.设置数据源 - ssfb.setTypeAliasesPackage("com.mdd.domain"); // 实体类所在包的位置 + // 1 设置实体类的别名 + ssfb.setTypeAliasesPackage("com.nct.domain"); // 实体类所在的包的路径 + // 2 设置数据语言 ssfb.setDataSource(dataSource); return ssfb; } + // 2 获取Mapper代理的包 @Bean - //2.获取Mapper代理的包 - public MapperScannerConfigurer mapperScannerConfigurer(){ + public MapperScannerConfigurer mapperScannerConfigurer(DataSource dataSource){ MapperScannerConfigurer msc = new MapperScannerConfigurer(); - msc.setBasePackage("com.mdd.mapper"); // 代理类包的位置 + msc.setBasePackage("com.nct.mapper"); // 代理类的包的路径 return msc; } } -~~~ +``` -9. 测试代理的功能 +#### 11.再一次编写SpringConfig类 -~~~ java -public class App { - public static void main(String[] args) { - // 1.通过 spring核心配置文件 获取 IOC容器 - ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class); - // 2.获取代理接口的对象 - BrandMapper brandMapper = ctx.getBean(BrandMapper.class); - List all = brandMapper.findAll(); - System.out.println(all); - } -} -~~~ +```java +package com.nct.config; -10. 遇上复杂的sql,及要使用动态SQL时就要配置对应的XML配置文件在resources下根据代理接口com/mdd/mapper的路径,创建一个**同包同名**的xml文件 com/mdd/mapper/BrandMapper.xml - -~~~ xml - - - - - - - - - - -~~~ +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +// @Configuration声明此类是一个配置类 +@Configuration +@Import({JdbcConfig.class, MybatisConfig.class}) +@ComponentScan("com.nct") +public class SpringConfig { +} +``` -11. 在Test中测试代理的方法 +#### 12.在Test包下java包下创建域名(com.nct)包下创建test包创建BrandTest测试类 ~~~ java -@RunWith(SpringJUnit4ClassRunner.class) // 加载spring为Junit专门提供的运行类 -@ContextConfiguration(classes = SpringConfig.class) // 加载Spring核心配置文件,IOC容器 +package com.nct.test; + +import com.nct.domain.Brand; +import com.nct.mapper.BrandMapper; +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 java.util.List; + +@RunWith(SpringJUnit4ClassRunner.class) // 加载spring为junit专门提供的运行类 +@ContextConfiguration(classes = SpringConfig.class) // 加载spring核心配置,可以理解为加载IOC容器 public class BrandTest { - //通过自动装配的形式,直接将 bean 注入进来 + // 通过自动装配的形式,直接将要bean注入进来 @Autowired private BrandMapper brandMapper; @Test public void test01(){ // List all = brandMapper.findAll(); // System.out.println(all); - - // 1. 模拟浏览器向服务器发送了查询的数据 - String brandName = "华为"; - String companyName = "华为"; - // 2. 因为是模糊查询,参数要加 % + // 1 模拟浏览器向服务器发送查询数量 + String brandName = "得啵椅子"; + String companyName = "IST"; + // 1.5 因为要模糊查询,所以要对原始数据,做加%处理 brandName = "%"+brandName+"%"; companyName = "%"+companyName+"%"; - // 3. 将数据分装成一个对象 + // 2 将查询数据封装成一个brand对象 Brand brand = new Brand(); brand.setBrandName(brandName); brand.setCompanyName(companyName); - // 4. 调用代理对象接口中的方法 + // 3 调用代理对象,数据区这个brand List brands = brandMapper.selectByCondition(brand); System.out.println(brands); } } ~~~ -12. 模拟业务层,先有一个接口,再写一个实现类 +#### 13.模拟业务层,先有一个接口,再写一个实现类 -com.mdd.service.BrandService.java 接口 +##### 在com.nct包下创建service包创建BrandService接口 ~~~ java +package com.nct.service; + +import com.nct.domain.Brand; + +import java.util.List; + public interface BrandService { - List findAll(); + List selectAll(); } ~~~ -com.mdd.service.impl.BrandServiceImpl.java 实现类 +##### 在service包下创建impl包创建BrandServiceImpl类 ~~~ java +package com.nct.service.impl; + +import com.nct.domain.Brand; +import com.nct.mapper.BrandMapper; +import com.nct.service.BrandService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + @Service public class BrandServiceImpl implements BrandService { // 业务层要实现数据的调用,就要借助数据层的对象 @@ -254,65 +314,62 @@ public class BrandServiceImpl implements BrandService { @Autowired private BrandMapper brandMapper; @Override - public List findAll() { - System.out.println("业务层的命运齿轮开始运转。。。。"); - // 返回数据层获得的结果 + public List selectAll(){ + System.out.println("开始业务"); return brandMapper.findAll(); } } ~~~ -13. 测试类,模拟表现层调用业务层 +#### 14.再试试BrandTest测试类 ~~~ java -@RunWith(SpringJUnit4ClassRunner.class) // 加载spring为Junit专门提供的运行类 -@ContextConfiguration(classes = SpringConfig.class) // 加载Spring核心配置文件,IOC容器 +package com.nct.test; + +import com.nct.config.SpringConfig; +import com.nct.domain.Brand; +import com.nct.mapper.BrandMapper; +import com.nct.service.BrandService; +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 java.util.List; + +@RunWith(SpringJUnit4ClassRunner.class) // 加载spring为junit专门提供的运行类 +@ContextConfiguration(classes = SpringConfig.class) // 加载spring核心配置,可以理解为加载IOC容器 public class BrandTest { - //通过自动装配的形式,直接将 bean 注入进来 + // 通过自动装配的形式,直接将要bean注入进来 @Autowired private BrandMapper brandMapper; @Autowired - private BrandService brandService; // 要什么就自动装配什么,装配的是接口,面向接口编程 + private BrandService brandService; // 要什么就自动装配什么 @Test public void test01(){ // List all = brandMapper.findAll(); // System.out.println(all); - // 1. 模拟浏览器向服务器发送了查询的数据 - String brandName = "华为"; - String companyName = "华为"; - // 2. 因为是模糊查询,参数要加 % + // 1 模拟浏览器向服务器发送查询数量 + String brandName = "得"; + String companyName = "I"; + // 1.5 因为要模糊查询,所以要对原始数据,做加%处理 brandName = "%"+brandName+"%"; companyName = "%"+companyName+"%"; - // 3. 将数据分装成一个对象 + // 2 将查询数据封装成一个brand对象 Brand brand = new Brand(); brand.setBrandName(brandName); brand.setCompanyName(companyName); - // 4. 调用代理对象接口中的方法 + // 3 调用代理对象,数据区这个brand List brands = brandMapper.selectByCondition(brand); System.out.println(brands); } // 模拟表现层调用业务层 @Test - public void test02(){ - List all = brandService.findAll(); - System.out.println(all); + public void testService(){ + List brands = brandService.selectAll(); + System.out.println(brands); } } ~~~ - -14. SptingConfig 类 扫包 - -~~~ java -@Configuration -@Import({JdbcConfig.class, MybatisConfig.class}) -@ComponentScan("com.mdd") -public class SpringConfig { -} -~~~ - -注意:不要漏掉以下操作: - -1. 将实现类用注解@Service,标记为一个Bean - -2. 修改SpringConfig.java,将业务层的包,用 @CompenentScan("com.mdd") ,扫描进来 \ No newline at end of file diff --git "a/03 \350\265\226\345\277\203\345\246\215/20231229 \346\225\264\345\220\210spring.md" "b/03 \350\265\226\345\277\203\345\246\215/20231229 \346\225\264\345\220\210spring.md" index 5d788f7..0196f7e 100644 --- "a/03 \350\265\226\345\277\203\345\246\215/20231229 \346\225\264\345\220\210spring.md" +++ "b/03 \350\265\226\345\277\203\345\246\215/20231229 \346\225\264\345\220\210spring.md" @@ -1,9 +1,76 @@ -# 复习 +### com.tbz.domain目录 -### JdbcConfig +#### User类 ```java -package com.mdd.config; +package com.tbz.domain; + +public class User { + private Integer id; + private String username; + private Integer age; + private String gender; + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", username='" + username + '\'' + + ", age=" + age + + ", gender='" + gender + '\'' + + '}'; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public User() { + } + + public User(Integer id, String username, Integer age, String gender) { + this.id = id; + this.username = username; + this.age = age; + this.gender = gender; + } +} +``` + +### com.tbz.config目录 + +#### JdbcConfig类 + +```java +package com.tbz.config; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.context.annotation.Bean; @@ -15,251 +82,278 @@ public class JdbcConfig { public DataSource dataSource(){ DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName("com.mysql.cj.jdbc.Driver"); - ds.setUrl("jdbc:mysql:///masql"); + ds.setUrl("jdbc:mysql:///db_2023"); ds.setUsername("root"); - ds.setPassword("123456"); + ds.setPassword("root"); return ds; } } - ``` -### MybatisConfig +#### MybatisConfig类 ```java -package com.mdd.config; +package com.tbz.config; -import org.mybatis.spring.SqlSessionFactoryBean; -import org.mybatis.spring.mapper.MapperScannerConfigurer; +import com.alibaba.druid.pool.DruidDataSource; import org.springframework.context.annotation.Bean; import javax.sql.DataSource; -public class MybatisConfig { - @Bean - public SqlSessionFactoryBean sessionFactoryBean(DataSource dataSource){ - SqlSessionFactoryBean ssfy = new SqlSessionFactoryBean(); - ssfy.setTypeAliasesPackage("com.mdd.domain"); - ssfy.setDataSource(dataSource); - return ssfy; - } +public class JdbcConfig { @Bean - public MapperScannerConfigurer mapperScannerConfigurer(){ - MapperScannerConfigurer mc = new MapperScannerConfigurer(); - mc.setBasePackage("com.mdd.mapper"); - return mc; + public DataSource dataSource(){ + DruidDataSource ds = new DruidDataSource(); + ds.setDriverClassName("com.mysql.cj.jdbc.Driver"); + ds.setUrl("jdbc:mysql:///db_2023"); + ds.setUsername("root"); + ds.setPassword("root"); + return ds; } } - ``` -### SpringConfig +#### SpringConfig类 ```java -package com.mdd.config; +package com.tbz.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @Configuration -@ComponentScan("com.mdd") -@Import({JdbcConfig.class,MybatisConfig.class}) +@ComponentScan("com.tbz") +@Import({JdbcConfig.class, MybatisConfig.class}) public class SpringConfig { - } +``` + +### com.tbz.mapper目录 + +#### UserMapper接口 + +```java +package com.tbz.mapper; + +import com.tbz.domain.User; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +import java.util.List; + +public interface UserMapper { + // 查询所有 + @Select("select * from tb_user") + List findAll(); + + // 按ID查询某个用户 + @Select("select * from tb_user where id = #{id}") + User findById(int id); + // 按ID删除某个用户 + @Delete("delete from tb_user where id = #{id}}") + void deleteById(int id); + + // 修改某个用户 + @Update("update tb_user set username = #{username},age = #{age},gender = #{gender} where id = #{id}") + void update(User user); + + // 新增用户 + @Insert("insert into tb_user (username,age,gender) values (#{username},#{age},#{gender})") + void insert(User user); +} ``` -### User +### com.tbz目录 + +#### App测试类 ```java -package com.mdd.domain; +package com.tbz; -public class User { - private Integer id; - private String name; - private String sex; - private Integer age; +import com.tbz.config.SpringConfig; +import com.tbz.domain.User; +import com.tbz.mapper.UserMapper; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; - public User() { - } +import java.util.List; - public User(Integer id, String name, String sex, Integer age) { - this.id = id; - this.name = name; - this.sex = sex; - this.age = age; +public class App { + public static void main(String[] args) { + // 1 获取IOC容器 + ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class); + // 2 getBean从容器中拿对象 + UserMapper mapper = ctx.getBean(UserMapper.class); + // 3 执行对象方法 + List userList = mapper.findAll(); + System.out.println(userList); } +} +``` - public Integer getId() { - return id; - } +### com.tbz.test测试目录 - public void setId(Integer id) { - this.id = id; - } +#### UserTest类 - public String getName() { - return name; - } +```java +package com.tbz.test; - public void setName(String name) { - this.name = name; - } +import com.tbz.config.SpringConfig; +import com.tbz.domain.User; +import com.tbz.mapper.UserMapper; +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; - public String getSex() { - return sex; - } +import java.util.List; - public void setSex(String sex) { - this.sex = sex; +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = SpringConfig.class) +public class UserTest { + @Autowired + private UserMapper userMapper; + @Test + public void test01(){ + System.out.println("查询所有"); + List all = userMapper.findAll(); + System.out.println(all); } - - public Integer getAge() { - return age; + @Test + public void test02(){ + System.out.println("根据id查询"); + User user = userMapper.findById(1); + System.out.println(user); } - - public void setAge(Integer age) { - this.age = age; + @Test + public void test03(){ + System.out.println("删除"); + userMapper.deleteById(1); + System.out.println("删除成功"); } - - @Override - public String toString() { - return "User{" + - "id=" + id + - ", name='" + name + '\'' + - ", sex='" + sex + '\'' + - ", age=" + age + - '}'; + @Test + public void test04(){ + System.out.println("修改"); + // 模拟浏览器传参 + String username = "yzy1.0冬"; + String gender = "女"; + int age = 23; + int id = 2; + User user = new User(id, username, age, gender); + userMapper.update(user); + System.out.println("修改成功"); + } + @Test + public void test05(){ + System.out.println("新增"); + // 模拟浏览器传参 + String username = "香芋娜set"; + String gender = "男"; + int age = 24; +// int id = 3; + User user = new User(null, username, age, gender); + userMapper.insert(user); + System.out.println("新增成功"); } } - ``` -### UserMapper +### com.service目录 + +#### UserService接口 ```java -package com.mdd.mapper; +package com.tbz.service; -import com.mdd.domain.User; -import org.apache.ibatis.annotations.Delete; -import org.apache.ibatis.annotations.Insert; -import org.apache.ibatis.annotations.Select; -import org.apache.ibatis.annotations.Update; +import com.tbz.domain.User; import java.util.List; -public interface UserMapper { - @Select("select * from tb_ures") - List findAll(); +public interface UserService { + // 查询所有 + List findAll(); - @Select("select * from tb_ures where id=#{id}") - User findByid(int id); + // 按ID查询某个用户 + User findById(int id); - @Delete("delete from tb_ures where id=#{id}") - void deleteByid(int id); + // 按ID删除某个用户 + void deleteById(int id); - @Update("Updata tb_ures set name=#{name},sex=#{sex},age=#{age} where id=#{id}") - void updetaByid(User user); + // 修改某个用户 + void update(User user); - @Insert("insert into tb_ures(name,sex,age) values(#{name},#{sex},#{age})") - void insertByid(User user); + // 新增用户 + void insert(User user); } ``` -### App 测试类 +### com.service.impl目录 + +#### UserServiceImpl类 ```java -import com.mdd.config.SpringConfig; -import com.mdd.domain.User; -import com.mdd.mapper.UserMapper; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; +package com.tbz.service.impl; + +import com.tbz.domain.User; +import com.tbz.mapper.UserMapper; +import com.tbz.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import java.util.List; -public class App { - public static void main(String[] args) { - ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig.class); - UserMapper bean = ctx.getBean(UserMapper.class); - List all = bean.findAll(); - System.out.println(all); +@Service +public class UserServiceImpl implements UserService { + @Autowired + private UserMapper userMapper; + @Override + public List findAll() { + System.out.println("加油吧"); + return userMapper.findAll(); + } + + @Override + public User findById(int id) { + if (id<=0){ + return null; + } + return userMapper.findById(id); + } + + @Override + public void deleteById(int id) { + userMapper.deleteById(id); + } + + @Override + public void update(User user) { + userMapper.update(user); + } + + @Override + public void insert(User user) { + userMapper.insert(user); } } +``` + +### 再用测试类试试 +```java +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = SpringConfig.class) +public class UserTest { + @Test + public void test06(){ + List all = userService.findAll(); + System.out.println(all); + } +} ``` -### 架包 - -```xml - - - 4.0.0 - - com.mdd - spring_10_review - 1.0-SNAPSHOT - - - 8 - 8 - UTF-8 - - - - - org.springframework - spring-context - 5.2.25.RELEASE - - - - org.springframework - spring-jdbc - 5.2.25.RELEASE - - - org.springframework - spring-test - 5.2.25.RELEASE - - - - org.mybatis - mybatis - 3.5.13 - - - - org.mybatis - mybatis-spring - 2.0.5 - - - - com.mysql - mysql-connector-j - 8.1.0 - - - - junit - junit - 4.13.2 - test - - - - com.alibaba - druid - 1.1.23 - - - - - -``` \ No newline at end of file diff --git "a/03 \350\265\226\345\277\203\345\246\215/20240103 \347\254\224\350\256\260.md" "b/03 \350\265\226\345\277\203\345\246\215/20240102 SpringMVC.md" similarity index 39% rename from "03 \350\265\226\345\277\203\345\246\215/20240103 \347\254\224\350\256\260.md" rename to "03 \350\265\226\345\277\203\345\246\215/20240102 SpringMVC.md" index 7c4d767..fe5779f 100644 --- "a/03 \350\265\226\345\277\203\345\246\215/20240103 \347\254\224\350\256\260.md" +++ "b/03 \350\265\226\345\277\203\345\246\215/20240102 SpringMVC.md" @@ -1,93 +1,88 @@ -## 笔记 +## springMVC -REST简介 - -REST(Representational State Transfer) - -优点: - -隐藏资源的访问行为,无法通过地址得知对资源是何种操作 - -书写简化 - -名称:@RequestMapping - -类型:方法注解 - -位置:SpringMVC控制器方法定义上方 - -作用:设置当前控制器方法请求访问路径 - -属性 - -value(默认):请求访问路径 - -method:http请求动作,标准动作(GET/POST/PUT/DELETE) - -名称:@PathVariable - -类型:形参注解 - -位置:SpringMVC控制器方法形参定义前面 - -作用:绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应 - -@RequestBody @RequestParam @PathVariable - -区别 - -@RequestParam用于接收url地址传参或表单传参 - -@RequestBody用于接收json数据 - -@PathVariable用于接收路径参数,使用{参数名称}描述路径参数 - -应用 - -后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广 - -如果发送非json格式数据,选用@RequestParam接收请求参数采用RESTful进行开发,当参数数量较少时,例如1个, - -可以采用@PathVariable接收请求路径变量,通常用于传递id值 - -## 作业 - -pom.xml +### pom.xml ```xml 4.0.0 - com.xlu - ssmvc03 + com.mdd + untitled10 war 1.0-SNAPSHOT + org.springframework spring-webmvc 5.2.25.RELEASE + javax.servlet javax.servlet-api 3.1.0 - provided - - + com.fasterxml.jackson.core jackson-databind 2.11.3 + + + org.springframework + spring-jdbc + 5.2.25.RELEASE + + + org.springframework + spring-test + 5.2.25.RELEASE + + + + org.mybatis + mybatis + 3.5.13 + + + + org.mybatis + mybatis-spring + 2.0.5 + + + + com.mysql + mysql-connector-j + 8.1.0 + + + + junit + junit + 4.13.2 + test + + + + com.alibaba + druid + 1.1.23 + + + + + + + - org.apache.tomcat.maven tomcat7-maven-plugin @@ -95,7 +90,7 @@ pom.xml 80 / - + utf-8 @@ -103,136 +98,105 @@ pom.xml - ``` -src/main/java/com/xlu/controller/UserController.java - -```java -package com.xlu.controller; - -import com.xlu.admin.User; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -import java.util.Arrays; -import java.util.List; - -@Controller -public class UserController { - - //接受用户名和慢慢,登录 - @RequestMapping("/login") - @ResponseBody - public String login(User user){ - - String result = "login error"; - if ("admin".equals(user.getUsername())&&"123456".equals(user.getPassword())) { - result = "login success"; - } - return result;//输入用户名admin,密码123456,显示结果巍峨login success - } - - //模拟注册 - @RequestMapping(value = "/reg",produces = "text/html;charset=utf-8")//解决返回的中文乱码问题 - @ResponseBody - public String reg(User user){ - - System.out.println(user); - - return "注册成功!"; - } - - //json集合 - @RequestMapping("/jsonArray") - @ResponseBody - public String jsonData(@RequestBody List names){ - - System.out.println(names); +### com.mdd.config目录 - return "ok"; - } - -// JSON数组 - @RequestMapping("/jsonArray2") - @ResponseBody - public String jsonData2(@RequestBody String[] names){ - - System.out.println(Arrays.toString(names)); - - return "ok"; - } +#### SpringMvcConfig -// json对象 - @RequestMapping("/userJson") - @ResponseBody - public String jsonUser(@RequestBody User user){ - System.out.println(user); - return user.toString(); - } - - @RequestMapping("/userJson2") - @ResponseBody - public String jsonUser2(@RequestBody List user){ - System.out.println(user); - return user.toString(); - } +```java +package com.mdd.config; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +@Configuration +@ComponentScan("com.mdd.controller") +public class SpringMvcConfig { } - ``` -src/main/java/com/xlu/config/WebConfig.java +#### WebInitConfig ```java -package com.xlu.config; +package com.mdd.config; +import org.springframework.web.filter.CharacterEncodingFilter; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; -public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer { +import javax.servlet.Filter; + +public class WebInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer { + @Override protected Class[] getRootConfigClasses() { + // Root 加载Spring的核心配置文件 return new Class[0]; } - + @Override protected Class[] getServletConfigClasses() { + // Servlet 加载SpringMVC的核心配置文件 return new Class[]{SpringMvcConfig.class}; } + @Override protected String[] getServletMappings() { + // 设置从/开始的路径,都归tomcat管理 return new String[]{"/"}; } } - ``` -src/main/java/com/xlu/config/SpringMvcConfig.java +### com.mdd.domain目录 + +#### Address ```java -package com.xlu.config; +package com.mdd.domian; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; +public class Address { + private String province; + private String city; -@Configuration -@ComponentScan("com.xlu.controller") -@EnableWebMvc -public class SpringMvcConfig { -} + @Override + public String toString() { + return "Address{" + + "province='" + province + '\'' + + ", city='" + city + '\'' + + '}'; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + public Address() { + } + + public Address(String province, String city) { + this.province = province; + this.city = city; + } +} ``` -src/main/java/com/xlu/admin/User.java +#### User ```java -package com.xlu.admin; +package com.mdd.domian; public class User { - - private Integer id; private String username; private String password; private Address address; @@ -240,19 +204,24 @@ public class User { @Override public String toString() { return "User{" + - "id=" + id + - ", username='" + username + '\'' + + "username='" + username + '\'' + ", password='" + password + '\'' + ", address=" + address + '}'; } - public Integer getId() { - return id; + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; } - public void setId(Integer id) { - this.id = id; + public User(String username, String password, Address address) { + this.username = username; + this.password = password; + this.address = address; } public String getUsername() { @@ -271,55 +240,92 @@ public class User { this.password = password; } - public Address getAddress() { - return address; - } - - public void setAddress(Address address) { - this.address = address; + public User() { } - public User(Integer id, String username, String password, Address address) { - this.id = id; + public User(String username, String password) { this.username = username; this.password = password; - this.address = address; - } - - public User() { } } - ``` -src/main/java/com/xlu/admin/Address.java +### com.mdd.controller -```java -package com.xlu.admin; +#### UserController -public class Address { - private String city; +```java +package com.mdd.controller; - @Override - public String toString() { - return "Address{" + - "city='" + city + '\'' + - '}'; - } +import com.mdd.domian.User; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; - public String getCity() { - return city; - } +import java.util.Arrays; +import java.util.List; - public void setCity(String city) { - this.city = city; +@Controller +@RequestMapping("/hard") // 在这里使用是前缀localhost/hard/save等 +@ResponseBody // 写在上面统一了,将返回类型给浏览器 +public class UserController { +//// 在网页打开localhost/save会显示ok +//// 这样就会固定请求方式 +// @RequestMapping(value = "/save",method = RequestMethod.POST) // RequestMapper 是一种请求的通用注解,get post都可以 +// @ResponseBody +// public String userSave(){ +// return "ok"; +// } +// +// @RequestMapping("/book") +// @ResponseBody +// public String book(){ +// return "book is ok"; +// } +// +//// 不用@ResponseBody是因为不需要通过服务器 +//// 不能使用数字,因为网页不支持数字 +// @RequestMapping("/hello") +// @ResponseBody +// public String hello(){ +// System.out.println("距离考试还有4天"); +// return "96"; +// } +// +// @RequestMapping("/study") +//// 加上这个就会当成字符串 +//// @ResponseBody +// public String study(){ +//// 这里是跳转到index.jsp +// return "index.jsp"; +// } + @RequestMapping("/student") + // @RequestParam 请求参数的注解,解决请求参数不一致的问题 + public String commonParam(@RequestParam("username") String name, int age){ + System.out.println("96小时倒计时"+name+age); + return name+age; } - public Address(String city) { - this.city = city; + @RequestMapping("/user") + public String userParam(User user){ +// 这里在postman里接收user里的对象要和User实体类里的对象一模一样 + System.out.println("接收"+user); + return user.toString(); } - public Address() { +// @RequestMapping("/hobby") +// public String arrayParam(@RequestParam("hobby") String[] hobby){ +//// 这里在postman里接收user里的对象要和User实体类里的对象一模一样 +// System.out.println("接收"+ Arrays.toString(hobby)); +// return Arrays.toString(hobby); +// } + + @RequestMapping("/hobby") +// @RequestParam 是集合专用 + public String arrayParam(@RequestParam List hobby){ +// 这里在postman里接收user里的对象要和User实体类里的对象一模一样 + System.out.println("接收"+ hobby); + return hobby.toString(); } } -``` \ No newline at end of file +``` + diff --git "a/03 \350\265\226\345\277\203\345\246\215/20240102 \347\254\224\350\256\260.md" "b/03 \350\265\226\345\277\203\345\246\215/20240102 \347\254\224\350\256\260.md" deleted file mode 100644 index 22aefe6..0000000 --- "a/03 \350\265\226\345\277\203\345\246\215/20240102 \347\254\224\350\256\260.md" +++ /dev/null @@ -1,182 +0,0 @@ -## 笔记 - -名称:@ComponentScan - -类型:类注解 - -属性 - -excludeFilters:排除扫描路径中加载的bean,需要指定类别(type)与具体项(classes) - -includeFilters:加载指定的bean,需要指定类别(type)与具体项(classes) - -名称:@RequestParam - -类型:形参注解 - -位置:SpringMVC控制器方法形参定义前面 - -作用:绑定请求参数与处理器方法形参间的关系 - -参数: - -required:是否为必传参数 - -defaultValue:参数默认值 - -名称:@EnableWebMvc - -类型:配置类注解 - -位置:SpringMVC配置类定义上方 - -作用:开启SpringMVC多项辅助功能 - -## 作业 - -步骤; - -1.pom.xml,将没有的东西复原,如java,test。。。 - -```xml - - 4.0.0 - com.xlu - ssmvc - war - 1.0-SNAPSHOT - - - - javax.servlet - javax.servlet-api - 3.1.0 - provided - - - - org.springframework - spring-webmvc - 5.2.25.RELEASE - - - - - - - - - - - org.apache.tomcat.maven - tomcat7-maven-plugin - 2.2 - - 88 - / - - - - - - - -``` - -2.创建com.xlu.config.SpringMvcConfig - -```java -package com.xlu.config; - -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; - -@Configuration -@ComponentScan("com.xlu") -public class SpringMvcConfig { -} -``` - -3.com.xlu.config.WeblnitConfig - -```java -package com.xlu.config; - -import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; - -public class WeblnitConfig extends AbstractAnnotationConfigDispatcherServletInitializer { - - - protected Class[] getRootConfigClasses() { - return new Class[0];//加载spring的核心配置文件 - } - - protected Class[] getServletConfigClasses() { - //加载springmvc的核心配置文件 - return new Class[]{SpringMvcConfig.class}; - } - - protected String[] getServletMappings() { - //设置从/开始的路径,都归tomcat管理 - return new String[]{"/"}; - } -} -``` - -4.com.xlu.controller.UserController - -```java -package com.xlu.controller; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -import javax.xml.ws.RequestWrapper; -import java.security.PublicKey; - -@Controller -public class UserController { - - - @RequestMapping("/save") - @ResponseBody - public String userSave(){ - - return "ok";//http://localhost:88/save网址,查看是否出现OK - - } - - @RequestMapping("/book") - @ResponseBody - public String book(){ - return "book is ok!";//http://localhost:88/book网址,查看是否有东西 - } - - - @RequestMapping("/hello") - @ResponseBody - public String hello(){ - - System.out.println(666); - return "666";//http://localhost:88/hello网址,查看是否有东西 - - } - -// @RequestMapping("/shouYe") -// public String shouYe(){ -// -// return "index.jsp";//http://localhost:88/shouYe网址,跳转网页出现 helloword -// } - - @RequestMapping("/shouYe") - @ResponseBody - public String shouYe(){ - - return "index.jsp";//http://localhost:88/shouYe网址,出现index.jsp - } - - -} -``` \ No newline at end of file diff --git "a/03 \350\265\226\345\277\203\345\246\215/20240103 SpringMVC\350\277\233\345\214\226\344\270\200\347\202\271\347\211\210.md" "b/03 \350\265\226\345\277\203\345\246\215/20240103 SpringMVC\350\277\233\345\214\226\344\270\200\347\202\271\347\211\210.md" new file mode 100644 index 0000000..82fa155 --- /dev/null +++ "b/03 \350\265\226\345\277\203\345\246\215/20240103 SpringMVC\350\277\233\345\214\226\344\270\200\347\202\271\347\211\210.md" @@ -0,0 +1,449 @@ +## SpringMvc进阶一点版 + +### com.mdd.config + +#### JdbcConfig + +```java +package com.mdd.config; + + +import com.alibaba.druid.pool.DruidDataSource; +import org.springframework.context.annotation.Bean; + +import javax.sql.DataSource; + +public class JdbcConfig { + @Bean + public DataSource dataSource(){ + DruidDataSource druidDataSource = new DruidDataSource(); + druidDataSource.setDriverClassName("com.sql.cj.jdbc.Driver"); + druidDataSource.setUrl("jdbc:mysql:///db_2023?useSSL=false"); + druidDataSource.setUsername("root"); + druidDataSource.setPassword("root"); + return druidDataSource; + } +} +``` + +#### MybatisConfig + +```java +package com.mdd.config; + +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.mapper.MapperScannerConfigurer; +import org.springframework.context.annotation.Bean; + +import javax.sql.DataSource; + +public class MybatisConfig { + @Bean + public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){ + SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean(); + ssfb.setTypeAliasesPackage("com.mdd.domain"); + ssfb.setDataSource(dataSource); + return ssfb; + } + @Bean + public MapperScannerConfigurer mapperScannerConfigurer(DataSource dataSource){ + MapperScannerConfigurer msc = new MapperScannerConfigurer(); + msc.setBasePackage("com.mdd.mapper"); + return msc; + } +} +``` + +#### SpringConfig + +```JAVA +package com.mdd.config; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Configuration +@ComponentScan("com.mdd") +@Import({JdbcConfig.class, MybatisConfig.class}) +public class SpringConfig { +} +``` + +#### SpringMvcConfig + +```java +package com.mdd.config; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +@Configuration +@ComponentScan("com.mdd.controller") +@EnableWebMvc +public class SpringMvcConfig { +} +``` + +#### WebConfig + +```java +package com.mdd.config; + +import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; + +public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer { + @Override + protected Class[] getRootConfigClasses() { + return new Class[]{SpringConfig.class}; + } + + @Override + protected Class[] getServletConfigClasses() { + return new Class[]{SpringMvcConfig.class}; + } + + @Override + protected String[] getServletMappings() { + return new String[]{"/"}; + } +} +``` + +### com.mdd.domain + +#### Address + +```java +package com.mdd.domain; + +public class Address { + private String city; + + @Override + public String toString() { + return "Address{" + + "city='" + city + '\'' + + '}'; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Address() { + } + + public Address(String city) { + this.city = city; + } +} +``` + +#### Book + +```java +package com.mdd.domain; + +public class Book { + private Integer id; + private String bookName; + + @Override + public String toString() { + return "Book{" + + "id=" + id + + ", bookName='" + bookName + '\'' + + '}'; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getBookName() { + return bookName; + } + + public void setBookName(String bookName) { + this.bookName = bookName; + } + + public Book() { + } + + public Book(Integer id, String bookName) { + this.id = id; + this.bookName = bookName; + } +} +``` + +#### User + +```JAVA +package com.mdd.domain; + +import java.util.Date; + +public class User { + private Integer id; + private String username; + private String password; + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + '}'; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public User() { + } + + public User(Integer id, String username, String password) { + this.id = id; + this.username = username; + this.password = password; + } +} +``` + +### com.mdd.controller + +#### BookController + +```java +package com.mdd.controller; + +import com.mdd.domain.Book; +import com.mdd.service.UserService; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("/books") +public class BookController { + private UserService userService; + @GetMapping + public List getBooks(){ + ArrayList books = new ArrayList(); + books.add(new Book(1,"融心")); + return books; + } + + @GetMapping("/{id}") + public Book getBookById(@PathVariable Integer id){ + return new Book(id,"融心"); + } + + @PostMapping("/{id}") + public Book addBook(@RequestBody Book book){ + return book; + } + +// @RequestParam 普通参数 +// @PathVariable 路径参数,1个参数 +// @RequestBody json形式的参数,封装多个参数 +} +``` + +#### UserController + +```java +package com.mdd.controller; + +import com.mdd.domain.User; +import com.mdd.service.UserService; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +@RestController +@RequestMapping("/users") +public class UserController { +// // 接收用户名和密码,登录 +// @RequestMapping("/login") +// public String login(User user){ +// String result = "login error"; +// if("admin".equals(user.getUsername()) && "123456".equals(user.getPassword())){ +// result = "login success"; +// } +// return result; +// } +// +// @RequestMapping(value = "/reg",produces = "text/html;charset=utf-8") +// public String reg(User user){ +// System.out.println(user); +// return "注册成功"; +// } +// +//// 接收时间 +// @RequestMapping(value = "/date") +// public String getDate(@DateTimeFormat(pattern = "yyyy-MM-dd") Date date){ +// System.out.println(date); +// return "ok"; +// } +// +// @RequestMapping("/jsonArray") +// public String jsonData(@RequestBody List names){ +// System.out.println(names.toString()); +// return "ok"; +// } +// +//// @RequestMapping("/userJson") +//// public String jsonUser(@RequestBody List user){ +//// System.out.println(user); +//// return user.toString(); +//// } +// +// // 这个写法可以解决乱码的事情 +// @RequestMapping("/userJson") +// public List jsonUser(@RequestBody List user){ +// System.out.println(user); +// return user; +// } + + // 查询所有用户 get + @GetMapping + public List getAll(){ + List list = new ArrayList(); + list.add(new User(1,"牙牙","root")); + list.add(new User(2,"牙牙1","root")); + list.add(new User(3,"牙牙2","root")); + list.add(new User(4,"牙牙3","root")); + return list; + } + + // 添加用户 post + @PostMapping + public User addUser(@RequestBody User user){ + System.out.println("添加一个新用户"+user); + return user; + } + + // 修改用户 put + @PutMapping + public User updateUser(@RequestBody User user){ + System.out.println("更新一个旧用户"+user); + return user; + } + + // 按id查询用户 get + @GetMapping("/{id}") + public User getUser(@PathVariable Integer id){ + System.out.println("根据id"+id+"查询用户"); + return new User(id,"xxx","xxx"); + } + + // 按id删除用户 delete + @DeleteMapping("/{id}") + public User deleteUser(@PathVariable Integer id){ + System.out.println("根据id"+id+"删除用户"); + return new User(id,"xxx","xxx"); + } +} +``` + +### com.mdd.mapper + +#### UserMapper接口 + +```java +package com.mdd.mapper; + +import com.mdd.domain.User; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +public interface UserMapper { + @Select("select * from tb_user") + List findAll(); +} +``` + +### com.mdd.service + +#### UserService接口 + +```java +package com.mdd.service; + +import com.mdd.domain.User; + +import java.util.List; + +public interface UserService { + List findAll(); +} +``` + +### com.mdd.service.impl + +#### UserServiceImpl + +```java +package com.mdd.service.impl; + +import com.mdd.domain.User; +import com.mdd.mapper.UserMapper; +import com.mdd.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class UserServiceImpl implements UserService { + @Autowired + private UserMapper userMapper; + @Override + public List findAll() { + return userMapper.findAll(); + } +} +``` + diff --git "a/03 \350\265\226\345\277\203\345\246\215/20240105 \346\234\200\347\273\210\347\211\210.md" "b/03 \350\265\226\345\277\203\345\246\215/20240105 \346\234\200\347\273\210\347\211\210.md" new file mode 100644 index 0000000..ddd670f --- /dev/null +++ "b/03 \350\265\226\345\277\203\345\246\215/20240105 \346\234\200\347\273\210\347\211\210.md" @@ -0,0 +1,568 @@ +pom.xml + +```xm + + 4.0.0 + com.mdd + ssm + war + 1.0-SNAPSHOT + + + + + org.springframework + spring-webmvc + 5.2.25.RELEASE + + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + + com.fasterxml.jackson.core + jackson-databind + 2.9.1 + + + + + org.springframework + spring-jdbc + 5.2.25.RELEASE + + + org.springframework + spring-test + 5.2.25.RELEASE + + + + org.mybatis + mybatis + 3.5.13 + + + + org.mybatis + mybatis-spring + 2.0.5 + + + + com.mysql + mysql-connector-j + 8.1.0 + + + + junit + junit + 4.13.2 + test + + + + com.alibaba + druid + 1.1.23 + + + + + + + + + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.2 + + 80 + / + + utf-8 + + + + + + + +``` + +src/main/java/com/mdd/config/SpringConfig.java + +```java +package com.mdd.config; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Configuration +@ComponentScan({"com.mdd.mapper","com.mdd.service"}) +@Import({JdbcConfig.class, MybatisConfig.class}) +public class SpringConfig { +} + +``` + +src/main/java/com/mdd/config/MybatisConfig.java + +```java +package com.mdd.config; + + +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.mapper.MapperScannerConfigurer; +import org.springframework.context.annotation.Bean; + +import javax.sql.DataSource; + +public class MybatisConfig { + + //实体类,数据库连接 + @Bean + public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){ + + SqlSessionFactoryBean ssfn = new SqlSessionFactoryBean(); + ssfn.setDataSource(dataSource); + ssfn.setTypeAliasesPackage("com.mdd.domain"); + + return ssfn; + + } + + //mapper + @Bean + public MapperScannerConfigurer mapperScannerConfigurer(){ + + MapperScannerConfigurer msc = new MapperScannerConfigurer(); + msc.setBasePackage("com.mdd.mapper"); + return msc; + + } + + + +} +``` + +src/main/java/com/mdd/config/JdbcConfig.java + +```java +package com.mdd.config; + +import com.alibaba.druid.pool.DruidDataSource; +import org.springframework.context.annotation.Bean; + +import javax.sql.DataSource; + +public class JdbcConfig { + + @Bean + public DataSource dataSource(){ + + DruidDataSource ds = new DruidDataSource(); + + ds.setDriverClassName("com.mysql.cj.jdbc.Driver"); + ds.setUrl("jdbc:mysql:///mybatis"); + ds.setUsername("root"); + ds.setPassword("root"); + + return ds; + + } +} + +``` + +src/main/java/com/mdd/config/SpringMvcConfig.java + +```java +package com.mdd.config; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@ComponentScan("com.mdd") +@EnableWebMvc +public class SpringMvcConfig implements WebMvcConfigurer { + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + + //放行 + registry.addResourceHandler("/css/**").addResourceLocations("/css/"); + registry.addResourceHandler("/js/**").addResourceLocations("/js/"); + registry.addResourceHandler("/lib/**").addResourceLocations("/lib/"); + registry.addResourceHandler("/index.html").addResourceLocations("/index.html"); + registry.addResourceHandler("/favicon.ico").addResourceLocations("/favicon.ico"); + + } + + //ctrl+o(字母o) 重写方法 + // add+H 快捷方式 + +} + +``` + +src/main/java/com/mdd/config/WebConfig.java + +```java +package com.mdd.config; + +import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; + +public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer { + @Override + protected Class[] getRootConfigClasses() { + return new Class[]{SpringConfig.class}; + } + + @Override + protected Class[] getServletConfigClasses() { + return new Class[]{SpringMvcConfig.class}; + } + + @Override + protected String[] getServletMappings() { + return new String[]{"/"}; + } +} + +``` + +src/main/java/com/mdd/controller/BookController.java + +```java +package com.mdd.controller; + +import com.mdd.domain.Book; +import com.mdd.domain.R; +import com.mdd.service.BookService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/books") +public class BookController { + + @Autowired + private BookService bookService; + + //查看数据库数据,带提示词 + @GetMapping + public R getAll(){ + List books = bookService.getAll(); + return R.success(200,books); + } + + //查看数据库数据 +// @GetMapping +// public List getAll(){ +// return bookService.getAll(); +// } + + + //添加数据 + @PostMapping + //添加数据 + public Book addBook(@RequestBody Book book){ + bookService.addBook(book); + return book; + + } + + //修改数据 + @PutMapping + public Book updateBook(@RequestBody Book book){ + bookService.updateBook(book); + return book; + } + + //删除 + @DeleteMapping("/{id}") + public R deleteBookById(@PathVariable Integer id){ + Integer i = bookService.deleteBook(id); + if (i>0) { + return R.success(200,"删除成功!"); + }else{ + return R.failure(404,"删除失败"); + } + + } + + //根据id查询 + @GetMapping("/{id}") + public Book getBook(@PathVariable Integer id){ + return bookService.getBook(id); + } + + + +} +``` + +src/main/java/com/mdd/domain/Book.java + +```java +package com.mdd.domain; + +public class Book { + + private Integer id; + private String bookName; + private String author; + private String publisher; + + @Override + public String toString() { + return "Book{" + + "id=" + id + + ", bookName='" + bookName + '\'' + + ", author='" + author + '\'' + + ", publisher='" + publisher + '\'' + + '}'; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getBookName() { + return bookName; + } + + public void setBookName(String bookName) { + this.bookName = bookName; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getPublisher() { + return publisher; + } + + public void setPublisher(String publisher) { + this.publisher = publisher; + } + + public Book(Integer id, String bookName, String author, String publisher) { + this.id = id; + this.bookName = bookName; + this.author = author; + this.publisher = publisher; + } + + public Book() { + } +} + +``` + +src/main/java/com/mdd/domain/R.java + +```java +package com.mdd.domain; + +public class R { + + private Integer code;//错误代码 + private String msg;//提示信息 + private Object data;//返回的数据,Object通用的 + + @Override + public String toString() { + return "R{" + + "code=" + code + + ", msg='" + msg + '\'' + + ", data=" + data + + '}'; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public R(Integer code, String msg, Object data) { + this.code = code; + this.msg = msg; + this.data = data; + } + + public R() { + } + + public static R success(Integer code, Object data) { + R r = new R(); + r.setData(data); + r.setCode(code); + return r; + } + + public static R success(Integer code,String msg){ + R r = new R(); + r.setCode(code); + r.setMsg(msg); + return r ; + } + + public static R failure(Integer code,String msg){ + R r = new R(); + r.setMsg(msg); + r.setCode(code); + return r; + } + +} + +``` + +src/main/java/com/mdd/mapper/BookMapper.java + +```java +package com.mdd.mapper; + +import com.mdd.domain.Book; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +import java.util.List; + +public interface BookMapper { + + + @Select("select id, book_name as bookName, author, publisher from tb_book order by id desc") + List getAll(); + + @Insert("insert into tb_book (book_name, author, publisher) values (#{bookName},#{author},#{publisher})") + void addBook(Book book); + + @Update("update tb_book set book_name = #{bookName},author = #{author},publisher = #{publisher} where id = #{id}") + void updateBook(Book book); + @Delete("delete from tb_book where id = #{id};") + Integer deleteBook(Integer id); + @Select("select id, book_name as bookName, author, publisher from tb_book where id = #{id}") + Book getBook(Integer id); +} + +``` + +src/main/java/com/mdd/service/BookService.java + +```java +package com.mdd.service; + +import com.mdd.domain.Book; + +import java.util.List; + +public interface BookService { + List getAll(); + + void addBook(Book book); + + void updateBook(Book book); + + Integer deleteBook(Integer id); + + Book getBook(Integer id); +} + +``` + +src/main/java/com/mdd/service/Impl/BookServiceImpl.java + +```java +package com.mdd.service.Impl; + +import com.mdd.domain.Book; +import com.mdd.mapper.BookMapper; +import com.mdd.service.BookService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + + +import java.util.List; + +@Service +public class BookServiceImpl implements BookService { + + @Autowired + private BookMapper bookMapper; + + public List getAll() { + return bookMapper.getAll(); + } + + public void addBook(Book book) { + bookMapper.addBook(book); + } + + + public void updateBook(Book book) { + bookMapper.updateBook(book); + } + + + public Integer deleteBook(Integer id) { + return bookMapper.deleteBook(id); + } + + + public Book getBook(Integer id) { + return bookMapper.getBook(id); + } +} + +``` + +记得在webapp文件李假如html文件 \ No newline at end of file -- Gitee