框架開發與應用期末考試


題型

  • 選擇題
  • 程序閱讀題
  • 程序改錯題
  • 程序填空題
  • 編程題

考點

  • pom(熱部署)
  • 常用注解
  • loc(自動注入)
  • aop
  • properties(配置文件)
  • mapper
  • 前端(不考慮jsp)

掌握常用坐標dependency的含義,如web,熱部署等

<dependencies>
	<dependency>
        <groupId>項目組標識</groupId>
        <artifactId>項目標識</artifactId>
        <version>項目版本號</version>
        <scope>作用域</scope>
    </dependency>
</dependencies>

spring boot

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.M3</version>
</parent>

spring-boot-starter-web

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

熱部署

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <version>2.3.12.RELEASE</version>
    <optional>true</optional>
</dependency>

所有講授過的注解及其含義和用法;

啟動器注解

@SpringBootApplication

這個注解是Spring Boot最核心的注解,用在 Spring Boot的主類上,標識這是一個 Spring Boot 應用,用來開啟 Spring Boot 的各項能力。實際上這個注解是@Configuration,@EnableAutoConfiguration,@ComponentScan三個注解的組合。由於這些注解一般都是一起使用,所以Spring Boot提供了一個統一的注解@SpringBootApplication。
    
@ComponentScan

組件掃描。讓spring Boot掃描到Configuration類並把它加入到程序上下文。
@ComponentScan注解默認就會裝配標識了@Controller,@Service,@Repository,@Component注解的類到spring容器中。

組件注冊注解

@Component :標准一個普通的spring Bean類。 
@Repository:標注一個DAO組件類。 
@Service:標注一個業務邏輯組件類。 
@Controller:標注一個控制器組件類。 

java顯式裝配注解

@Configuration

用於定義配置類,指出該類是 Bean 配置的信息源,相當於傳統的xml配置文件,一般加在主類上。如果有些第三方庫需要用到xml文件,建議仍然通過@Configuration類作為項目的配置主類——可以使用@ImportResource注解加載xml配置文件。

@Bean

相當於XML中的,放在方法的上面,而不是類,意思是產生一個bean,並交給spring管理。

例子

@Configuration  //代表這是一個配置類
@Import(MyConfig2.class)  //導入合並其他配置類,類似於配置文件中的 inculde 標簽
public class MyConfig {
	/**
     *    通過方法注冊一個bean,方法名為 bean.id;返回的實例化對象對應的的全類名為 bean.class
     */
   @Bean //通過方法注冊一個bean
   public Dog dog(){
       return new Dog();
  }
}

mvc注解

@RestController

用於標注控制層組件(如struts中的action),表示這是個控制器bean,並且是將函數的返回值直 接填入HTTP響應體中,是REST風格的控制器;它是@Controller和@ResponseBody的合集。
    
@RequestMapping

RequestMapping是一個用來處理請求地址映射的注解;提供路由信息,負責URL到Controller中的具體函數的映射,可用於類或方法上。vaule=""等價於path="",可省略。method=RequestMethod.GET設置請求類型
    
@ResponseBody

表示該方法的返回結果直接寫入HTTP response body中

@RequestBody

是指方法參數被綁定到HTTP請求Body上,前端就不能用表單的方式提交了,需要用json的方式提交。
@requestBody注解常用來處理content-type不是默認的application/x-www-form-urlcoded編碼的內容,而是application/json或application/xml等。一般情況下來說常用其來處理application/json類型。並且@requestbody傳送的參數需要是json對象即可;

附:form默認的提交方式content-type是x-www-form-urlencoded,會將傳遞的參數轉換成key-value方式

@RequestParam
    
處理content-type是默認的application/x-www-form-urlcoded編碼的內容
用在方法的參數前面
value = "" 前端參數名稱
required = false 是否必須
defaultValue = "" 默認值
    
@PathVariable

通過 @PathVariable 可以將URL中占位符參數{xxx}綁定到處理器類的方法形參中@PathVariable("xxx") 

自動注入注解

@AutoWired

byType方式。把配置好的Bean拿來用,完成屬性、方法的組裝,它可以對類成員變量、方法及構造函數進行標注,完成自動裝配的工作。

當加上(required=false)時,就算找不到bean也不報錯。

