SpringBoot开源项目学习总结

一、实现日期格式数据类型的转换

首先,定义DateConverter实现Converter<String, Date>接口:

 1 package com.stevlu.common;
 2
 3 import org.springframework.core.convert.converter.Converter;
 4
 5 import java.text.ParseException;
 6 import java.text.SimpleDateFormat;
 7 import java.util.Date;
 8
 9 /**
10  * Created by Steven Lu on 2018/11/21.
11  */
12 public class DateConverter implements Converter<String, Date> {
13     private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
14
15     @Override
16     public Date convert(String s) {
17         if ("".equals(s) || s == null) {
18             return null;
19         }
20         try {
21             return simpleDateFormat.parse(s);
22         } catch (ParseException e) {
23             e.printStackTrace();
24         }
25         return null;
26     }
27 }

然后,在一个JAVA配置类中将该转换器注册进去:

 1 package com.stevlu.config;
 2
 3 import org.springframework.context.annotation.Bean;
 4 import org.springframework.context.annotation.Configuration;
 5 import org.springframework.format.FormatterRegistry;
 6 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
 7
 8 import com.stevlu.common.DateConverter;
 9
10 import java.util.concurrent.ExecutorService;
11 import java.util.concurrent.Executors;
12
13 /**
14  * Created by Steven Lu on 2018/11/21.
15  */
16 @Configuration
17 public class WebMvcConfig extends WebMvcConfigurerAdapter {
18     @Override
19     public void addFormatters(FormatterRegistry registry) {
20         registry.addConverter(new DateConverter());
21     }
22
23     @Bean
24     public ExecutorService executorService() {
25         return Executors.newCachedThreadPool();
26     }
27 }

这样就在SpringBoot项目中实现了字符串类型数据转换成日期类型数据的功能。



二、项目开发思路思考

1、首先,可以在项目中定义需要使用到的pojo对象,以此来实现与数据库的对象关系映射,需要注意的对象中的属性最好能与数据库中的字段名称保持一致,如下图所示:

  1 package com.stevlu.bean;
  2
  3 import com.fasterxml.jackson.annotation.JsonIgnore;
  4 import org.springframework.security.core.GrantedAuthority;
  5 import org.springframework.security.core.authority.SimpleGrantedAuthority;
  6 import org.springframework.security.core.userdetails.UserDetails;
  7
  8 import java.util.ArrayList;
  9 import java.util.Collection;
 10 import java.util.List;
 11
 12 /**
 13  * Created by Steven Lu on 2018/10/30.
 14  */
 15 public class Hr implements UserDetails {
 16     private Long id;
 17     private String name;
 18     private String phone;
 19     private String email;
 20     private String address;
 21     private boolean enabled;
 22     private String username;
 23     private String password;
 24     private Long dept;
 25     private List<Role> roles;
 26     private String userface;
 27
 28     public String getUserface() {
 29         return userface;
 30     }
 31
 32     public void setUserface(String userface) {
 33         this.userface = userface;
 34     }
 35
 36     public List<Role> getRoles() {
 37         return roles;
 38     }
 39
 40     public void setRoles(List<Role> roles) {
 41         this.roles = roles;
 42     }
 43
 44     public Long getId() {
 45         return id;
 46     }
 47
 48     public void setId(Long id) {
 49         this.id = id;
 50     }
 51
 52     public String getName() {
 53         return name;
 54     }
 55
 56     public void setName(String name) {
 57         this.name = name;
 58     }
 59
 60     public String getPhone() {
 61         return phone;
 62     }
 63
 64     public void setPhone(String phone) {
 65         this.phone = phone;
 66     }
 67
 68     public String getEmail() {
 69         return email;
 70     }
 71
 72     public void setEmail(String email) {
 73         this.email = email;
 74     }
 75
 76     public String getAddress() {
 77         return address;
 78     }
 79
 80     public void setAddress(String address) {
 81         this.address = address;
 82     }
 83
 84     @Override
 85     public boolean isEnabled() {
 86         return enabled;
 87     }
 88
 89     public void setEnabled(boolean enabled) {
 90         this.enabled = enabled;
 91     }
 92
 93     @Override
 94     public String getUsername() {
 95         return username;
 96     }
 97
 98     @JsonIgnore
 99     @Override
100     public boolean isAccountNonExpired() {
101         return true;
102     }
103
104     @JsonIgnore
105     @Override
106     public boolean isAccountNonLocked() {
107         return true;
108     }
109
110     @JsonIgnore
111     @Override
112     public boolean isCredentialsNonExpired() {
113         return true;
114     }
115
116     public void setUsername(String username) {
117         this.username = username;
118     }
119
120     @JsonIgnore
121     @Override
122     public Collection<? extends GrantedAuthority> getAuthorities() {
123         List<GrantedAuthority> authorities = new ArrayList<>();
124         for (Role role : roles) {
125             authorities.add(new SimpleGrantedAuthority(role.getName()));
126         }
127         return authorities;
128     }
129
130     @Override
131     public String getPassword() {
132         return password;
133     }
134
135     public void setPassword(String password) {
136         this.password = password;
137     }
138
139     public Long getDept() {
140         return dept;
141     }
142
143     public void setDept(Long dept) {
144         this.dept = dept;
145     }
146 }

