# 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();
}
}
```