@Qualifier

當有多個同一類型的Bean時,可以用@Qualifier("name")來指定。與@Autowired配合使用

@Resource(name="name",type="type")

沒有括號內內容的話,默認byName。與@Autowired干類似的事。

僅了解的注解

@ConfigurationProperties

Spring Boot可使用注解的方式將自定義的properties文件映射到實體bean中,比如config.properties文件。

@Value("${app.name}")
注入簡單值
 
@Import

通過導入的方式實現把實例加入springIOC容器中

@EnableAutoConfiguration

讓 Spring Boot 根據應用所聲明的依賴來對 Spring 框架進行自動配置,一般加在主類上。

@Profiles
    
Spring Profiles提供了一種隔離應用程序配置的方式,並讓這些配置只能在特定的環境下生效。
任何@Component或@Configuration都能被@Profile標記,從而限制加載它的時機。
    
@ModelAttribute

作用於Controller的方法上,在URL被映射到該類時該方法首先被執行
@ModelAttribute注解,springmvc提前執行取數據操作,再進行修改操作,解決修改中為賦值對象為空的問題

理解和應用IOC的原理和注入方式,AOP的原理和應用;

IoC(反轉控制):

一種**設計思想**,就是將原本在程序中手動創建對象的控制權,交由Spring框架來管理

DI(依賴注入):

依賴注入,在Spring框架負責創建Bean對象時,動態的將依賴對象注入到Bean組件中。  

屬性注入的三種方式

構造器注入

無參構造
 <bean id="user" class="com.kuang.pojo.User"/>
有參構造
<!-- 第一種根據index參數下標設置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
    <!-- index指構造方法 , 下標從0開始 -->
    <constructor-arg index="0" value="kuangshen2"/>
</bean>
<!-- 第二種根據參數名字設置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
    <!-- name指參數名 -->
    <constructor-arg name="name" value="kuangshen2"/>
</bean>
<!-- 第三種根據參數類型設置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
    <constructor-arg type="java.lang.String" value="kuangshen2"/>
</bean>
value:指定基本數據類型或String類型的數據

ref:指定其它bean類型的數據 

Setter方法注入

配置

  • pojo
 public class Address {
 
     private String address;
 
     public String getAddress() {
         return address;
    }
 
     public void setAddress(String address) {
         this.address = address;
    }
 }
public class Student {
 
     private String name;
     private Address address;
     private String[] books;
     private List<String> hobbys;
     private Map<String,String> card;
     private Set<String> games;
     private String wife;
     private Properties info;
 
     public void setName(String name) {
         this.name = name;
    }
 
     public void setAddress(Address address) {
         this.address = address;
    }
 
     public void setBooks(String[] books) {
         this.books = books;
    }
 
     public void setHobbys(List<String> hobbys) {
         this.hobbys = hobbys;
    }
 
     public void setCard(Map<String, String> card) {
         this.card = card;
    }
 
     public void setGames(Set<String> games) {
         this.games = games;
    }
 
     public void setWife(String wife) {
         this.wife = wife;
    }
 
     public void setInfo(Properties info) {
         this.info = info;
    }
 
     public void show(){
         System.out.println("name="+ name
                 + ",address="+ address.getAddress()
                 + ",books="
        );
         for (String book:books){
             System.out.print("<<"+book+">>\t");
        }
         System.out.println("\n愛好:"+hobbys);
 
         System.out.println("card:"+card);
 
         System.out.println("games:"+games);
 
         System.out.println("wife:"+wife);
 
         System.out.println("info:"+info);
 
    }
 }
注入常量
 <bean id="student" class="com.kuang.pojo.Student">
     <property name="name" value="小明"/>
 </bean>
注入Bean(基礎)
 <font color='red'> 這里的值是一個引用,ref </font>
 <bean id="addr" class="com.kuang.pojo.Address">
     <property name="address" value="重慶"/>
 </bean>
 
 <bean id="student" class="com.kuang.pojo.Student">
     <property name="name" value="小明"/>
     <property name="address" ref="addr"/>
 </bean>
注入數組
 <bean id="student" class="com.kuang.pojo.Student">
     <property name="name" value="小明"/>
     <property name="address" ref="addr"/>
     <property name="books">
         <array>
             <value>西游記</value>
             <value>紅樓夢</value>
             <value>水滸傳</value>
         </array>
     </property>
 </bean>
