# annotation **Repository Path**: chunuo/annotation ## Basic Information - **Project Name**: annotation - **Description**: 开源轻量级ssm框架,实现了ssm常用的基本功能,项目开源,后期持续更新功能 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2020-12-25 - **Last Updated**: 2021-08-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # annotation #### 介绍 开源轻量级ssm框架,实现了ssm常用的基本功能,项目开源,后期持续更新功能 #### 软件架构 该框架模仿ssm中的功能,ioc容器、切面编程、注解sql、单例模式、ThreadLocal确保事务安全、简化原始web开发每个servlet占据一个类,采用了反射映射到方法上,以及全局异常处理。一句话说完,就是模仿spring、mybatils和springmvc框架 #### 安装教程 1. 将项目打包,然后新建maven的web项目,并导包,如何导就不说啦,相信大家都会。在案例中,提供了测试数据库和jar包。 ```xml com.chunuo.annotation annotation 1.0.2 ... org.apache.maven.plugins maven-compiler-plugin 3.8.1 1.8 1.8 -parameters ``` 2. 添加配置文件导resources中,名为 application.properties ``` #common注解扫描的包 packageNameScan=com.chunuo.mvc #项目名 packageName=/mvc #数据库连接池 driverClassName = com.mysql.cj.jdbc.Driver url = jdbc:mysql://127.0.0.1:3306/shiro_es?serverTimezone=UTC username = root password = root minIdle = 5 initialSize = 5 maxActive = 20 maxWait = 60000 #dao层扫描 mapperScan=com.chunuo.mvc.dao #domain实体类扫描 entityScan=com.chunuo.mvc.domain #开启事务,动态代理 serviceScan=com.chunuo.mvc.service.impl ``` 3. 添加监听器 ```xml com.chunuo.configuration.listenet.InitServletContextListner ``` 不添加也是可以的 ,添加之后是立即加载,而不添加是懒加载 #### 使用说明 ### 1. @Autowired("xx") 和 @Component("xx") @Autowired :将该注解属性从ioc容器找到相应的对象 @Component("xx") :将该类存到ioc容器里 优先级: @Autowired("xx") 匹配最高 @Component("xx"); 属性名 其次 类名首字母小写 全限定类名 再者 全限定类名 接口 最后 接口 案例 ```java @Component public class UserServiceImpl implements UserService {} --------------------------------------------------------- @Component public class UserController { @Autowired public UserService userService; } ``` ### 2. 实体类注解 @TableName("sys_user") 、 @TableId 、 @TableField ```java @TableName("sys_user")//表名,该标签必须有,但可以不写value,默认驼峰命名法 @TableId//表中id,必须有 @TableField//字段必须有,表明该属性是数据库字段,默认是驼峰命名法 ``` 案例 ```java @TableName("sys_user") public class SysUser implements Serializable { private static final long serialVersionUID = 1L; @TableId @TableField private String id; @TableField("user_name") private String username; @TableField private String realname; @TableField private String password; @TableField private Integer status; @TableField private String salt; @TableField private String dep; } ``` ### 3. Dao层 接口需要继承这个接口DataVisit 同时可以使用增删改的方法 @SelectForeach : 查询一组数据,集合 @SelectOne : 查询一条数据,一个对象 @Single : 查询一个数据,比如count(*) @Update : 增删改 @Param("username") :参数 用法如下:可以是多个参数 ```java @SelectOne("select * from imgList where id = #{id} and username = #{username}") SysUser findById(@Param("username")String name,@Param("id") Integer userId); ``` **注意:多个参数的时候必须使用@Param注解** **注意:默认情况下加过事务,而查询不开启事务,则需要遵循一个规则,查询方法开头必须以find、query、get开头** 你也可以用对象一个参数,但是#{id}的值得从参数中查找,如果没有,会抛出异常,于mybatis一样 ```java @Update("update sys_user set user_name = #{username} , realname = #{realname} where id = #{id}") int update(SysUser sysUser); ``` 案例 ```java //@Component public interface UserDao extends DataVisit { @SelectForeach("select * from sys_user") List findSysUserList(); @SelectOne("select * from sys_user where id = ?") SysUser findSysUserById(String id); @Single("select user_name from sys_user where id = ?") String findUserNameById(String id); @Update("update sys_user set user_name = #{username} , realname = #{realname} where id = #{id}") int update(SysUser sysUser); /** 动态sql用法: and 1 = 1 and user_name = #{username} else可以写,可以不写 */ @Update("delete from sys_user where id = #{id} and 1 = 1 and user_name = #{username} ") int deleteSysUserByUsername(@Param("id") String id,@Param("username") String username); } ``` 配置文件中以及写过dao层的包路径,所以@Component注解可以省略 ### 4. Controller @RequestMapping("user") 请求路径 @PathVariable("page") restful风格 @RequestParam("username") 参数 @RequestBody 请求体封装成对象 **需要注意的是,所有参数必须要有注解,如** @PathVariable @RequestParam("userId") @RequestBody **spring中,可以不写RequestParam注解,原因是默认字段名,而我省略了这一步,默认以注解为准** 案例: ```java @RequestMapping("user") @Component public class UserController { @Autowired public UserService userService; @RequestMapping(value = "list/{id}/{page}/{limit}",method = RequestMethod.GET) public R list(@PathVariable("id")String id,@PathVariable("page")Integer page,@PathVariable("limit") Integer limit){ System.out.println(id+" = "+page+" = "+limit); List sysUserList = userService.findSysUserList(); return R.ok().data("list",sysUserList); } @RequestMapping(value = "info",method = RequestMethod.GET) public R info(@RequestParam("userId") String id){ SysUser user = userService.findSysUserById(id); return R.ok().data("info",user); } @RequestMapping(value = "save",method = RequestMethod.POST) public R save(@RequestBody SysUser sysUser){ System.out.println("保存数据"+sysUser); userService.saveOrUpdate(sysUser); return R.ok().message("保存成功"); } @RequestMapping(value = "delete/{id}",method = RequestMethod.DELETE) public R delete(@RequestParam("username")String username,@PathVariable("id")String id){ System.out.println("删除 > "+username+":"+id); int count = userService.deleteSysUserByUsername(username,id); return R.ok().message("删除数量 : "+String.valueOf(count)); } @RequestMapping(value = "update",method = RequestMethod.PUT) public R update(@RequestBody SysUser sysUser){ System.out.println("更新 =》"+sysUser); int count = userService.update(sysUser); return R.ok().message("更新数量 : "+String.valueOf(count)); } } ``` ### 5. 全局异常统一处理 @ControllerAdvice 案例 ```java @ControllerAdvice public class XxxException { @ExceptionHandler(Exception.class) public R error(Exception e){ e.printStackTrace(); return R.error().message(e.getMessage()); } } ``` ### 6. 配置类 @Configuration 配置类,添加bean,如果bean不写value,则默认是方法名,如果方法中有参数,则该参数必须也注入过ioc容器 案例 ```java @Configuration public class XxxConfiguration { @Bean("MVCapplication") public MvcApplication mvcApplication2(MvcApplication mvcApplication){ return new MvcApplication(); } @Bean public MvcApplication mvcApplication(){ return new MvcApplication(); } } ```