Hr.java

数据库中相应字段

2、然后思考项目中可能用到的数据库相关操作,增删改查,一对多,多对多的联系等。清楚完需要用的操作后,就可以开始编写Mybatis中mapper接口和mapper.xml文件了,详细的mapper.xml文件定义方法见之前的博客。(使用mapper接口的方法,mybatis配置文件会自动帮我们生成接口的实现类)

  1 <?xml version="1.0" encoding="UTF-8" ?>
  2 <!DOCTYPE mapper
  3         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5 <mapper namespace="com.stevlu.mapper.HrMapper">
  6     <resultMap id="BaseResultMap" type="com.stevlu.bean.Hr">
  7         <id column="id" property="id"/>
  8         <result column="name" property="name"/>
  9         <result column="phone" property="phone"/>
 10         <result column="email" property="email"/>
 11         <result column="address" property="address"/>
 12         <result column="enabled" property="enabled"/>
 13         <result column="username" property="username"/>
 14         <result column="password" property="password"/>
 15         <result column="userface" property="userface"/>
 16         <result column="dept" property="dept"/>
 17     </resultMap>
 18     <resultMap id="lazyLoadRoles" type="com.stevlu.bean.Hr" extends="BaseResultMap">
 19         <collection property="roles" ofType="com.stevlu.bean.Role" select="com.stevlu.mapper.HrMapper.getRolesByHrId"
 20                     column="id"></collection>
 21     </resultMap>
 22     <resultMap id="eagerLoadRoles" type="com.stevlu.bean.Hr" extends="BaseResultMap">
 23         <collection property="roles" ofType="com.stevlu.bean.Role">
 24             <id property="id" column="rid"/>
 25             <result property="name" column="rname"/>
 26             <result property="nameZh" column="rnameZh"/>
 27         </collection>
 28     </resultMap>
 29     <select id="loadUserByUsername" resultMap="lazyLoadRoles">
 30         select * from tkt_hr WHERE username=#{username}
 31     </select>
 32     <select id="getRolesByHrId" resultType="com.stevlu.bean.Role">
 33         SELECT r.* FROM tkt_hr_role h, tkt_role r where h.rid=r.id AND h.hrid=#{id}
 34     </select>
 35     <insert id="hrReg">
 36         INSERT INTO tkt_hr set username=#{username},password=#{password}
 37     </insert>
 38     <update id="hrUpdatep" parameterType="com.stevlu.bean.Hr">
 39         update tkt_hr
 40         <set>
 41             <if test="password != null">
 42                 password = #{password,jdbcType=VARCHAR},
 43             </if>
 44         </set>
 45         where username = #{username}
 46     </update>
 47     <select id="getHrsByKeywords" resultMap="eagerLoadRoles">
 48         select h.*, r.id as rid, r.name as rname, r.nameZh as rnameZh from tkt_hr h
 49             left join tkt_hr_role h_r on h.id = h_r.hrid
 50             left join tkt_role r on h_r.rid = r.id
 51         where h.id not in
 52             (select h_r.hrid from tkt_hr_role h_r, tkt_role r where h_r.rid = r.id and r.nameZh = ‘系统管理员‘)
 53         <if test="keywords!=‘all‘ and keywords!=‘‘">
 54             and h.username like ‘%‘ || #{keywords} ||‘%‘
 55         </if>
 56         order by h.id
 57     </select>
 58     <select id="getHrById" resultMap="eagerLoadRoles">
 59         select h.*,r.id AS rid,r.name AS rname,r.nameZh AS rnameZh from ((tkt_hr h left join tkt_hr_role
 60         h_r on ((h.id = h_r.hrid))) left join tkt_role r on ((h_r.rid = r.id))) where h.id=#{hrId}
 61     </select>
 62     <update id="updateHr" parameterType="com.stevlu.bean.Hr">
 63         update tkt_hr
 64         <set>
 65             <if test="name != null">
 66                 name = #{name,jdbcType=VARCHAR},
 67             </if>
 68             <if test="phone != null">
 69                 phone = #{phone,jdbcType=CHAR},
 70             </if>
 71             <if test="email != null">
 72                 email = #{email,jdbcType=VARCHAR},
 73             </if>
 74             <if test="address != null">
 75                 address = #{address,jdbcType=VARCHAR},
 76             </if>
 77             <if test="enabled != null">
 78                 enabled = #{enabled,jdbcType=BIT},
 79             </if>
 80             <if test="username != null">
 81                 username = #{username,jdbcType=VARCHAR},
 82             </if>
 83             <if test="password != null">
 84                 password = #{password,jdbcType=VARCHAR},
 85             </if>
 86             <if test="userface != null">
 87                 userface = #{userface,jdbcType=VARCHAR},
 88             </if>
 89             <if test="dept != null">
 90                 dept = #{dept,jdbcType=INTEGER},
 91             </if>
 92         </set>
 93         where id = #{id}
 94     </update>
 95     <update id="updateHrDept" parameterType="com.stevlu.bean.Hr">
 96         update tkt_hr
 97         <set>
 98             <if test="dept != null">
 99                 dept = #{dept,jdbcType=INTEGER},
