Maven工程搭建spring boot+spring mvc+JPA的示例

网友投稿 287 2023-02-25


Maven工程搭建spring boot+spring mvc+JPA的示例

本文介绍了Maven工程搭建spring boot+spring mvc+JPA的示例,分享给大家,具体如下:

添加Spring boot支持,引入相关包:

1、maven工程,少不了pom.xml,spring boot的引入可参考官网:

org.springframework.boot

spring-boot-starter-parent

1.5.9.RELEASE

javax.servlet

javax.servlet-api

provided

org.springframework

spring-webmvc

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-data-jpa

org.springframework.boot

spring-boot-starter-data-redis

mysql

mysql-connector-java

org.apache.shiro

shiro-core

1.2.2

org.apache.shiro

shiro-spring

1.2.2

org.apache.shiro

shiro-ehcache

1.2.2

org.springframework.boot

spring-boot-maven-plugin

repackage

name

2、以上代码引入了spring boot。spring mvc 和jpa,以及mysql数据库的驱动jar;

编写启动类,并加装配置文件:

1、启动类如下:

import org.springframework.boot.SpringApplication;

import org.http://springframework.boot.autoconfigure.EnableAutoConfiguration;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

import java.io.IOException;

import com.my.config.CommonProperties;

@SpringBootApplication

@EnableAutoConfiguration

@EnableJpaAuditing

public class Application {

public static void main(String[] args) throws IOException{

String loc = CommonProperties.loadProperties2System(System.getProperty("spring.config.location"));

System.getProperties().setProperty("application.version", CommonProperties.getVersion(Application.class));

System.getProperties().setProperty("app.home", loc + "/..");

SpringApplication.run(Application.class, args);

}

}

2、配置文件的位置放到classpath外边,方便在不重新打包的情况下修改,spring boot工程一般都打成jar包:

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.util.Properties;

import org.springframework.util.StringUtils;

public final class CommonProperties {

public static final String PPT_KEY_APP_HOME = "app.home";

public static final String DEFAULT_APP_HOME = "./";

public static final String getAppHome() {

return System.getProperty("./", "./");

}

public static String loadProperties2System(String location) throws IOException {

String configLocation = location;

File cnf;

if (!StringUtils.hasLength(location)) {

configLocation = "./config";

cnf = new File(configLocation);

if (!cnf.exists() || !cnf.isDirectory()) {

configLocation = "../config";

cnf = new File(configLocation);

}

} else {

cnf = new File(location);

}

File[] arg2 = cnf.listFiles();

int arg3 = arg2.length;

for (int arg4 = 0; arg4 < arg3; ++arg4) {

File file = arg2[arg4];

if (file.isFile() && file.getName().endsWith(".properties")) {

Properties ppt = new Properties();

FileInputStream fi = new FileInputStream(file);

Throwable arg8 = null;

try {

ppt.load(fi);

System.getProperties().putAll(ppt);

} catch (Throwable arg17) {

arg8 = arg17;

throw arg17;

} finally {

http:// if (fi != null) {

if (arg8 != null) {

try {

fi.close();

} catch (Throwable arg16) {

arg8.addSuppressed(arg16);

}

} else {

fi.close();

}

}

}

}

}

return configLocation;

}

public static String getVersion(Class> clazz) {

Package pkg = clazz.getPackage();

String ver = pkg != null ? pkg.getImplementationVersion() : "undefined";

return ver == null ? "undefined" : ver;

}

将配置文件放到jar包同级目录的config文件夹下,包括日志配置,application.yml文件,其他配置文件等;

编写自动配置类

用于扫描compan* ,代替spring mvc的spring.xml配置文件:

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

@Configuration

@ComponentScan(basePackages = {

"com.my.rs",

"com.my.service",

"com.my.repository"})

public class AppAutoConfiguration {

}

import org.springframework.boot.autoconfigure.web.HttpMessageConverters;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**

* 预配置

* */

@Configuration

