8月的最后一天,台风在这一周已经是第三次光临,每次下雨都是那么让人激动又让人愁,我几乎不怎么带伞,带伞的时候几乎都不会下雨...
言归正传,这是我工作的第二个月,在此记录一些可能对自己有用的东西,欢迎大家指正。
这次我想记录的是DTO(数据传输对象),在有时候,对数据库查出的数据不好直接处理的时候,我就选择创建一个近似于那个对象的DTO去接收数据,然后进行一系列的处理。在我涉及到项目中,用到DTO的有两个地方,一个登陆模块,一个修改密码模块。
登陆代码:
@Ignore
public class LoginParam {
/**
* 因为User里面的password不能参与json格式化(向前端传递)
* 所以这里专门新建了一个数据传输对象,此对象不参与spring解析
* 所以记得要加上@Ignore注解,而在真正的实体类中的password属性需要加上@JsonIgnore注解
*/
//用户登录账号
private String account;
//用户登录密码
private String password;
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "LoginParam [account=" + account + ", password=" + password + "]";
}
}
数据处理代码:
@RequestMapping(value = "/login", method = { RequestMethod.POST })
public ResponseEntity<User> login(@RequestBody LoginParam userLogin) {
User user = userRepository.findByAccount(userLogin.getAccount());
if (user != null) {
String loginPwd = userLogin.getPassword();
String userPwd = user.getPassword();
if (userPwd.length() == 32) {
if (loginPwd.equals(userPwd)) {
return new ResponseEntity<User>(user, HttpStatus.OK);
} else {
return new ResponseEntity<User>(HttpStatus.BAD_REQUEST);
}
} else {
userPwd = MD5Util.string2MD5(userPwd);
if (loginPwd.equals(userPwd)) {
return new ResponseEntity<User>(user, HttpStatus.OK);
} else {
// 400
return new ResponseEntity<User>(HttpStatus.BAD_REQUEST);
}
}
} else {
// 417
return new ResponseEntity<User>(HttpStatus.EXPECTATION_FAILED);
}
}
这里写的可能不是很完善,因为我找不到适合的错误状态码返回到前端。这里的string2MD5()方法是工具类。代码如下:
public static String string2MD5(String inStr) {
MessageDigest md5 = null;
try {
// 获得MD5摘要算法的 MessageDigest 对象
md5 = MessageDigest.getInstance("MD5");
} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
return "";
}
byte[] byteArray = inStr.getBytes();
// 获取加密byte数组
byte[] md5Bytes = md5.digest(byteArray);
// 把密文转换成十六进制的字符串形式
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
// 转成16进制int
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16)
hexValue.append("0");
hexValue.append(Integer.toHexString(val));
}
// return hexValue.toString().substring(8, 24);//16位
return hexValue.toString(); // 32位
}
至于修改密码这个模块用法这个大同小异,无非多了一个对表的更新操作,就不贴出来了。
除了用DTO之外,还可以使用@Transient注解,在实体类中添加一个没有具体数据库字段的属性。代码如下:
@Entity
@Table(name="OM_GOODSINFO_TB")
public class GoodsInfo {
/**
* 唯一标识,主键
*/
@Id
@GeneratedValue(generator = "OM_GOODSNFO_TB_SQ", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "OM_GOODSNFO_TB_SQ", sequenceName = "OM_GOODSNFO_TB_SQ", allocationSize = 1)
@Column(name = "good_id", nullable = false, length = 10)
private Integer goodId;
/**
* 商品名称
*/
@Column(name = "good_name", nullable = true, length = 128)
private String goodName;
/**
* 商品价格
*/
@Column(name = "good_price", nullable = true, length = 128)
private Integer goodPrice;
/**
* 商品类型
*/
@Column(name = "good_type", nullable = true, length = 20)
private String goodType;
/**
* 商品名称
*/
@Column(name = "good_image", nullable = true, length = 128)
private String goodImage;
/**
* 商品详情
*/
@Column(name = "good_detail", nullable = true, length = 512)
private String goodDetail;
/**
* 快递邮费
*/
@Column(name = "courier_fee", nullable = true, length = 512)
private Integer courierFee;
@Column(name = "create_time", nullable = true, length = 512)
private Date createTime;
@Column(name = "update_time", nullable = true, length = 512)
private Date updateTime;
@Transient
private double testPrice;
@Transient
private double testFee;
public double getTestPrice() {
return testPrice;
}
public void setTestPrice(double testPrice) {
this.testPrice = testPrice;
}
public double getTestFee() {
return testFee;
}
public void setTestFee(double testFee) {
this.testFee = testFee;
}
public Integer getGoodId(){
return goodId;
}
public void setGoodId(Integer goodId){
this.goodId = goodId;
}
public String getGoodName(){
return goodName;
}
public void setGoodName(String goodName){
this.goodName = goodName;
}
public Integer getGoodPrice(){
return goodPrice;
}
public void setGoodPrice(Integer goodPrice){
this.goodPrice = goodPrice;
}
public String getGoodType(){
return goodType;
}
public void setGoodType(String goodType){
this.goodType = goodType;
}
public String getGoodDetail(){
return goodDetail;
}
public void setGoodDetail(String goodDetail){
this.goodDetail = goodDetail;
}
public Integer getCourierFee(){
return courierFee;
}
public void setCourierFee(Integer courierFee){
this.courierFee = courierFee;
}
public Date getCreateTime(){
return createTime;
}
public void setCreateTime(Date createTime){
this.createTime = createTime;
}
public Date getUpdateTime(){
return updateTime;
}
public void setUpdateTime(Date updateTime){
this.updateTime = updateTime;
}
public String getGoodImage(){
return goodImage;
}
public void setGoodImage(String goodImage){
this.goodImage = goodImage;
}
@Override
public String toString() {
return "GoodsInfo [goodId=" + goodId + ", goodName=" + goodName + ", goodPrice=" + goodPrice + ", goodType="
+ goodType + ", goodImage=" + goodImage + ", goodDetail=" + goodDetail + ", courierFee=" + courierFee
+ ", createTime=" + createTime + ", updateTime=" + updateTime + "]";
}
}
这个命名可能不是很规范,不过将就看,哈哈哈~这里还要说一下的是,@Column注解中的length只对字符串生效,所以其他类型写什么都无所谓。在这里使用额外的两个属性是因为在这个项目中,钱的单位是分,所以需要单独处理,而后台最终得到的对象Page<GoodsInfo>操作起来有点难,我就搞了这个两个属性缓冲了一下。关于这个Page对象的处理,后来搞清楚也不是很复杂,用迭代器遍历,然后对得到的对象直接调用set方法,就可以改变之中的值了。
好啦,这次的总结就写到这里。才参加工作,我希望自己能更加踏实一些。
在没有足够的实力之前,收敛好自己脾气,不管怎样。