100             </if>
101         </set>
102         where id = #{id}
103     </update>
104     <update id="updateHrPhone" parameterType="com.stevlu.bean.Hr">
105         update tkt_hr
106         <set>
107             <if test="phone != null">
108                 phone = #{phone,jdbcType=INTEGER},
109             </if>
110         </set>
111         where id = #{id}
112     </update>
113     <update id="updateHrEmail" parameterType="com.stevlu.bean.Hr">
114         update tkt_hr
115         <set>
116             <if test="email != null">
117                 email = #{email,jdbcType=VARCHAR},
118             </if>
119         </set>
120         where id = #{id}
121     </update>
122     <update id="updateHrUsername" parameterType="com.stevlu.bean.Hr">
123         update tkt_hr
124         <set>
125             <if test="username != null">
126                 username = #{username,jdbcType=VARCHAR},
127             </if>
128         </set>
129         where id = #{id}
130     </update>
131     <update id="updateHrName" parameterType="com.stevlu.bean.Hr">
132         update tkt_hr
133         <set>
134             <if test="name != null">
135                 name = #{name,jdbcType=VARCHAR},
136             </if>
137         </set>
138         where id = #{id}
139     </update>
140     <delete id="deleteRoleByHrId" parameterType="Long">
141         DELETE FROM tkt_hr_role where hrid=#{hrId}
142     </delete>
143     <insert id="addRolesForHr">
144         INSERT INTO tkt_hr_role(id,hrid,rid) select SEQ_TKT_HR_ROLE_NEWID.NEXTVAL, tmp.* from (
145         <foreach collection="rids" separator="union all" item="rid">
146             select #{hrId}, #{rid} from dual
147         </foreach>
148         ) tmp
149     </insert>
150     <delete id="deleteHr" parameterType="Long">
151         DELETE FROM tkt_hr WHERE id=#{hrId}
152     </delete>
153     <select id="getAllHr" resultType="com.stevlu.bean.Hr">
154         select * from tkt_hr
155         <if test="currentId!=null">
156             WHERE id !=#{currentId}
157         </if>
158     </select>
159 </mapper>

 1 package com.stevlu.mapper;
 2
 3 import org.apache.ibatis.annotations.Param;
 4
 5 import com.stevlu.bean.Hr;
 6 import com.stevlu.bean.Role;
 7
 8 import java.util.List;
 9