注入List
<property name="hobbys">
     <list>
         <value>聽歌</value>
         <value>看電影</value>
         <value>爬山</value>
     </list>
 </property>
注入Map
<property name="card">
     <map>
         <entry key="中國郵政" value="456456456465456"/>
         <entry key="建設" value="1456682255511"/>
     </map>
 </property>
注入Set
 <property name="games">
     <set>
         <value>LOL</value>
         <value>BOB</value>
         <value>COC</value>
     </set>
 </property>
注入Null
<property name="wife"><null/></property>
注入Properties
 <property name="info">
     <props>
         <prop key="學號">20190604</prop>
         <prop key="性別">男</prop>
         <prop key="姓名">小明</prop>
     </props>
 </property>

P命名和C命名注入

P命名空間(類Set注入,必須有Set方法)

<bean id="john-modern" class="com.example.Person" p:name="John Doe" p:spouse-ref="jane"/>
<!--等價於-->
<bean id="john-classic" class="com.example.Person">
    <property name="name" value="John Doe"/>
    <property name="spouse" ref="jane"/>
</bean>

C命名空間(類構造器注入,必須有有參構造)

<bean id="beanOne" class="x.y.ThingOne" 
        c:thingTwo-ref="beanTwo"  
        c:thingThree-ref="beanThree" 
        c:email="something@somewhere.com"/>
<!--推薦-->
<!--等價於-->
<bean id="beanOne" class="x.y.ThingOne">
        <constructor-arg name="thingTwo" ref="beanTwo"/>
        <constructor-arg name="thingThree" ref="beanThree"/>
        <constructor-arg name="email" value="something@somewhere.com"/>
</bean>
<bean id="beanOne" class="x.y.ThingOne" 
    c:_0-ref="beanTwo" 
    c:_1-ref="beanThree"
    c:_2="something@somewhere.com"/>
    <!--等價於-->
<bean id="beanOne" class="x.y.TingOne">
    <constructor-arg index="0" ref="beanTwo"/>
    <constructor-arg index="1" ref="beanThree"/>
    <constructor-arg index="2" value="something@somewhere.com"/>
</bean>

注解注入

@Component("user")
// 相當於配置文件中 <bean id="user" class="當前注解的類"/>
public class User {
    @Value("秦疆")
    // 相當於配置文件中 <property name="name" value="秦疆"/>
    public String name;
}
@Component("user")
public class User {
 
    public String name;
 
    @Value("秦疆")
    public void setName(String name) {
        this.name = name;
    }
}

AOP

**面向切面的編程**:把程序重復的代碼抽取出來,在需要執行的時候,使用動態代理技術在不修改源代碼的基礎上對已有方法進行增強。

**AOP作用**:在程序運行期間,不修改源碼對已有方法進行增強。

**AOP優勢**:減少重復代碼,提高開發效率,維護方便。

**通知**:安全,事務,日志等。分為前置通知(Before)、后置通知(AfterReturning)、異常通知(AfterThrowing)、最終通知(After)和環繞通知(Around)五種。
  • 前置通知(before advice):在連接點前面執行,對連接點不會造成影響(前置通知有異常的話,會對后續操作有影響)

  • 正常返回通知(after returning advice):在連接點正確執行之后執行,如果連接點拋異常,則不執行

  • 異常返回通知(after throw Advice):在連接點拋異常的時候執行

  • 返回通知(after):無論連接點是正確執行還是拋異常,都會執行

  • 環繞通知(around):在連接點前后執行(必須在環繞通知中決定是繼續處理還是中斷執行,使用PreceedingJoinPonit下的方法決定是繼續還是中斷)

    連接點(JoinPoint)是Spring允許你使用通知的地方,基本每個方法的前,后(兩者都有也行),或拋出異常時都可以是連接點,Spring只支持方法連接點

    切入點(Pointcut)上面說的連接點的基礎上,來定義切入點

    切面(Aspect)切面是通知和切入點的結合。

    目標(target)表示目標對象(被代理對象)。被一個或者多個切面所通知的對象。

    代理(proxy)表示代理對象。將通知應用到目標對象之后被動態創建的對象。可以簡單地理解為,代理對象為目標對象的業務邏輯功能加上被切入的切面所形成的對象。

    weaving 表示切入,也稱為織入。將切面應用到目標對象從而創建一個新的代理對象的過程

