一、MyBatis注解
MyBatis是一个基于ORM的数据访问层框架。
1.1 @Insert [/ɪnˈsɜːt/] 【插入】 : 插入sql , 和xml insert sql语法完全一样
1.2 @Select [[sɪˈlekt]]【查询】 : 查询sql, 和xml select sql语法完全一样
1.3 @Update [ /ˌʌpˈdeɪt/]【更新】 : 更新sql, 和xml update sql语法完全一样
1.4 @Delete [/dɪˈliːt/]【删除】 : 删除sql, 和xml delete sql语法完全一样
1.5 @Param [/ˌpærəˈm/]【参数】 : 入参
1.6 @Results [/rɪˈzʌlts/]【结果】 : 设置结果集合
1.7@Result : 结果
1.8 @ResultMap : 引用结果集合
1.9 @SelectKey : 获取最新插入id
具体使用:
(1)、@Select、@Results、@Result
/**
* 查询所有
* @return Employee泛型集合
*/
@Select("select * from t_emp")
@Results(id = "empMap",value = {
@Result(column = "emp_id",property = "empId",id = true),
@Result(column = "emp_name",property = "empName"),
@Result(column = "emp_tel",property = "empTel"),
@Result(column = "emp_education",property = "empEducation"),
@Result(column = "emp_birthday",property = "empBirthday"),
@Result(column = "fk_dept_id",property = "dept"
,one = @One(select = "com.yingside.dao.DeptMapper.getById",
fetchType = FetchType.LAZY))
})
List<Employee> getAll();
(2)、@Delete、@Param、@ResultMap
/**
* 根据id查询员工
* @param empId 员工主键id
* @return 员工对象
*/
@Select("select * from t_emp where emp_id=#{empId}")
@ResultMap(value="empMap")
Employee getById(@Param("empId") Integer empId);
(3)、@Insert、@SelectKey
/**
* 插入新员工信息,并将最新id放入到员工对象在
* @param record 新员工对象
* @return 插入成功 1 失败 0
*/
@Insert("insert into t_emp (emp_id, emp_name, emp_tel, " +
" emp_education, emp_birthday, fk_dept_id" +
" )" +
" values (#{empId}, #{empName}, #{empTel}, " +
" #{empEducation}, #{empBirthday}, #{fkDeptId}" +
" )")
@SelectKey(before = false,keyColumn = "emp_id",keyProperty = "empId",
statement = "select last_insert_id()",resultType = Integer.class)
int insert(Employee record);
(4)、@Delete、@Param
/**
* 根据员工id删除员工
* @param empId 员工主键id
* @return 删除成功 1 失败 0
*/
@Delete("delete from t_emp where emp_id=#{empId}")
int deleteByPrimaryKey(@Param("empId") Integer empId);
(5)、@Update
/**
* 更新员工信息
* @param record 员工对象
* @return 更新成功 1 失败 0
*/
@Update("update t_emp" +
" set emp_name = #{empName,jdbcType=VARCHAR}," +
" emp_tel = #{empTel,jdbcType=VARCHAR}," +
" emp_education = #{empEducation,jdbcType=VARCHAR}," +
" emp_birthday = #{empBirthday,jdbcType=DATE}," +
" fk_dept_id = #{fkDeptId,jdbcType=INTEGER}" +
" where emp_id = #{empId,jdbcType=INTEGER}")
int update(Employee record);
当然最后别忘记了,写完这些之后,在核心配置文件中要把映射文件给加上,之前使用的时候,找寻的是resouce xml的资源路径,现在由于使用了注解,就只有接口文件了,所有配置相应的要做一个简单的修改
<mappers>
<mapper class="com.yingside.dao.EmployeeMapper" />
</mappers>
二、Spring注解
Spring — 分层解决业务逻辑层与其他各层之间松耦合问题的javaSE/EE的一站式开源框架。
2.1 @Component [/kəmˈpəʊnənt/]【组件,组成部分,成分】
创建对象的注解,使用时只需将该注解标注在相应类上即可。
没有@Component之前
public class Student{
}
Spring配置文件
<bean id=”student” class=”com.wangxing.spring.bean.Student”></bean>
有@Component之后
@Component --- 使用默认的对象名称【类名,首字母小写】
public class Student{
}
@Component(“stu”)---使用指定的对象名称
public class Student{
}
2.2 @Repository [/rɪˈpɒzətri/]【资源库】标注数据访问接口实现类,其功能与 @Component 相同。
2.3 @Service[ /ˈsɜːvɪs/]【服务】标注业务访问接口实现类,其功能与 @Component 相同。
2.4 @Controller[/kənˈtrəʊlər/]【控制器】标注控制层实现类,其功能与 @Component 相同。
2.5 @Autowired[ /ˈɔːtəʊˈwaɪəd/]【自动装配】 完成 Bean 的自动注入工作。默认按照bytype
2.6 @Resource[/rɪˈsɔːs; rɪˈzɔːs/] 【资源类型】完成 Bean 的自动注入工作。默认按照byname
@autowired和@resource注解的区别?
(1)@Autowired与@Resource都可以用来装配bean,都可以写在字段或setter方法上
(2)@Autowired默认按类型装配,默认情况下必须要求依赖对象存在,如果要允许null值,可以设置它的required属性为false。如果想使用名称装配可以结合@Qualifier注解进行使用。
(3)@Resource,默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行名称查找。如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
推荐使用@Resource注解在字段上,这样就不用写setter方法了,并且这个注解是属于J2EE的,减少了与Spring的耦合。
2.7 @Qualifier [/ˈkwɒlɪfaɪər/]【限定符 限定词 修饰符】与 @Autowired 注解配合使用,会将默认的按 Bean 类型装配修改为按 Bean 的实例名称装配,Bean 的实例名称由 @Qualifier 注解的参数指定。
public interfase UserDao{
}
@Repository(“studentUsetDao”)
public class StudentUserDao implements UserDao{
}
@Repository(“personUsetDao”)
public class PersonUserDao implements UserDao{
}
//业务类
public class UserServiceImple{
@Autowired
@Qualifier(“personUsetDao”)
private UserDao userDao;
}
2.8@Aspect开启切面
2.9 @Before前置通知
2.10 @AfterReturning后置通知
2.11 @AfterThrowing异常通知
2.12 @Around环绕通知
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
package com.wangxing.spring.service;
import org.springframework.stereotype.Component;
//业务类
@Component("personService")
public class PersonService {
public void insertPerson(){
System.out.println("添加个人信息的业务方法");
}
public void updatePerson(){
System.out.println("修改个人信息的业务方法");
//int a=10/0;
}
public void deletePerson(){
System.out.println("删除个人信息的业务方法");
}
public void selectPerson(){
System.out.println("查询个人信息的业务方法");
}
}
package com.wangxing.spring.service;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
//增强类
//@Aspect,表示这个系统需求类是一个切面
@Component
@Aspect
public class MyAvice {
//系统需求功能实现方法
//@Before("execution(* com.wangxing.spring.service.PersonService.selectPerson())")
//@AfterReturning("execution(* com.wangxing.spring.service.PersonService.deletePerson())")
//@AfterThrowing("execution(* com.wangxing.spring.service.PersonService.updatePerson())")
@After("execution(* com.wangxing.spring.service.PersonService.updatePerson())")
public void saveLog(){
System.out.println("记录执行日志");
}
//执行环绕通知的系统需求功能实现方法
@Around("execution(* com.wangxing.spring.service.PersonService.insertPerson())")
public void testAround(ProceedingJoinPoint joinPoint) throws Throwable{
saveLog();
joinPoint.proceed(); // 调用真正的业务方法
saveLog();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--使用context命名空间,通知spring扫描指定目录,进行注解的解析-->
<context:component-scan base-package="com.wangxing.spring.service"></context:component-scan>
<!--开启aop注解-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
2.13 @Transactional [ /trænˈzækʃənəl/]【事务处理】开启事务
package com.wangxing.spring.service;
import com.wangxing.spring.mapper.TransferMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashMap;
import java.util.Map;
@Service("transferService")
@Transactional
public class TransferService {
@Autowired
private TransferMapper transferMapper;
/**
* 转账方法
* @throws Exception
*/
public void transfer()throws Exception{
Map<String,Object> liuneng=new HashMap<String,Object>();
liuneng.put("username","刘能");
liuneng.put("number",1000);
transferMapper.lessMoney(liuneng);
int a=10/0;
Map<String,Object> zhaosi=new HashMap<String,Object>();
zhaosi.put("username","赵四");
zhaosi.put("number",1000);
transferMapper.addMoney(zhaosi);
}
}
三、SpringMVC
SpringMVC — SpringMVC是web层的mvc开发框架,属于Spring框架的WEB模块中的一个部分。
3.1 @RequestMapping设置控制器类/请求处理方法的访问路径
@RequestMapping的常用的属性
value表示设置访问路径[可以省略]
method–限制请求的访问方式【GET、POST…】
package com.wangxing.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloController {
@RequestMapping("/test1.do")
public ModelAndView testRequest(){
ModelAndView mav=new ModelAndView();
mav.addObject("info","hello,网星软件");
mav.setViewName("test.jsp");
return mav;
}
}
3.2@PathVariable 定义在方法上获取请求url路径上的参数数据
@RequestMapping(value = "/get1/{username}/{password}",method = RequestMethod.GET)
public ModelAndView getReqParam1(@PathVariable("username")String name,
@PathVariable("password")String pass){
ModelAndView mav=new ModelAndView();
mav.addObject("username",name);
mav.addObject("password",pass);
mav.setViewName("test.jsp");
return mav;
}
3.3 @RequestParam 定义在方法上,获取请求中通过key=value方式传递的参数数据
@RequestMapping(value = "/get2",method = RequestMethod.GET)
public ModelAndView getReqParam2(@RequestParam("username")String name, @RequestParam("password")String pass){
ModelAndView mav=new ModelAndView();
mav.addObject("username",name);
mav.addObject("password",pass);
mav.setViewName("test.jsp");
return mav;
}
3.4 @DateTimeFormat时间格式化
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date day;
3.5 @RequestBody注解接收来自请求体中的参数。
package com.wangxing.springmvc.controller;
import com.wangxing.springmvc.bean.UserBean;
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.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloController {
@RequestMapping(value = "/test1.do")
@ResponseBody
public UserBean testRequest(){
UserBean user1=new UserBean();
user1.setUsername("zhangsan");
user1.setPassword("000000");
user1.setMyage(23);
user1.setMyaddress("西安");
return user1;
}