10 /**
11  * Created by Steven Lu on 2018/10/30.
12  */
13 public interface HrMapper {
14     Hr loadUserByUsername(String username);
15
16     List<Role> getRolesByHrId(Long id);
17
18     int hrReg(@Param("username") String username, @Param("password") String password);
19
20     int hrUpdatep(@Param("username") String username, @Param("password") String password);
21
22     List<Hr> getHrsByKeywords(@Param("keywords") String keywords);
23
24     int updateHr(Hr hr);
25
26     int updateHrDept(Hr hr);
27
28     int updateHrPhone(Hr hr);
29
30     int updateHrEmail(Hr hr);
31
32     int updateHrUsername(Hr hr);
33
34     int updateHrName(Hr hr);
35
36     int deleteRoleByHrId(Long hrId);
37
38     int addRolesForHr(@Param("hrId") Long hrId, @Param("rids") Long[] rids);
39
40     Hr getHrById(Long hrId);
41
42     int deleteHr(Long hrId);
43
44     List<Hr> getAllHr(@Param("currentId") Long currentId);
45 }

要想让配置的mapper文件和mapper接口生效,需要在配置类中加上包扫描的注解,当然在全局配置文件中也可以设置。

package com.stevlu;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.stevlu.mapper")
public class WebSocketServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(WebSocketServerApplication.class, args);
    }
}



3、操作数据库的mapper接口定义完成之后,我们就可以在service层调用定义好的mapper接口。(service层可以对传经来的参数进行一些处理)

  1 package com.stevlu.service;
  2
  3 import org.springframework.beans.factory.annotation.Autowired;
  4 import org.springframework.security.core.userdetails.UserDetails;
  5 import org.springframework.security.core.userdetails.UserDetailsService;
  6 import org.springframework.security.core.userdetails.UsernameNotFoundException;
  7 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  8 import org.springframework.stereotype.Service;
  9 import org.springframework.transaction.annotation.Transactional;
 10
 11 import com.stevlu.bean.Hr;
 12 import com.stevlu.common.HrUtils;
 13 import com.stevlu.mapper.HrMapper;
 14
 15 import java.util.List;
 16
 17 /**
 18  * Created by Steven Lu on 2018/10/30.
 19  */
 20 @Service
 21 @Transactional
 22 public class HrService implements UserDetailsService {
 23
 24     @Autowired
 25     HrMapper hrMapper;
 26
 27     @Override
 28     public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
 29         Hr hr = hrMapper.loadUserByUsername(s);
 30         if (hr == null) {
 31             throw new UsernameNotFoundException("用户名不对");
 32         }
 33         return hr;
 34     }
 35
 36     public int hrReg(String username, String password) {
 37         // 如果用户名存在,返回错误
 38         if (hrMapper.loadUserByUsername(username) != null) {
 39             return -1;
 40         }
 41         BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
 42         String encode = encoder.encode(password);
 43         return hrMapper.hrReg(username, encode);
 44     }
 45
 46     public int hrUpdatep(String username, String oldPassword, String newPassword, String encodedPassword) {
 47         // 如果旧密码错误,返回错误
 48         BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
 49         if (encoder.matches(oldPassword, encodedPassword)) {
 50             String encode = encoder.encode(newPassword);
 51             return hrMapper.hrUpdatep(username, encode);
 52         } else {
 53             return -1;
 54         }
 55     }
 56
 57     public List<Hr> getHrsByKeywords(String keywords) {
 58         return hrMapper.getHrsByKeywords(keywords);
 59     }
 60
 61     public int updateHr(Hr hr) {
 62         return hrMapper.updateHr(hr);
 63     }
 64
 65     public int updateHrDept(Hr hr) {
 66         return hrMapper.updateHrDept(hr);
 67     }
 68
 69     public int updateHrPhone(Hr hr) {
 70         return hrMapper.updateHrPhone(hr);
 71     }
 72
 73     public int updateHrEmail(Hr hr) {
 74         return hrMapper.updateHrEmail(hr);
 75     }
 76
 77     public int updateHrUsername(Hr hr) {
 78         return hrMapper.updateHrUsername(hr);
 79     }
 80
 81     public int updateHrName(Hr hr) {
 82         return hrMapper.updateHrName(hr);
 83     }
 84
 85     public int updateHrRoles(Long hrId, Long[] rids) {
 86         int i = hrMapper.deleteRoleByHrId(hrId);
 87         return hrMapper.addRolesForHr(hrId, rids);
 88     }
 89
 90     public Hr getHrById(Long hrId) {
 91         return hrMapper.getHrById(hrId);
 92     }
 93
 94     public int deleteHr(Long hrId) {
 95         return hrMapper.deleteHr(hrId);
 96     }
 97
 98     public List<Hr> getAllHrExceptAdmin() {
 99         return hrMapper.getAllHr(HrUtils.getCurrentHr().getId());
100     }
101
102     public List<Hr> getAllHr() {
103         return hrMapper.getAllHr(null);
104     }
105 }