通知類

package nuc.edu.cn.advice;

public class CustomerAspect {
      public void before() {
           System.out.println("CustomerAspect before.");
      }
}

接口和實現類

package nuc.edu.cn.service.impl;
public class CustomerServiceImpl implements ICustomerService {
    @Override
    public void saveCustomer() {
          System.out.println("保存客戶信息");
    }
}

spring.xml配置aop

		<!-- 配置service -->
    <bean id="customerService" class="nuc.edu.cn.service.impl.CustomerServiceImpl"></bean>
         <!-- 基於xml的aop配置步驟,必須導入aop的jar包 -->

         <!-- 第一步:把通知類交給spring來管理 -->
    <bean id="customerAspect" class="nuc.edu.cn.advice.CustomerAspect"></bean>
 
         <!-- 第二步:導入aop名稱空間 ,並且使用aop:config開始aop配置 -->
    <aop:config>
         <!-- 第三步:使用aop:aspect配置切面 ,id屬性用於給切面提供一個唯一標識,ref用於引用通知bean的id -->
    	<aop:aspect id="customerAdvice" ref="customerAspect">
         <!-- 第四步: 配置通知的類型,指定增強的方法何時執行。method:用於指定增強的方法名稱 -->
		<!-- 切入點表達式:關鍵字:execution(表達式). 表達式寫法: 訪問修飾符 返回值 包名.包名...類名.方法名(參數列表)pointcut="execution(* *..*.*(..))" -->
    		<aop:before method="before" pointcut="execution(public void nuc.edu.cn.service.impl.CustomerServiceImpl.saveCustomer())" />
         </aop:aspect>
	</aop:config>

掌握MVC應用方法,能夠使用自動注入實現類托管;

mvc

視圖解析

視圖解析器設置
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
ModelAndView
public ModelAndView detailsForJson() {
	// 模型和視圖
	ModelAndView mv = new ModelAndView();
	// 生成JSON視圖
	MappingJackson2JsonView jsonView = new MappingJackson2JsonView();
	mv.setView(jsonView);
	// 加入模型
	mv.addObject("user", user);
	return mv;
}
public ModelAndView details(Integer id) {
    // 模型和視圖
    ModelAndView mv = new ModelAndView();
    // 定義模型視圖
    mv.setViewName("user/details");
    // 加入數據模型
    mv.addObject("user", user);
	return mv;
}
public ModelAndView useModelAndView(Integer id, ModelAndView mv) {
    // 設置數據模型
    mv.addObject("user", user);
    // 設置視圖名稱
    mv.setViewName("user/details");
    return mv;
}
public ModelAndView useModelMap(Integer id, ModelMap modelMap) {
    ModelAndView mv = new ModelAndView();
    // 設置視圖名稱
    mv.setViewName("user/details");
    // 設置數據模型,此處modelMap並沒有和mv綁定,這步系統會自動處理
    modelMap.put("user", user);
    return mv; 
}

使用參數傳入ModelAndView或者實例化ModelAndView

設置視圖

mv.setViewName("user/details")

MappingJackson2JsonView()實例化,使用 mv.setView(jsonView)

設置數據

mv.addObject("user", user)

參數傳入ModelMap,使用 modelMap.put("user", user)
Model
//傳入數據模型參數
@GetMapping("/PModel")
public String useModel(Integer id, Model model) {
    User user = userService.getUserById(id);
    model.addAttribute("user", user);
    // 這里返回字符串,在Spring MVC中,會自動創建ModelAndView且綁定名稱
    return "details";
}

設置視圖

返回字符串設置

設置數據

參數傳入Model,model.addAttribute("user", user)
文件上傳
文件上傳設置
#指定默認上傳的文件夾
spring.servlet.multipart.location=d:/temp1/
#限制單個文件最大大小
spring.servlet.multipart.max-file-size=5242880
#限制所有文件最大大小,這里設置為 20MB
spring.servlet.multipart.max-request-size=20MB
處理單文件上傳請求

后端

