亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

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

2024-07-13 10:17:03
字體:
來源:轉載
供稿:網友

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

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

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

 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent>  <dependencies>  <dependency>  <groupId>javax.servlet</groupId>  <artifactId>javax.servlet-api</artifactId>  <scope>provided</scope><!-- 編譯需要而發布不需要的jar包 -->  </dependency>   <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-webmvc</artifactId>  </dependency>   <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--jpa的jar包 ,操作數據庫的--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>  <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>  <!--mysql驅動--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency>  <groupId>org.apache.shiro</groupId>  <artifactId>shiro-core</artifactId>  <version>1.2.2</version>  </dependency>  <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.2.2</version> </dependency> <!-- shiro ehcache --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-ehcache</artifactId> <version>1.2.2</version> </dependency> </dependencies> <build>  <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> <finalName>name</finalName> </build>

2、以上代碼引入了spring boot。spring mvc 和jpa,以及mysql數據庫的驅動jar;

編寫啟動類,并加裝配置文件:

1、啟動類如下:

import org.springframework.boot.SpringApplication;import org.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@EnableJpaAuditingpublic 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 {  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;/** * 預配置 * */@Configurationpublic 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<User> queryAll();  @RequestMapping(value="/query/byName",method={RequestMethod.GET}) public List<User> queryByName(@RequestParam String name);  @RequestMapping(value="/query/byParentId",method={RequestMethod.GET}) public List<User> queryChildren(@RequestParam String parentId); //無參數分頁查詢 @RequestMapping(value="/query/page",method={RequestMethod.GET}) public List<User> 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;@RestControllerpublic 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<User> queryAll() { return _userService.queryAll(); } @Override public List<User> queryByName(String name) { return _userService.findByName(name); } @Override public List<User> queryChildren(String parentId) { return _userService.findByParentId(parentId); } @Override public User getUser(String userId) { return _userService.findById(userId); } @Override public List<User> 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;@Servicepublic class UserService extends BaseService<User>{ @Autowired UserRepository _userRepository; public List<User> findByName(String name){ return _userRepository.findByName(name); }  public List<User> 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<User>{  List<User> findByName(String name); List<User> 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;/** * 一些共有的方法放這里 * */@Transactionalpublic class BaseService<E extends Serializable> { @Autowired BaseRepository<E> _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<E> 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;@NoRepositoryBeanpublic interface BaseRepository<E> extends JpaRepository<E, Serializable>{}

實體類:與數據庫字段相關,需要注意下父類中的注解@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@DynamicUpdatepublic 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<String> roleIds; /** 昵稱??蛇x。 */ 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<String> 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<String> 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;@MappedSuperclasspublic 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字符串

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人手机在线| 性欧美视频videos6一9| 日本欧美爱爱爱| 亚洲精品日韩激情在线电影| 亚洲成人网在线观看| 欧美极品少妇xxxxx| 国产精品免费一区| 国产精品久久久久影院日本| 成人女保姆的销魂服务| 亚洲精品欧美日韩专区| 亚洲免费影视第一页| 久久99国产精品自在自在app| 久久成人18免费网站| 午夜精品久久久久久久99热浪潮| 日韩有码在线电影| 55夜色66夜色国产精品视频| 欧美极品美女视频网站在线观看免费| 国产午夜精品全部视频播放| 国产精品一区二区三区成人| 亚洲美女性生活视频| 欧美激情aaaa| 精品国产91乱高清在线观看| 欧美老妇交乱视频| 成人在线精品视频| 日韩高清电影免费观看完整| 成人福利视频在线观看| 久久精品视频va| 91久久精品国产91久久性色| 成人444kkkk在线观看| 91久久精品美女高潮| 国产99久久精品一区二区| 亚洲精品一区二区久| 久久久国产一区二区| 国产精品视频专区| 最好看的2019年中文视频| 精品国产精品三级精品av网址| 日韩美女激情视频| 91禁国产网站| 欧美韩国理论所午夜片917电影| 日韩国产欧美精品一区二区三区| 欧美日韩国产一区在线| 高清亚洲成在人网站天堂| 一区二区欧美久久| 性日韩欧美在线视频| 亚洲欧美色图片| 亚洲成人999| 国模吧一区二区三区| 久久久久久亚洲精品| 欧美国产视频日韩| 在线视频欧美日韩| 欧美激情视频在线| 成人av.网址在线网站| 欧美色视频日本高清在线观看| 国产精品美女免费视频| 蜜月aⅴ免费一区二区三区| 国产一区二区日韩| 欧美成人午夜视频| 久久国产精品久久久久久| 国产精品com| 91九色蝌蚪国产| 日韩成人激情影院| 社区色欧美激情 | 欧美巨猛xxxx猛交黑人97人| 国产成人精品日本亚洲| 成人黄色av网| 久久久久久91| 日韩av免费网站| 久久久精品国产网站| 一区二区亚洲精品国产| 色妞色视频一区二区三区四区| 青草成人免费视频| 91九色国产在线| 亚洲国产精彩中文乱码av| 日韩美女在线观看| 亚洲国模精品私拍| 国产精品久久不能| 亚洲毛片在线看| 亚洲三级免费看| 在线电影中文日韩| 欧美大尺度激情区在线播放| 国内免费精品永久在线视频| 国产精品第七影院| 国产精品av电影| 欧美午夜精品久久久久久久| 欧美日本精品在线| 性色av一区二区三区在线观看| 国产精品免费一区| 亚洲天堂免费视频| 自拍偷拍亚洲精品| 国产盗摄xxxx视频xxx69| 亚洲护士老师的毛茸茸最新章节| 欧美精品video| 一区二区三区美女xx视频| 色无极影院亚洲| 中文字幕免费精品一区高清| 久久久久久久久亚洲| 国产视频福利一区| 黑人精品xxx一区一二区| 中文字幕亚洲欧美在线| 国产狼人综合免费视频| 日韩av影院在线观看| 亚洲精品中文字幕有码专区| 成人黄色av播放免费| 亚洲一级免费视频| 亚洲成人在线网| 91高清在线免费观看| 亚洲人精选亚洲人成在线| 国产精品自产拍在线观看中文| 国产精品亚洲第一区| 国产精品入口尤物| 欧美激情a∨在线视频播放| 日韩成人av在线播放| 欧美精品久久久久久久免费观看| 成人做爰www免费看视频网站| 国产精品视频区| 久久影视电视剧免费网站| 成人国产亚洲精品a区天堂华泰| 国产精品精品久久久久久| 美女999久久久精品视频| 国产精品久久av| 欧美激情视频三区| 最近2019中文字幕在线高清| 久久久免费av| 亚洲国产成人一区| 欧美亚洲成人免费| 精品久久久久久久久中文字幕| 青青草一区二区| 精品国内自产拍在线观看| 亚洲欧美在线免费| 欧美激情精品久久久久久变态| 日韩电影中文字幕在线| 91精品国产成人www| 97在线视频精品| 国产日韩av高清| 日韩在线资源网| 精品视频在线观看日韩| 欧美一区二区三区精品电影| 国内精品久久久久影院 日本资源| 视频在线观看99| 在线成人免费网站| 国产精品视频网| 日韩精品视频三区| 国产精品aaaa| 日韩美女视频免费在线观看| 欧美精品videos性欧美| 国产精品99一区| 日韩人体视频一二区| 国产精品96久久久久久又黄又硬| 91高清视频免费| 91精品久久久久久| 久久精品国产亚洲| 91九色在线视频| 亚洲天堂男人的天堂| 久久久久在线观看| 国产精品免费在线免费| 亚洲欧美三级伦理| 欧美在线视频一区| 欧美日韩国产影院| 亚洲福利视频在线| 国产亚洲成av人片在线观看桃| 亚洲成人黄色网| 久久久爽爽爽美女图片| 亚洲男人天堂2023| 亚洲男人天堂久|