4、编写controller层,用于实现url请求的映射,由于项目是RESTful风格的,所以要注意url路径设计的技巧,以及HTTP请求的类型是什么,一般为(get查询,post增加,delete删除,put更新)

示例代码;

  1 package com.stevlu.controller;
  2
  3 import org.springframework.beans.factory.annotation.Autowired;
  4 import org.springframework.web.bind.annotation.PathVariable;
  5 import org.springframework.web.bind.annotation.RequestMapping;
  6 import org.springframework.web.bind.annotation.RequestMethod;
  7 import org.springframework.web.bind.annotation.RestController;
  8
  9 import com.stevlu.bean.*;
 10 import com.stevlu.service.*;
 11
 12 import java.util.HashMap;
 13 import java.util.List;
 14 import java.util.Map;
 15
 16 /**
 17  * Created by Steven Lu on 2018/11/21.
 18  */
 19 @RestController
 20 @RequestMapping("/system/basic")
 21 public class SystemBasicController {
 22     @Autowired
 23     RoleService roleService;
 24     @Autowired
 25     MenuService menuService;
 26     @Autowired
 27     MenuRoleService menuRoleService;
 28     @Autowired
 29     DepartmentService departmentService;
 30     @Autowired
 31     PositionService positionService;
 32     @Autowired
 33     JobLevelService jobLevelService;
 34     @Autowired
 35     TicketService ticketService;
 36
 37     @RequestMapping(value = "/role/{rid}", method = RequestMethod.DELETE)
 38     public RespBean deleteRole(@PathVariable Long rid) {
 39         if (roleService.deleteRoleById(rid) == 1) {
 40             return new RespBean("success", "删除成功!");
 41         }
 42         return new RespBean("error", "删除失败!");
 43     }
 44
 45     @RequestMapping(value = "/addRole", method = RequestMethod.POST)
 46     public RespBean addNewRole(String role, String roleZh) {
 47         if (roleService.addNewRole(role, roleZh) == 1) {
 48             return new RespBean("success", "添加成功!");
 49         }
 50         return new RespBean("error", "添加失败!");
 51     }
 52
 53     @RequestMapping(value = "/menuTree/{rid}", method = RequestMethod.GET)
 54     public Map<String, Object> menuTree(@PathVariable Long rid) {
 55         Map<String, Object> map = new HashMap<>();
 56         List<Menu> menus = menuService.menuTree();
 57         map.put("menus", menus);
 58         List<Long> selMids = menuService.getMenusByRid(rid);
 59         map.put("mids", selMids);
 60         return map;
 61     }
 62
 63     @RequestMapping(value = "/updateMenuRole", method = RequestMethod.PUT)
 64     public RespBean updateMenuRole(Long rid, Long[] mids) {
 65         if (menuRoleService.updateMenuRole(rid, mids) == mids.length) {
 66             return new RespBean("success", "更新成功!");
 67         }
 68         return new RespBean("error", "更新失败!");
 69     }
 70
 71     @RequestMapping("/roles")
 72     public List<Role> allRoles() {
 73         return roleService.roles();
 74     }
 75
 76     @RequestMapping(value = "/dep", method = RequestMethod.POST)
 77     public Map<String, Object> addDep(Department department) {
 78         Map<String, Object> map = new HashMap<>();
 79         int result = departmentService.addDep(department);
 80         if (result >= 1) {
 81             map.put("status", "success");
 82             map.put("msg", department);
 83             return map;
 84         }
 85         map.put("status", "error");
 86         map.put("msg", "添加失败!");
 87         return map;
 88     }
 89
 90     @RequestMapping(value = "/dep/{did}", method = RequestMethod.DELETE)
 91     public RespBean deleteDep(@PathVariable Long did) {
 92         int result = departmentService.deleteDep(did);
 93         if (result > 0) {
 94             return new RespBean("success", "删除成功!");
 95         } else if (result == -1) {
 96             return new RespBean("error", "部门正被员工使用,取消关联前无法删除!");
 97         }
 98         return new RespBean("error", "删除失败!");
 99     }
100
101     @RequestMapping(value = "/dep/{pid}", method = RequestMethod.GET)
102     public List<Department> getDepByPid(@PathVariable Long pid) {
103         return departmentService.getDepByPid(pid);
104     }
105
106     @RequestMapping(value = "/deps", method = RequestMethod.GET)
107     public List<Department> getAllDeps() {
108         return departmentService.getAllDeps();
109     }
110
111     @RequestMapping(value = "/position", method = RequestMethod.POST)
112     public RespBean addPos(Position pos) {
113         int result = positionService.addPos(pos);
114         if (result == 1) {
115             return new RespBean("success", "添加成功!");
116         } else if (result == -1) {
117             return new RespBean("error", "职位名重复,添加失败!");
118         }
119         return new RespBean("error", "添加失败!");
120     }
121
122     @RequestMapping(value = "/positions", method = RequestMethod.GET)
123     public List<Position> getAllPos() {
124         return positionService.getAllPos();
125     }
126
127     @RequestMapping("/position/{pids}")
128     public RespBean deletePosById(@PathVariable String pids) {
129         if (positionService.deletePosById(pids)) {
130             return new RespBean("success", "删除成功!");
131         }
132         return new RespBean("error", "删除失败!");
133     }
134
135     @RequestMapping(value = "/position", method = RequestMethod.PUT)
136     public RespBean updatePosById(Position position) {
137         if (positionService.updatePosById(position) == 1) {
138             return new RespBean("success", "修改成功!");
139         }
140         return new RespBean("error", "修改失败!");
141     }
142
143     @RequestMapping(value = "/joblevel", method = RequestMethod.POST)
144     public RespBean addJobLevel(JobLevel jobLevel) {
145         int result = jobLevelService.addJobLevel(jobLevel);
146         if (result == 1) {
147             return new RespBean("success", "添加成功!");
148         } else if (result == -1) {
149             return new RespBean("error", "职称名重复,添加失败!");
150         }
151         return new RespBean("error", "添加失败!");
152     }
153
154     @RequestMapping(value = "/joblevels", method = RequestMethod.GET)
155     public List<JobLevel> getAllJobLevels() {
156         return jobLevelService.getAllJobLevels();
157     }
158
159     @RequestMapping(value = "/joblevel/{ids}", method = RequestMethod.DELETE)
160     public RespBean deleteJobLevelById(@PathVariable String ids) {
161         if (jobLevelService.deleteJobLevelById(ids)) {
162             return new RespBean("success", "删除成功!");
163         }
164         return new RespBean("error", "删除失败!");
165     }
166
167     @RequestMapping(value = "/joblevel", method = RequestMethod.PUT)
168     public RespBean updateJobLevel(JobLevel jobLevel) {
169         if (jobLevelService.updateJobLevel(jobLevel) == 1) {
170             return new RespBean("success", "修改成功!");
171         }
172         return new RespBean("error", "修改失败!");
173     }
174 }



