1 用JPA自动建表
使用jpa可以用注解的方式将实体类直接映射到数据库中。所以在建表的时候只用编写实体类:
省略getter setter
首先在类的最前面加上@Entity标明它是一个实体类,@Table注解告诉jpa映射到表的名字。
@Id和@GeneratedValue(strategy = GenerationType.IDENTITY)分别用来标识出主键和自动递增或递减。添加@OneToMany(mappedBy = “user”)这样的注解之后就可以避免添加很多中间表。
@Entity
@Table(name="t_user")
public class User {
@Id //主键标识
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
private String email;
private String avatar;
private String nickname;
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
private Integer type;
@Temporal(TemporalType.TIMESTAMP) //指定时间格式
private Date createTime;
@Temporal(TemporalType.TIMESTAMP)
private Date updateTime;
@OneToMany(mappedBy = "user")//一对多
private List<News> newsList= new ArrayList<>();
运行之后获得的数据表如下:
2 编写dao层接口
使用JPA规范可以不用自己写sql语句,使用封装好的接口就可以了。自己定义的接口也会帮我们自动实现。这里根据用户名和密码查找数据库中的对应用户对象:
public interface UserRepository extends JpaRepository<User,Long> {
User findByUsernameAndPassword(String username,String password);
}
3 编写服务层接口和实现
接口
public interface UserService {
User checkUsers(String username,String Password);
}
实现:直接调用dao层接口即可
@Service
public class UserServiceImpl implements UserService {
@Autowired
public UserRepository userRepository;
@Override
public User checkUsers(String username, String password) {
return userRepository.findByUsernameAndPassword(username,password);
}
}
4 编写Controller
首先加上Controller注解,建立映射到admin。当用户进入/admin时就跳转到admin/login界面
在login的Controller中,由于用户要提交包含其账号和密码的表单,用PostMapping进行映射。获取用户提供的表单信息,调用服务层查找用户,如果找到了用户,将用户存在session中,跳转到admin的首页。如果没有查找到用户,重定向到登录页面。登出操作就是将用户信息从session中移除。
@Controller
@RequestMapping("/admin")
public class LoginController {
@Autowired
private UserService userService;
@GetMapping
public String loginPage(){
return "admin/login";
}
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password,
HttpSession session, RedirectAttributes attributes){
User user = userService.checkUsers(username,password);
if(user!=null){
user.setPassword(null);
session.setAttribute("user",user);
return "admin/index";
}else {
attributes.addFlashAttribute("message","用户名或密码错误");
return "redirect:/admin";
}
}
@GetMapping("/logout")
public String logout(HttpSession session){
session.removeAttribute("user");
return "redirect:/admin";
}
}
5 编写html
主要是提交表单部分,提交表单映射到admin.login。name中指定了传递参数的形式和值
<form class="ui large form" method="post" action="#" th:action="@{/admin/login}">
<div class="ui segment">
<div class="field">
<div class="ui left icon input">
<i class="user icon"></i>
<input type="text" name="username" placeholder="用户名">
</div>
</div>
<div class="field">
<div class="ui left icon input">
<i class="lock icon"></i>
<input type="password" name="password" placeholder="密码">
</div>
</div>
<button class="ui fluid large teal submit button">登 录</button>
</div>
<div class="ui error mini message"></div>
<div class="ui mini negative message" th:unless="${#strings.isEmpty(message)}" th:text="${message}">111</div>
</form>