修改的人
,修改的时间
,创建的人
,创建的时间
这四个字段建议创建,便于后面管理create database tedu_store;
create table t_user(id int primary key auto_increment,
username varchar(50) unique,
password varchar(50),email varchar(50),
phone varchar(32),
image varchar(100),
gender int(1), //0表示男,1表示女
created_user varchar(50), //创建表的人
created_time date, //创建的时间
modified_user varchar(50), //修改的人
modified_time date //修改的时间
)default charset=utf8;
User表
包装类型
,比如Integer
驼峰式
的,即不应该使用下划线
无参
,全参
构造方法set
,get
方法hashCode
,equals
方法重写toString
方法/**
* 用户的实体类
* 无参,全参构造方法
* set,get方法
* hashCode equals方法重写
* 实现序列化接口
* @author chenjiabing
*/
public class User implements Serializable {
private static final long serialVersionUID = 5260484517511749238L; //安全码
private Integer id; //id主键
private String username; //用户名
private String password; //密码
private String email; //邮箱
private String phone; //电话号码
private String image; //图片的地址
private Integer gender; //性别
private String createdUser; //创建表的人
private Date createdTime; //创建表的时间
private String modifiedUser; //修改表的人
private Date modifiedTime; //修改表的时间
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public String getCreatedUser() {
return createdUser;
}
public void setCreatedUser(String createdUser) {
this.createdUser = createdUser;
}
public Date getCreatedTime() {
return createdTime;
}
public void setCreatedTime(Date createdTime) {
this.createdTime = createdTime;
}
public String getModifiedUser() {
return modifiedUser;
}
public void setModifiedUser(String modifiedUser) {
this.modifiedUser = modifiedUser;
}
public Date getModifiedTime() {
return modifiedTime;
}
public void setModifiedTime(Date modifiedTime) {
this.modifiedTime = modifiedTime;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((createdTime == null) ? 0 : createdTime.hashCode());
result = prime * result
+ ((createdUser == null) ? 0 : createdUser.hashCode());
result = prime * result + ((email == null) ? 0 : email.hashCode());
result = prime * result + ((gender == null) ? 0 : gender.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((image == null) ? 0 : image.hashCode());
result = prime * result
+ ((modifiedTime == null) ? 0 : modifiedTime.hashCode());
result = prime * result
+ ((modifiedUser == null) ? 0 : modifiedUser.hashCode());
result = prime * result
+ ((password == null) ? 0 : password.hashCode());
result = prime * result + ((phone == null) ? 0 : phone.hashCode());
result = prime * result
+ ((username == null) ? 0 : username.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (createdTime == null) {
if (other.createdTime != null)
return false;
} else if (!createdTime.equals(other.createdTime))
return false;
if (createdUser == null) {
if (other.createdUser != null)
return false;
} else if (!createdUser.equals(other.createdUser))
return false;
if (email == null) {
if (other.email != null)
return false;
} else if (!email.equals(other.email))
return false;
if (gender == null) {
if (other.gender != null)
return false;
} else if (!gender.equals(other.gender))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (image == null) {
if (other.image != null)
return false;
} else if (!image.equals(other.image))
return false;
if (modifiedTime == null) {
if (other.modifiedTime != null)
return false;
} else if (!modifiedTime.equals(other.modifiedTime))
return false;
if (modifiedUser == null) {
if (other.modifiedUser != null)
return false;
} else if (!modifiedUser.equals(other.modifiedUser))
return false;
if (password == null) {
if (other.password != null)
return false;
} else if (!password.equals(other.password))
return false;
if (phone == null) {
if (other.phone != null)
return false;
} else if (!phone.equals(other.phone))
return false;
if (username == null) {
if (other.username != null)
return false;
} else if (!username.equals(other.username))
return false;
return true;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password="
+ password + ", email=" + email + ", phone=" + phone
+ ", image=" + image + ", gender=" + gender + ", createdUser="
+ createdUser + ", createdTime=" + createdTime
+ ", modifiedUser=" + modifiedUser + ", modifiedTime="
+ modifiedTime + "]";
}
}
username
,password
,email
,phone
,其中username
不能重复,因此需要判断用户名是否存在空
,虽然在表中没有设计,但是在JSP
页面使用了js
控制了null
表示用户名已经存在,如果不存在表示可以注册service层
需要验证查询的结果是否为null
,如果为空,返回true
,表示用户名不存在,那么可以使用这个用户名注册,如果不为null
,返回false
,那么不可以使用这个用户名注册人数 >=1
表示已经存在该邮箱,否则不存在,可以注册service层
需要验证返回的人数是否等于0
,如果不是,返回false
表示邮箱已经存在,不能使用,如果返回true
表示邮箱不存在,可以使用该邮箱注册人数 >=1
表示已经存在该号码,否则不存在,可以注册service
层需要验证返回的人数是否等于0
,如果不是,返回false
表示电话号码已经存在,不能使用这个号码注册,如果返回true
表示号码不存在,可以使用这个号码注册
regist.jsp
表单提交 ———> Controller
中对应的处理请求的方法 ———–> service
层中业务逻辑 ——–> 持久
层,操作数据库,返回数据给service
持久层mapper
操作数据库 ———> Service层
业务逻辑层 —————-> Controller层
———————> JSP
cn.tedu.store.mapper
包下创建UsreMapper接口插入用户
的功能用户名
唯一,因此需要验证用户名是否存在,那么需要一个方法根据用户名查找用户set
方法为指定字段赋值/**
* 用户类的mapper层
* @author chenjiabing
*
*/
public interface UserMapper {
/**
* 添加用户信息
* @param user User对象 其中封装的是用户的信息
*/
void insertUser(User user);
/**
* 根据用户名查找对象
* @param username 用户名
* @return 如果存在返回User对象,否则返回null
*/
User selectUserByUserName(String username);
/**
* 通过邮箱查询
* @param email 邮箱地址
* @return 如果返回的数>=1表示已经存在,返回0表示没有
*/
Integer selectByEmail(String email);
/**
* 通过电话号码查询
* @param phone 电话号码
* @return 如果返回的数>=1表示已经存在这个电话号码,如果返回0表示不存在这个电话号码可以注册
* */
Integer selectByPhone(String phone);
}
src/main/resource/mapper
文件夹新建UserMapper.xml
<mapper namespace="">
写的是UserMapper
的全类名insert
节点,用于执行插入语句select
用于根据用户名查询用户信息,其中返回的结果字段如果和实体类属性不一致,那么需要起别名和实体类属性对应select
语句根据邮箱email
查询,返回的是人数
,用于验证邮箱select
语句根据电话号码phone
查询,返回的是人数,用于验证电话号码<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<!-- namespace指定的UserMapper接口的全类名 -->
<mapper namespace="cn.tedu.store.mapper.UserMapper">
<!--
对应的方法: void insertUser(User user);
功能 : 添加用户信息
返回值: 默认返回的是受影响的行数,不需要写返回类型,除非是select语句一定要写返回类型resultType或者resultMap
id : 是UserMapper.java接口中的方法名称
parameterType : 参数类型,写的是全类名。这里如果是基本类型,比如String,Integer可以不用写,如果是实体类对象最好是写上
-->
<insert id="insertUser" parameterType="cn.tedu.store.bean.User">
insert into t_user(username,password,email,phone,image,gender,created_user,created_time,modified_user,modified_time)
values(#{username},#{password},#{email},#{phone},#{image},#{gender},#{createdUser},#{createdTime},#{modifiedUser},#{modifiedTime})
</insert>
<!--
User selectUserByUserName(String username);
根据用户名查询用户信息,如果存在返回对象,否则返回null
resultType:返回值类型
如果表中的字段和实体类中的字段不相同,那么需要指定别名,否则不能成功赋值
-->
<select id="selectUserByUserName" resultType="cn.tedu.store.bean.User">
select id,username,password,email,gender,image,
phone,created_user as createdUser,
created_time as createdTime,
modified_user as modifiedUser,
modified_time as modifiedTime
from t_user where username=#{username}
</select>
<!--
Integer selectByEmail(String email);
功能: 通过邮箱查找
resultType : 返回的是Integer类型的,需要写全类名,在select语句中必须定义返回值类型
-->
<select id="selectByEmail" resultType="java.lang.Integer">
select count(*) from t_user where email=#{email}
</select>
<!--
Integer selectByPhone(String phone);
功能: 通过电话号码查询,返回的是人数
-->
<select id="selectByPhone" resultType="java.lang.Integer">
select count(*) from t_user where phone=#{phone}
</select>
</mapper>
public class UserMapperTest {
@Test
public void testInsertUser(){
//加载Spring的配置文件
AbstractApplicationContext ac
= new ClassPathXmlApplicationContext(
"spring-mvc.xml",
"spring-dao.xml");
//获取UserMapper的bean,这个是spring通过扫描mapper.xml文件自动为mybatis自动创建的,首字母小写
UserMapper userMapper
= ac.getBean(
"userMapper", UserMapper.class);
User user =new User();
user.setUsername("郑元梅");
user.setPassword("123456");
user.setEmail("1836581289@163.com");
user.setPhone("1836581289");
ac.close();
}
@Test
public void testSelectUserByUserName(){
//加载Spring的配置文件
AbstractApplicationContext ac
= new ClassPathXmlApplicationContext(
"spring-mvc.xml",
"spring-dao.xml");
//获取UserMapper的bean,这个是spring通过扫描mapper.xml文件自动为mybatis自动创建的,首字母小写
UserMapper userMapper
= ac.getBean(
"userMapper", UserMapper.class);
User user=userMapper.selectUserByUserName("陈加兵");
System.out.println(user);
}
@Test
public void testSelectByEmail(){
//加载Spring的配置文件
AbstractApplicationContext ac
= new ClassPathXmlApplicationContext(
"spring-mvc.xml",
"spring-dao.xml");
//获取UserMapper的bean,这个是spring通过扫描mapper.xml文件自动为mybatis自动创建的,首字母小写
UserMapper userMapper
= ac.getBean(
"userMapper", UserMapper.class);
Integer count=userMapper.selectByEmail("1836581289@163.com");
System.out.println(count);
}
@Test
public void testSelectByPhone() {
// 加载Spring的配置文件
AbstractApplicationContext ac = new ClassPathXmlApplicationContext(
"spring-mvc.xml", "spring-dao.xml");
// 获取UserMapper的bean,这个是spring通过扫描mapper.xml文件自动为mybatis自动创建的,首字母小写
UserMapper userMapper = ac.getBean("userMapper", UserMapper.class);
Integer count = userMapper.selectByPhone("1836581289");
System.out.println(count);
}
username
已经存在了,那么抛出异常
,如果不存在就添加即可。selectUserByUserName(User user)
方法判断用户名是否存在,返回对象u
null
null
,调用insertUser(user)
方法添加controller
用户名存在(UserNameAlreadyExistException
)抛出异常的信息
提示Controller
应该处理怎样的结果
cn.tedu.store.service.ex
包中新建异常类UserNameAlreadyExistException
Exception
,重写其中的构造方法,那么会在调用的时候会要求捕捉或者抛出,会提示开发者处理。如果继承了RuntimeException
,这个是运行时异常,那么在调用的时候是不会提醒开发者捕捉或者抛出异常,因此我们这里要继承Exception
这个父类/**
* 用户名存在抛出的异常
* 继承Exception,实现其中的构造方法
* @author chenjiabing
*/
public class UserNameAlreadyExistException extends Exception {
public UserNameAlreadyExistException() {
super();
// TODO Auto-generated constructor stub
}
public UserNameAlreadyExistException(String message, Throwable cause,
boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
// TODO Auto-generated constructor stub
}
public UserNameAlreadyExistException(String message, Throwable cause) {
super(message, cause);
// TODO Auto-generated constructor stub
}
public UserNameAlreadyExistException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
public UserNameAlreadyExistException(Throwable cause) {
super(cause);
// TODO Auto-generated constructor stub
}
}
cn.tedu.store.service
中新建接口IUserService
/**
* 处理用户业务逻辑的接口
* @author chenjiabing
*/
public interface IUserService {
/**
* 注册
* @param user User对象
* @throws UserNameAlreadyExistException 用户名已经存在抛出的异常
*/
void register(User user) throws UserNameAlreadyExistException;
/**
* 验证邮箱是否存在
* @param email 邮箱地址
* @return 如果=0返回true,邮箱可以使用。如果 >=1返回false,邮箱不可以使用
*/
boolean checkEmail(String email);
/**
* 验证电话号码是否存在
* @param phone 电话号码
* @return 如果返回true表示电话号码可以使用,如果返回false表示电话号码不可以使用
*/
boolean checkPhone(String phone);
/**
* 验证用户名是否存在
* @param userName 用户名
* @return 返回true表示用户名不存在,可以注册,返回false表示用户名已经存在,不可使用
*/
boolean checkUserName(String userName);
}
cn.tedu.store.service
中新建IUserService
接口的实现类UserServiceImpl
/**
* IUserService接口的实现类
* @author chenjiabing
*/
@Service //注解标记,用于spring自动创建对象,类名首字母小写
public class UserServiceImpl implements IUserService{
@Resource //自动注入对象,自动创建UserMapper对象
private UserMapper userMapper; //UseMapper的对象,用于调用操作数据库的方法
/**
* 注册
* 1. 调用selectUserByUserName(User user)方法判断用户名是否存在,返回对象u
* 2. 判断u是否为null,
* 3. 如果为null,调用insertUser(user)方法添加
* 4. 如果不为null,抛出异常提示controller用户名存在(UserNameAlreadyExistException)
*/
public void register(User user) throws UserNameAlreadyExistException {
User u=userMapper.selectUserByUserName(user.getUsername()); //调用usermapper中的方法
if (u!=null) { //如果u不为null,表示用户名已经存在与数据库中,不可以再次注册了,因此抛出异常
throw new UserNameAlreadyExistException("用户名已经存在,请重新输入!!!");
}else { //如果u==null,表示用户名不存在,可以添加
userMapper.insertUser(user); //直接调用持久层方法插入数据即可
}
}
//验证邮箱是否存在,返回true表示邮箱可以使用
public boolean checkEmail(String email) {
return userMapper.selectByEmail(email)==0;
}
//验证电话号码是否可用,如果返回true表示可用,false表示不可用
public boolean checkPhone(String phone) {
return userMapper.selectByPhone(phone)==0;
}
//验证用户名是否存在,返回true表示不存在,可用
public boolean checkUserName(String userName) {
User user=userMapper.selectUserByUserName(userName);
return user==null;
}
}
@Test
public void testRegistService(){
//加载Spring的配置文件
AbstractApplicationContext ac
= new ClassPathXmlApplicationContext(
"spring-dao.xml",
"spring-service.xml");
IUserService userService=ac.getBean("userServiceImpl",IUserService.class);
User user=new User();
user.setUsername("郑元梅");
user.setPassword("12345678");
user.setEmail("1879626@163.com");
user.setPhone("138525855");
try {
userService.register(user); //调用service中的注册方法
} catch (UserNameAlreadyExistException e) {
System.out.println(e.getMessage()); //输出错误提示信息
}
}
@Test
public void testCheckEmailService() {
// 加载Spring的配置文件
AbstractApplicationContext ac = new ClassPathXmlApplicationContext(
"spring-dao.xml", "spring-service.xml");
IUserService userService = ac.getBean("userServiceImpl",
IUserService.class);
if (userService.checkEmail("187962@163.com")) {
System.out.println("邮箱不存在,可以注册");
} else {
System.out.println("邮箱存在,不可以注册");
}
}
@Test
public void testCheckPhoneService() {
// 加载Spring的配置文件
AbstractApplicationContext ac = new ClassPathXmlApplicationContext(
"spring-dao.xml", "spring-service.xml");
IUserService userService = ac.getBean("userServiceImpl",
IUserService.class);
if (userService.checkPhone("1836581289")) {
System.out.println("电话号码不存在,可以注册");
} else {
System.out.println("电话号码存在,不可以注册");
}
@Test
public void testCheckUserNameService() {
// 加载Spring的配置文件
AbstractApplicationContext ac = new ClassPathXmlApplicationContext(
"spring-dao.xml", "spring-service.xml");
IUserService userService = ac.getBean("userServiceImpl",
IUserService.class);
if (userService.checkUserName("Jack")) {
System.out.println("用户名不存在,,可以使用");
} else {
System.out.println("用户名已经已经存在,不可用");
}
}
}
/user/checkUserName.do
/user/checkPhone.do
/user/checkEmail.do
/user/showRegister.do
/user/register.do
cn.tedu.store.bean
包中新建ResponseResultT
是用来指定泛型
的,如果使用ResponseResult<List<User>> responseResult=new ResponseResult<List<User>>();
创建对象,那么这个T
的泛型就是List<User>
Void
指定即可,那么就不能为data
赋值了,因为你的泛型指定了Void
/**
* 封装异步请求的返回的结果类型
* @author chenjiabing
* @param <T> 泛型,
用于封装返回数据,如果创建对象为这样ResponseResult<List<User>> responseResult=new ResponseResult<List<User>>();
* 那么此时的data类型是List<User>类型的
*/
public class ResponseResult<T> {
private Integer state; //响应状态码
private String message; //响应信息
private T data; //响应的数据
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((data == null) ? 0 : data.hashCode());
result = prime * result + ((message == null) ? 0 : message.hashCode());
result = prime * result + ((state == null) ? 0 : state.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ResponseResult other = (ResponseResult) obj;
if (data == null) {
if (other.data != null)
return false;
} else if (!data.equals(other.data))
return false;
if (message == null) {
if (other.message != null)
return false;
} else if (!message.equals(other.message))
return false;
if (state == null) {
if (other.state != null)
return false;
} else if (!state.equals(other.state))
return false;
return true;
}
@Override
public String toString() {
return "ResponseResult [state=" + state + ", message=" + message
+ ", data=" + data + "]";
}
}
cn.tedu.store.controller
中创建UserController
类@Controller
注解@RequestMapping("/user")
添加一个二级路径@Controller
@RequestMapping("/user")
public class UserController {
@Resource
// 创建Service对象,自动注入
private IUserService userservice;
/**
* 显示注册视图 register.jsp
*
* @return
*/
@RequestMapping("/showRegister.do")
public String showRegister() {
return "register"; // 直接返回一个视图名称即可
}
/**
* 验证用用户名,异步请求, 用户名失去焦点发出异步请求
* @param userName 用户名
* @return
*/
@RequestMapping("/checkUserName.do")
@ResponseBody
public ResponseResult<Void> checkUserName(
@RequestParam("username") String userName) {
System.out.println(userName);
ResponseResult<Void> result = new ResponseResult<Void>(); // 创建结果集对象
boolean flag = userservice.checkUserName(userName); // 调用service验证方法
// 如果falg==true,表示用户名可用
if (flag) {
result.setState(1); //设置响应码
result.setMessage("用户名可以使用");
} else {
result.setState(0);
result.setMessage("用户名不可以使用");
}
return result;
}
/**
* 验证电话号码,文本框失去焦点发出异步请求
* @param phone 电话号码
* @return
*/
@RequestMapping("/checkPhone.do")
@ResponseBody
public ResponseResult<Void> checkPhone(String phone) {
ResponseResult<Void> result = new ResponseResult<Void>(); // 创建结果集对象
boolean flag = userservice.checkPhone(phone);
// 如果falg==true,表示电话号码可用
if (flag) {
result.setState(1); //设置响应码
result.setMessage("电话号码可以使用");
} else {
result.setState(0);
result.setMessage("电话号码不可以使用");
}
return result;
}
/**
* 验证邮箱地址,文本框失去焦点发出异步请求
* @param email 邮箱地址
* @return
*/
@RequestMapping("/checkEmail.do")
@ResponseBody
public ResponseResult<Void> checkEmail(String email) {
ResponseResult<Void> result = new ResponseResult<Void>(); // 创建结果集对象
boolean flag = userservice.checkEmail(email);
// 如果falg==true,表示邮箱可用
if (flag) {
result.setState(1); //设置响应码
result.setMessage("邮箱地址可以使用");
} else {
result.setState(0);
result.setMessage("邮箱地址不可以使用");
}
return result;
}
/**
* 点击提交按异步请求注册
* @param userName 用户名
* @param password 密码
* @param email 邮箱地址
* @param phone 电话号码
* @return
*/
@RequestMapping("/register.do")
@ResponseBody
public ResponseResult<Void> register(@RequestParam("uname")String userName,@RequestParam("upwd")String password,String email,String phone){
ResponseResult<Void> result = new ResponseResult<Void>(); // 创建结果集对象
User user=new User(); //创建User对象
user.setUsername(userName);
user.setPassword(password);
user.setEmail(email);
user.setPhone(phone);
try {
userservice.register(user); //调用业务层的注册方法
result.setState(1); //设置注册成功的状态吗
result.setMessage("注册成功");
} catch (UserNameAlreadyExistException e) {
result.setState(0); //设置注册失败的状态吗
result.setMessage(e.getMessage());
}
return result;
}
}
/**发起异步GET请求,询问服务器用户名是否已经存在**/
$.get("<%=request.getContextPath()%>/user/checkUserName.do?username="+data,function(d,status,xhr){
//如果响应成功
if(status=="success"){
$("#unamespan").text(d.message); //设置提示内容
//根据返回的不同的状态码设置不同的颜色进行提示,红色和绿色
if(d.state==0){
$("#unamespan").attr("class","msg-error");
}else{
$("#unamespan").attr("class","msg-success");
}
}
});
/**发起异步GET请求,询问服务器邮箱是否已经存在**/
$.get("<%=request.getContextPath()%>/user/checkEmail.do?email="+data,function(d,status,xhr){
//如果响应成功
if(status=="success"){
$("#emailspan").text(d.message); //设置提示内容
//根据返回的不同的状态码设置不同的颜色进行提示,红色和绿色
if(d.state==0){
$("#emailspan").attr("class","msg-error");
}else{
$("#emailspan").attr("class","msg-success");
}
}
});
/**发起异步GET请求,询问服务器电话号码是否已经存在**/
$.get("<%=request.getContextPath()%>/user/checkPhone.do?phone="+data,function(d,status,xhr){
//如果响应成功
if(status=="success"){
$("#phonespan").text(d.message); //设置提示内容
//根据返回的不同的状态码设置不同的颜色进行提示,红色和绿色
if(d.state==0){
$("#phonespan").attr("class","msg-error");
}else{
$("#phonespan").attr("class","msg-success");
}
}
});
//发出异步请求
$.ajax({
url:"<%=request.getContextPath()%>/user/register.do",
type:"POST",
data: $("#form-register").serialize(), //提交表单中的所有数据
dataType:"json",
success:function(obj){
//判断状态码,如果用户已经存在
if(obj.state==0){
//设置提示语句
$("#unamespan").text(obj.message);
$("#unamespan").attr("class","msg-error");
}else{
//注册成功跳转到登录界面
// showLogin.do
}
}
});
Exception
,那么在调用带有抛出异常的信息的service方法会在编辑提示捕捉或者抛出,便于提示开发者完成相应的逻辑下划线
形式定义的,比如created_user
,但是java中的实体类定义的字段的形式是驼峰式
的,比如createdUser
,那么这样的话,表中的字段和实体类类的属性就不是一一对应了,因此在查询数据的时候,需要对返回结果起和实体类字段一样的别名,否则将不能成功赋值XXMapper.xml
文件的时候,select
节点是一定要有返回值类型的resultType
或者resultMap
的,即使是基本类型service
中,如果逻辑比较简单,比如验证邮箱,验证号码等,那么不需要抛出异常,只需要定义返回值提示Controller层
即可