public String handleFormUpload(MultipartFile file){
    String path = "d:/uploaded/";//保存路徑
    // String filename=photo.getOriginalFilename();
    String filename = new
    SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());

     //獲取上傳文件的后綴suffix
    String suffix = photo.getOriginalFilename().substring(photo.getOriginalFilename().lastIndexOf("."));
    if (!suffix.equals(".jpg")) {
        return dealResultMap(false, "上傳失敗");
    }
    try {
         //Spring提供了文件操作類FileCopyUtils
        FileCopyUtils.copy(photo.getInputStream(), new FileOutputStream(path + filename + suffix));
    } catch (IOException e) {
    // TODO Auto-generated catch block
    	e.printStackTrace();
    	return dealResultMap(false, "上傳失敗");
    }
    return dealResultMap(true, "上傳成功");
}

前端

<form method="post" action="./multipart" enctype="multipart/form-data">
     <input type="file" name="photo" value="請選擇上傳的文件" />
     <input type="submit" value="提交" />
</form>
處理多文件上傳請求
public String handleFormUpload(MultipartFile[] files){}
攔截器

實現攔截內容

public class Interceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		//System.out.println("處理前");
       return true;// 繼續執行
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
		//System.out.println("處理后");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		//System.out.println("處理完成");
    }
}

注冊攔截規則

@Configuration
public class WebConfig implements WebMvcConfigurer { 
 	@Override 
 	public void addInterceptors(InterceptorRegistry registry) { 
  		// TODO Auto-generated method stub 
  		registry.addInterceptor(new Interceptor())
    		.addPathPatterns("/**") //攔截所有
        	.excludePathPatterns("/login");//放過登錄
 	}
}

xml自動注入

可以為bean節點添加增加屬性 autowire="byName" 或 autowire="byType" ,會自動查找spring容器中的對應的bean注入,而省去了手動注入的麻煩。

注解自動注入

使用注解

@Autowired

  • 默認是根據類型自動裝配。多匹配,按照byName方式進行裝配。
  • @Qualifier則可以修改byName的值

@Resource

  • 如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常
  • 如果指定了name,則從Spring上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常
  • 如果指定了type,則從Spring上下文中找到類型匹配的唯一bean進行裝配,找不到或找到多個,都拋出異常
  • 如果既沒指定name,也沒指定type,則自動按照byName方式進行裝配。如果沒有匹配,則回退為一個原始類型進行匹配,如果匹配則自動裝配。

掌握mybatis的常用配置項,能夠使用全局和映射文件方式,以及注解方式使用mybatis;

普通

數據庫配置

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/book_manage?useUnicode=true&characterEncoding=UTF-8&useSSL=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root

全局和映射文件配置

mybatis.config-location=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml

mybatis-config.xml配置

<settings>
    	<!-- 開啟駝峰表示法 -->
    <setting name="mapUnderscoreToCamelCase" value="true" />  
</settings>
<typeAliases>
        <!-- 批量導入基本類別名 -->
    <package name="com.nuc.pojo"/>
</typeAliases>