public class MyConfiguration extends WebMvcConfigurerAdapter{

@Bean

public HttpMessageConverters customConverters() {

return new HttpMessageConverters();

}

@Override

public void addResourceHandlers(ResourceHandlerRegistry registry) {

//registry.addResourceHandler("/**")

// .addResourceLocations("classpath:/META-INF/resources/**");

}

编写rs,service,repository

package com.my.rs;

import java.util.List;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.ResponseBody;

import com.my.entity.User;

@RequestMapping({"/api/user"})

public interface UserRS {

@RequestMapping(value="/add",method={RequestMethod.POST})

@ResponseBody

public User saveUser(@RequestBody User user);

@RequestMapping(value="/update",method={RequestMethod.POST})

@ResponseBody

public User updateUser(@RequestBody User user);

@RequestMapping(value="/delete",method={RequestMethod.POST,RequestMethod.DELETE})

public void deleteUser(@RequestParam String[] userIds);

@RequestMapping(value="/get",method={RequestMethod.GET})

@ResponseBody

public User getUser(@RequestParam String userId);

@RequestMapping(value="/query/all",method={RequestMethod.GET})

public List queryAll();

@RequestMapping(value="/query/byName",method={RequestMethod.GET})

public List queryByName(@RequestParam String name);

@RequestMapping(value="/query/byParentId",method={RequestMethod.GET})

public List queryChildren(@RequestParam String parentId);

//无参数分页查询

@RequestMapping(value="/query/page",method={RequestMethod.GET})

public List queryByPage(@RequestParam int pageNo,

@RequestParam int pageSize,

@RequestBody(required=false) User user);

}

package com.my.rs.impl;

import java.util.List;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RestController;

import com.my.entity.User;

import com.my.rs.UserRS;

import com.my.service.UserService;

@RestController

public class UserRSImpl implements UserRS{

public static Logger logger = LoggerFactory.getLogger(UserRSImpl.class);

@Autowired

UserService _userService;

@Override

public User saveUser(@RequestBody User user){

try {

return _userService.save(user);

} catch (Throwable e) {

logger.error(e.getMessage(),e);

throw e;

}

}

@Override

public User updateUser(@RequestBody User user) {

return _userService.update(user);

}

@Override

public void deleteUser(String[] userIds) {

for (String userId : userIds) {

_userService.deleteById(userId);

}

}

@Override

public List queryAll() {

return _userService.queryAll();

}

@Override

public List queryByName(String name) {

return _userService.findByName(name);

}

@Override

public List queryChildren(String parentId) {

return _userService.findByParentId(parentId);

}

@Override

public User getUser(String userId) {

return _userService.findById(userId);

}

@Override

public List queryByPage(int pageNo, int pageSize, User user) {

return null;

}

}

package com.my.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import com.my.entity.User;

import com.my.repository.UserRepository;

@Service

public class UserService extends BaseService{

@Autowired

UserRepository _userRepository;

public List findByName(String name){

return _userRepository.findByName(name);

}

public List findByParentId(String parentId){

return _userRepository.findByParentId(parentId);

}

}

package com.my.repository;

import java.util.List;

import com.my.entity.User;

public interface UserRepository extends BaseRepository{

List findByName(String name);

List findByParentId(String parentId);

}

以上采用了分层模式,有点繁琐,但是对之后修改每层的业务逻辑比较方便

JPA相关的类如下:

package com.my.service;

import java.io.Serializable;

import javax.persistence.EntityManager;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;

import com.my.repository.BaseRepository;

/**

* 一些共有的方法放这里

* */

@Transactional

public class BaseService {

@Autowired

BaseRepository _baseRepository;

@Autowired

EntityManager em;

public E save(E baseUnit){

return _baseRepository.saveAndFlush(baseUnit);

}

public E update(E baseUnit){

return _baseRepository.saveAndFlush(baseUnit);

}

public void deleteById(String id) {

_baseRepository.delete(id);

}

public java.util.List queryAll(){

return _baseRepository.findAll();

}

public E findById(String id){

return _baseRepository.getOne(id);

}

}

package com.my.repository;

import java.io.Serializable;

import org.springframework.data.jpa.repository.JpaRepository;

import org.springframework.data.repository.NoRepositoryBean;

@NoRepositoryBean

public interface BaseRepository extends JpaRepository{

}

实体类:与数据库字段相关,需要注意下父类中的注解@MappedSuperclass

package com.my.entity;

import java.util.ArrayList;

import java.util.List;

import javax.persistence.Entity;

import javax.persistence.ManyToMany;

import org.hibernate.annotations.DynamicInsert;

import org.hibernate.annotations.DynamicUpdate;

import org.hibernate.validator.constraints.Email;

@Entity(name = "db_user")

@DynamicInsert

@DynamicUpdate

public class User extends BaseUnit {

/**

* 账户状态

*/

public static enum AccountStatus {

/**

* 正常

*/

Enable, //

/**

* 停用

*/

Disable

}

private static final long serialVersionUID = -3101319619397064425L;

private String password;

private String salt;

/** 账户状态 */

private AccountStatus status;

/** 认证邮箱 */

@Email(message = "User.email属性必须符合邮箱格式")

private String email;

/** 移动电话号码 */

private String mobileNo;

/** 身份证号码 */

private String cardId;

@ManyToMany(targetEntity=Role.class)

private List roleIds;

/** 昵称。可选。 */

private String nickName;

public String getCardId() {

return cardId;

}

public String getEmail() {

return email;

}

public String getMobileNo() {

return mobileNo;

}

public String getNickName() {

return nickName;

}

public String getPassword() {

return password;

}

public List getRoleIds() {

if (roleIds == null) {

roleIds = new ArrayList<>();

}

return roleIds;

}

public String getSalt() {

return salt;

}

public AccountStatus getStatus() {

return status;

}

public void setCardId(String cardId) {

this.cardId = cardId;

}

public void setEmail(String email) {

this.email = email;

}

public void setMobileNo(String mobileNo) {

this.mobileNo = mobileNo;

}

public void setNickName(String nickName) {

this.nickName = nickName;

}

public void setPassword(String password) {

this.password = password;

}

public void setRoleIds(List roleIds) {

this.roleIds = roleIds;

}

public void setSalt(String salt) {

this.salt = salt;

}

public void setStatus(AccountStatus status) {

this.status = status;

}

}

package com.my.entity;

import java.io.Serializable;

import java.util.Date;

import javax.persistence.Id;

import javax.persistence.MappedSuperclass;

import javax.validation.constraints.NotNull;

import javax.validation.constraints.Size;

import org.springframework.data.annotation.CreatedBy;

import org.springframework.data.annotation.CreatedDate;

import org.springframework.data.annotation.LastModifiedBy;

import org.springframework.data.annotation.LastModifiedDate;

@MappedSuperclass

public class BaseUnit implements Serializable {

@Id

@NotNull

public String id;

/**

* 父单元ID

*/

@Size(max = 32, message = "BaseUnit.parentId属性长度不能大于32")

public String parentId;

/** 父单元的类型 */

public ParentType parentType;

/**

* 单元的名称

*/

@NotNull(message = "BaseUnit.name属性不能为空")

public String name;

@CreatedBy

public String createBy;

@CreatedDate

public Date createDate;

@LastModifiedBy

public String lastModifiedBy;

/**

* 最后更新日期

*/

@LastModifiedDate

public Date lastModifiedDate;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

/**

* 获取单元的名称

*

* @return 必填

*/

public String getName() {

return name;

}

/**

*

*

* @return UUID,不含{}和-

*/

public String getParentId() {

return parentId;

}

public ParentType getParentType() {

return parentType;

}

public String getStationId() {

return stationId;

}

public String getThumbnailId() {

return thumbnailId;

}

public String getCreateBy() {

return createBy;

}

public void setCreateBy(String createBy) {

this.createBy = createBy;

}

public Date getCreateDate() {

return createDate;

}

public void setCreateDate(Date createDate) {

this.createDate = createDate;

}

/**

* 设置单元的名称

*

* @param name

* 必填

*/

public void setName(String name) {

this.name = name;

}

/**

* 设置父单元ID

*

* @param parentId

* UUID,不含{}和-

*/

public void setParentId(String parentId) {

this.parentId = parentId;

}

public String getLastModifiedBy() {

return lastModifiedBy;

}

public void setLastModifiedBy(String lastModifiedBy) {

this.lastModifiedBy = lastModifiedBy;

}

public Date getLastModifiedDate() {

return lastModifiedDate;

}

public void setLastModifiedDate(Date lastModifiedDate) {

this.lastModifiedDate = lastModifiedDate;

}

}

配置文件:

server:

port: 16800

contextPath: /

logging:

config: ./config/logback.xml

spring:

http:

multipart:

enabled: false

datasource:

url : jdbc:mysql://127.0.0.1:3306/db?useUnicode=true&characterEncoding=utf-8

username : root

password : 123456

driverClassName : com.mysql.jdbc.Driver

jpa:

database : MYSQL

show-sql : true

hibernate:

ddl-auto : update

jackson:

serialization:

INDENT_OUTPUT : true

#hibernate:配置了实体类维护数据库表结构的具体行为,update表示当实体类的属性发生变化时,表结构跟着更新,

这里我们也可以取值create,这个create表示启动的时候删除上一次生成的表,并根据实体类重新生成表,

这个时候之前表中的数据就会被清空;还可以取值create-drop,这个表示启动时根据实体类生成表,但是当sessionFactory关闭的时候表会被删除;

validate表示启动时验证实体类和数据表是否一致;none表示啥都不做。

#show-sql表示hibernate在操作的时候在控制台打印真实的sql语句

#jackson表示格式化输出的json字符串


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:详解html
下一篇:驱动接口开发(网络接口驱动)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~