最后不要忘记在application.properties文件中配置数据库的连接属性,mybatis配置文件所在的路径等相关配置。

# EMBEDDED SERVER CONFIGURATION (ServerProperties)
server.port=8082
server.session-timeout=1800
server.context-path=
server.tomcat.max-threads=0
server.tomcat.uri-encoding=UTF-8
server.tomcat.basedir=target/tomcat

# HTTP encoding (HttpEncodingProperties)
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true

#datasource
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/travel?serverTimezone=UTC&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root
#spring.datasource.url=jdbc:oracle:thin:@//192.168.103.235:1521/taf
#spring.datasource.username=elite_ynj
#spring.datasource.password=EYuc1809#
mybatis.config-location=classpath:/mybatis-config.xml

该工程一个完整的目录结构如下:

原文地址:https://www.cnblogs.com/ustc-anmin/p/10533459.html

时间: 2024-11-08 21:54:07

SpringBoot开源项目学习总结的相关文章

转:从开源项目学习 C 语言基本的编码规则

从开源项目学习 C 语言基本的编码规则 每个项目都有自己的风格指南:一组有关怎样为那个项目编码约定.一些经理选择基本的编码规则,另一些经理则更偏好非常高级的规则,对许多项目而言则没有特定的编码规则,项目中的每个开发者使用他自己的风格. 所有代码都保持一致风格的大型库,更容易让人理解. 有许多资源是关于能让人采取的更好的编码规则的,我们可以通过以下方式学到好的编码规则: 阅读书或杂志 浏览网站 与同事交流 参加培训 另一个更有趣的方法是通过研究一个成熟的知名开源项目来得知其开发者是怎样编写代码的.

android开源项目学习

FBReaderJ FBReaderJ用于Android平台的电子书阅读器,它支持多种电子书籍格式包括:oeb.ePub和fb2.此外还支持直接读取zip.tar和gzip等压缩文档. 项目地址:http://www.fbreader.org/FBReaderJ/ Angle Angle是一款专为Android平台设计的,适合快速开发的2D游戏引擎,基于OpenGL ES技术开发.该引擎全部用Java代码编写,并且可以根据自己的需要替换里面的实现. 项目地址:http://code.google

ASP.NET MVC 开源项目学习之ProDinner (二)

下面我们来看第二层:Data   这一层相对来说是对Core层的具体实现了. 从命名可以看出来,这和数据库相关. 1.Db.cs CodeFirst模式的本地数据库类,继承了DbContext. protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Dinner>().HasMany(r => r.Meals).WithMany(o => o.Dinner

NumberProgressBar开源项目学习

1.概述 多看多学涨姿势, github真是个宝库 这个项目主要是实现数字进度条效果 github地址在https://github.com/daimajia/NumberProgressBar 感谢开源作者! 梳理主要知识点: [1]熟悉自定义view的流程 [2]实现原理 [3]android中的view坐标系使用 [4]onMeasure优雅的方法书写 [5]canvas中drawText方法注意点 [6]代码的可读性非常强 2.项目要点分析 [熟悉自定义view的流程] 自定义view需

ASP.NET MVC 开源项目学习之ProDinner (一)

首先在github上面将ProDinner项目通过 Git Bash 克隆到本地,接下来我们开始分析这个项目吧~ 系统采用.Net 4.5, Asp.net Mvc 5,VS2012,Sql server,系统的整体设计非常轻量级,却做到了整体架构分层明显,模块耦合度低的架构思想,很适合新手学习. Core层实现了本地化Model和EF模型化需要的model数据,另外,Core层还为低耦合的业务逻辑和低耦合的数据访问做好了接口准备. 1.Model: 以下是表关系的大致内容: 我们在分析数据库表

java开源项目学习

http://jeecg-boot.mydoc.io/ 在线文档已切换至新地址: http://doc.jeecg.com Jeecg-Boot 是一款基于SpringBoot+代码生成器的快速开发平台!采用前后端分离架构:SpringBoot,Mybatis,Shiro,JWT,Vue&Ant Design.强大的代码生成器让前端和后台代码一键生成,不需要写任何代码,保持jeecg一贯的强大,绝对是全栈开发福音!! JeecgBoot在提高UI能力的同时,降低了前后分离的开发成本,JeecgB

ASP.NET MVC 开源项目学习之ProDinner (三)

第四层:Resources   这一层里面主要是几个资源文件. 资源文件知识小杂烩: 几乎每一个生产性应用程序都需要使用资源.资源是在逻辑上由应用程序部署的任何非可执行数据.资源可以在应用程序中作为错误信息显示,或者作为用户 界面的一部分显示.资源可以包含多种形式的数据,包括字符串.图像和持久的对象.通过在资源文件中存储数据,无需重新编译整个应用程序即可更改数据.在.net中,有文本文件.resx 文件和 .resources 文件三种资源文件.如果资源将只包含字符串数据,则文本文件是最简单的选

Jetsever开源项目学习(五)Concurrent学习

首先梳理一下整体的架构,总的来说就是一个生产—消费者的形式,建立在Executor framework上: 1.每一个Lane包含一个名字string和线程池(ExecutorService),线程池其实就相当于worker集合2.每一个Lane有一个计数器(AtomicInteger),用来记录进入这个Lane的session的数量,session集合其实就相当于相当于任务队列3.每一个GameRoom属于一个Lane(也就是一个Lane中可以有多个GameRoom).每当添加一个新的sess

Jetsever开源项目学习(三)Session学习

package org.menacheri.jetserver.app; import java.util.List; import org.menacheri.jetserver.communication.MessageSender; import org.menacheri.jetserver.communication.MessageSender.Fast; import org.menacheri.jetserver.communication.MessageSender.Reliab