*.xml

	<select id="getBookList" resultMap="book">
        select *
        from book_manage.book
        where name like '%${value}%'
    </select>
	<!--模糊條件需要使用${  }:表示拼接sql串,將接收到的參數內容不加任何修飾拼接到sql中-->
	<!--#{}表示一個占位符號,無MyBatis 默認值,可任意,且與參數名無關
 		${}表示一個拼接符號,使用 MyBatis 默認值 value,即 ${value}。
		使用自定義參數名,前提:在映射器接口方法的參數前加注解@Param("")-->

	<!--keyProperty="hx_1913041319_id" useGeneratedKeys="true" 用於自動遞增字段的值回顯-->
    <insert id="addBook" parameterType="Hx_1913041319_Book" keyProperty="hx_1913041319_id" useGeneratedKeys="true"> 
        insert into book_manage.book (id, name, price, cover)
        VALUES (#{hx_1913041319_id}, #{hx_1913041319_name}, #{hx_1913041319_price}, #{hx_1913041319_cover})
    </insert>

    <update id="updateBook">
        update book_manage.book cover = #{hx_1913041319_cover}
        where id = #{hx_1913041319_id}
    </update>

    <delete id="deleteBookById">
        delete from book_manage.book where id = #{hx_1913041319_id}
    </delete>

	<!--數據庫映射-->
	<resultMap id="book" type="Hx_1913041319_Book">
        <id column="id" property="hx_1913041319_id"></id>
        <result column="name" property="hx_1913041319_name"></result>
        <result column="price" property="hx_1913041319_price"></result>
        <result column="cover" property="hx_1913041319_cover"></result>
    </resultMap>

注解實現

public interface UserMapper {
     //方法具有多個參數,前必須加@param
     @Select("select * from user")
     @Results(id="user",value={
         @Result(id=true,column="id",property="id"),
         @Result(column="name",property="username"),
         @Result(column="pwd",property="password"),
     })
     User getUserById(@Param("id") int id);

     @Insert("insert into user(id,username,password)values(#{id},#{name},#{pwd})")
     @ResultMap("user")
     //引用results
     @options(useGeneratedKeys=true,keyProperty="id" ,keyColumn="id")
     //主鍵自增
     int addUser(User user);

     @Update("update user set name = #{name},pwd = #{password} where id = #{id}")
     int updateUser(User user);

     @Delete("delete from user where id = #{tid}")
     int deleteUser(@Param("tid") int id);
}

進階

一對一

按照查詢嵌套處理
<!--
     思路:
        1. 查詢所有的學生信息
        2. 根據查詢出來的學生的tid尋找特定的老師 (子查詢)
    -->
<select id="getStudent" resultMap="StudentTeacher">
    select * from student
</select>

<resultMap id="StudentTeacher" type="student">
    <result property="id" column="id"/>
    <result property="name" column="name"/>
    <!--對象:association 集合:collection-->
    <association property="teacher" column="tid" javaType="teacher" select="getTeacher"/>
</resultMap>

<select id="getTeacher" resultType="teacher">
    select * from teacher where id = #{id}
</select>

20200909144043629

  • javaType:把sql語句查詢出的結果集,封裝給某個類的某個對象-- 屬性類型(指定實體類中的java返回值類型)

  • select:下一條要執行的sql語句

  • property:注入給一級查詢結果實體類的某個屬性-- 屬性名

  • column:在上一次查詢的結果集中,用那些列值去執行下一條sql語句(傳參)

按照結果嵌套處理 (簡單)
 <!--按照結果進行查詢-->
    <select id="getStudent2" resultMap="StudentTeacher2">
        select s.id sid , s.name sname, t.name tname
        from student s,teacher t
        where s.tid=t.id
    </select>
    <!--結果封裝,將查詢出來的列封裝到對象屬性中-->
    <resultMap id="StudentTeacher2" type="student">
        <result property="id" column="sid"/>
        <result property="name" column="sname"/>
        <association property="teacher" javaType="teacher">
            <result property="name" column="tname"></result>
        </association>
    </resultMap>

20200909144059395

一對多

按照查詢嵌套處理
<!--子查詢:按查詢嵌套查詢-->
<select id="getTeacher" resultMap="teacherToStudent">
    select id, name from mybatis.teacher where id = #{id}
</select>
<resultMap id="teacherToStudent" type="teacher">
    <result property="id" column="id"/>
    <result property="name" column="name"/>
    <!--  column="id"是teacher表中的id-->
    <collection property="students" javaType="List" ofType="student"
                column="id" select="getStudentsByTeacherId" />
    <!-- List<student> students -->
</resultMap>
<select id="getStudentsByTeacherId" resultType="student">
    select * from mybatis.student where tid = #{id}
</select>

20200909144117110

  • ofType:映射List或某些指定的pojo泛型的類型
按照結果嵌套處理
<!--聯表查詢:按結果嵌套查詢-->
<select id="getTeacher1" resultMap="teacherAndStudent">
    select  s.id sid,s.name sname,t.name tname,t.id tid
    from mybatis.teacher t,mybatis.student s
    where s.tid=t.id and t.id =#{id}
</select>
<resultMap id="teacherAndStudent" type="teacher">
    <result property="id" column="tid"/>
    <result property="name" column="tname"/>
    <!--集合對象用collection綁定,javaType是返回單個屬性,不能返回集合,
返回屬性是集合用ofType綁定-->
    <collection property="students" ofType="student">
        <result property="id" column="sid"/>
        <result property="name" column="sname"/>
        <result property="tid" column="tid"/>
    </collection>
</resultMap>

掌握前端基本控件及表單的使用方法,能夠做到前后端交互;

基本標簽

結構標簽

<!--定義 HTML 文檔 -->
<html>
<!--定義文檔的頭部 -->
 	<head>
<!--定義文檔的標題 -->        
 		<title></title>      
 	</head>
<!--定義文檔的主體 -->   
 	<body></body>
 </html>

容器標簽

<!--塊級標簽,獨占一行-->
	<div></div>
<!--行級標簽,所有內容都在同一行-->
 	<span></span>:

文字標簽

<font></font> 
    屬性: size:設置字體大小
          color:設置字體顏色
          face:設置字體  
    <i>:顯示斜體文本效果
	<b>:呈現粗體文本效果
    <small>:呈現小號字體效果      
	<big>:呈現大號字體效果

標題標簽

<h1>這是標題 1</h1>
<h2>這是標題 2</h2>
<h3>這是標題 3</h3>
<h4>這是標題 4</h4>
<h5>這是標題 5</h5>
<h6>這是標題 6</h6>

無序列表

<ul type="square">無序列表
     <li>apple</li>
     <li>banana</li>
     <li>orange</li>
</ul>
    屬性:type :circle(空心圓) ,disc(默認,實心圓),square(黑色方塊)
	注意:如果想去掉列表默認屬性(去掉小圓點),可在css中設置list-style: none;

有序列表

<ol type="A">有序列表
     <li>apple</li>
     <li>orange</li>
     <li>banana</li>
</ol>
	屬性:type:1、A、a、I、i(數字、字母、羅馬數字)

圖片標簽

<img/>單標簽   
  屬性: 
      src:圖片地址
      width:寬度
      height:高度
      border:邊框
      align:對齊方式
      alt:圖片的文字說明(鼠標放在圖片上顯示文字)
      hspace 和 vspace 設定圖片邊沿上下左右空白,以免文字或其它圖片過於貼近

鏈接標簽

<a>文本或圖片</a>
屬性: 
    href:跳轉頁面的地址(支持外網跳轉:協議+域名);            
    name:名稱,錨點(回到錨點: 頂部,底部,中間)

表格標簽

<table border="1" width="200" height="200" align="center" cellspacing="0" >
	<caption>個人信息表</caption>
	<tr >
		<th>姓名</th>
		<th>年齡</th>
		<th>性別</th>
	</tr>
	<tr align="center">
		<td>張三</td>
		<td>18</td>
		<td>男</td>
	</tr>
</table>

表單標簽

form標簽

屬性:action:表示動作,值為服務器的地址,把表單的數據提交到該地址上處理
     method:請求方式:get 和post
     enctype:表單提交的類型

get提交與post提交

get:
       1.會顯示在地址欄,請求參數都在地址后拼接 path?name="李華"&password="123456";
       2.不安全但是效率較高;
       3.get請求大小有限制,大約是2KB;
       使用情況:一般情況用於查詢數據。
 post:
       1.地址欄:請求參數單獨處理;
       2.安全可靠但是效率低;
       3.post請求大小理論上無限;
       使用情況:一般用於插入修改等操作。

input標簽

原型:<input type="" name="" id="" value="" />
type: 
      text 文本框  
      password  密碼框   
      radio 表示是單選,實現單選框:name屬性必須一致才能實現單選框
      <div>
      	<input type="radio" name="chex"  />
		<input type="radio" name="chex"  />
	  </div>
      checkbox  表示多選 ,同一組中可以選多個,name必須一致,返回值是個數組
      submit   提交
      reset   重置
      button 普通按鈕

select下拉菜單

<select>
		<option value ="">請選擇年份</option>
		<option value ="">1998</option>
		<option value ="">1999</option>
</select>
<select>
		<option value ="">請選擇月份</option>
		<option value ="">08</option>
		<option value ="">01</option>
</select>
<select>
		<option value ="">請選擇日</option>
		<option value ="">30</option>
		<option value ="">07</option>
</select>

textarea元素

需要指定輸入的區域位置大小

<textarea rows="10" cols="20" >  表示10行20列的文本空間大小

祝考試順利


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM