项目结构
SpringbootApplication
与springboot包同级,主程序类
这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用;
@MapperScan("com.ly.springboot.mapper")
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
配置文件
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ly</groupId>
<artifactId>springboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springboot</name>
<description>Demo project for Spring Boot</description>
<repositories>
<repository>
<!-- 创建私服地址 -->
<id>aliyun</id>
<name>aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--freemarker的依赖包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!--jdbc的依赖包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--thymeleaf的依赖包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<!--mysql的依赖包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--测试单元的依赖包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
<!--阿里Druid数据源引入项目即可-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
<!--配置文件执行器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml
jdbc:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/test
driverClassName: com.mysql.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.ly.springboot.domain
spring:
freemarker:
allow-request-override: false
allow-session-override: false
cache: false
charset: UTF-8
check-template-location: true
content-type: text/html
enabled: true
expose-request-attributes: false
expose-session-attributes: false
expose-spring-macro-helpers: true
prefer-file-system-access: true
suffix: .ftl
template-loader-path: classpath:/templates/
settings:
classic_compatible: true
default_encoding: UTF-8
template_update_delay: 0
config包
配置信息类(config)
JdbcConfig
@Configuration
public class JdbcConfig {
@Bean
@ConfigurationProperties(prefix = "jdbc")
public DataSource dataSource(){
// DruidDataSource dataSource = new DruidDataSource();
// return dataSource;
return new DruidDataSource();
}
}
mapper包
数据接口访问层(Dao)
IUserMapper接口
@Mapper
public interface IUserMapper {
public List<Map<String,Object>> selectUserList();
// public int insertUser(User user);
public int insertUser(Map<String,Object> map);
public int updateUser(Map<String,Object> map);
//根据用户ID查找这个对象
public Map<String,Object> selectUserById(int userId);
public int deleteUser(List<String> list);
}
service包
IUserService接口
数据服务层(Service)
public interface IUserService {
public List<Map<String,Object>> selectUserList();
// public int insertUser(User user);
// public int insertUser(Map<String,Object> map);
//
// public int updateUser(Map<String,Object> map);
//根据用户ID查找这个对象
public Map<String,Object> selectUserById(int userId);
public int insertOrUpdateUser(Map<String,Object> map);
public int deleteUser(List<String> list);
}
UserServiceImpl实现类
数据服务的实现接口(serviceImpl)
service.impl目录下实现IUserService接口
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private IUserMapper userMapper;
@Override
public List<Map<String,Object>> selectUserList() {
return userMapper.selectUserList();
}
// @Override
// public int insertUser(Map<String, Object> map) {
// return userMapper.insertUser(map);
// }
//
// @Override
// public int updateUser(Map<String, Object> map) {
// return userMapper.updateUser(map);
// }
@Override
public Map<String, Object> selectUserById(int userId) {
return userMapper.selectUserById(userId);
}
// @Override
// public int insertUser(User user) {
// return userMapper.insertUser(user);
// }
@Override
public int insertOrUpdateUser(Map<String, Object> map) {
//这里做逻辑判断
//System.out.println("map"+map);
int count=0;
if(map.get("userId")==null||map.get("userId").toString().equals("")){
count=userMapper.insertUser(map);
}else{
count=userMapper.updateUser(map);
}
return count;
}
@Override
public int deleteUser(List<String> list) {
return userMapper.deleteUser(list);
}
}
controller包
前端控制器(Controller)
UserController
@Controller
@Slf4j
public class UserController extends BaseController {
@Autowired
private IUserService userService;
// @RequestMapping("/index")
// public String index(HttpServletRequest request){
System.out.println(userService.selectUserList());
// request.setAttribute("list",userService.selectUserList());
// return "index";
// }
//modeandview方式
@RequestMapping("/index")
public ModelAndView index(){
// System.out.println(userService.selectUserList());
Map<String,Object> map =new HashMap<String, Object>();
map.put("list",userService.selectUserList());
return new ModelAndView("index", map);
}
//实体类的插入or更新操作
@GetMapping("/insertOrupdateUser")
public String insertOrupdateUser(){
return "insertOrupdateUser";
}
// @PostMapping("/insertOrupdateUser")
// //老版
// //@RequestMapping(value = "/insertOrupdateUser",method = RequestMethod.POST)
// public String insertOrupdateUser1(User user){
// //真正意义的插入
// log.info(user.getUserName());
// return "redirect:/index";
// }
@PostMapping("/insertOrupdateUser")
//老版
//@RequestMapping(value = "/insertOrupdateUser",method = RequestMethod.POST)
public String insertOrupdateUser1(@RequestParam Map<String,Object> map){
//真正意义的插入
int count=userService.insertOrUpdateUser(map);
log.info("count" + count);
log.info("map" + map);
return "redirect:/index";
}
@GetMapping("/selectUserById")
//@RequestMapping(value = "/insertOrUpdateUser",method = RequestMethod.POST)
public ModelAndView selectUserById(@RequestParam int userId){
return new ModelAndView("insertOrUpdateUser",userService.selectUserById(userId));
}
@GetMapping("/deleteUser")
//@RequestMapping(value = "/insertOrUpdateUser",method = RequestMethod.POST)
public String deleteUser(@RequestParam String ids){
// List<String> list = new ArrayList<String>();
// list.add("1");
// list.add("2");
// int count = userService.deleteUser(list);
// log.info(ids);
int count = userService.deleteUser(getParamData(ids));
return "redirect:/index";
}
}
resources.mapper
mybatis映射文件
UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ly.springboot.mapper.IUserMapper">
<select id="selectUserList" resultType="map">
select user_id as userId,user_name as userName,user_password as userPassword from tb_user
order by user_id desc;
</select>
<select id="selectUserById" resultType="map" parameterType="int">
select user_id as userId,user_name as userName,user_password as userPassword from tb_user
where user_id=#{userId} order by user_id desc;
</select>
<insert id="insertUser" parameterType="map" keyProperty="user_id" useGeneratedKeys="true">
insert into tb_user (user_name,user_password) values(#{userName},#{userPassword});
</insert>
<update id="updateUser" parameterType="map">
update tb_user
<trim prefix="set" suffixOverrides=",">
<if test="userPassword != null and userPassword!= ''">user_password = #{userPassword},</if>
</trim>
where user_id = #{userId};
</update>
<delete id="deleteUser" parameterType="java.util.List">
delete from tb_user where user_id in
<foreach collection="list" open="(" close=")" separator="," item="item" >
#{item}
</foreach>
</delete>
</mapper>
resources.templates
存放Web页面的模板文件
index.ftl
主页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Index</title>
<script>
//全选和非全选
function chooseAll(){
//取checkbox的第一个元素节点的状态
var box = document.getElementsByName("ids");
if(box[0].checked){
for (var i = 0; i < box.length; i++) {
box[i].checked = true;
}
//开启删除按钮
document.getElementById("btn").disabled = "";
}else {
for (var i = 0; i < box.length; i++) {
box[i].checked = false;
}
//关闭删除按钮
document.getElementById("btn").disabled = "disabled";
}
}
function chooseOne() {
var box = document.getElementsByName("ids");
var result = false;
for (var i = 1; i < box.length; i++) {
if(box[i].checked == false){
result = true;
break;
}
}
if(result){
box[0].checked = false;
//关闭删除按钮
//document.getElementById("btn").disabled = "disabled";
}else{
box[0].checked = true;
//开启删除按钮
//document.getElementById("btn").disabled = "";
}
//判断是否开始删除按钮
var temp = false;
for(var i = 1; i < box.length; i++){
if(box[i].checked){
temp = true;
break;
}
}
if(temp){
document.getElementById("btn").disabled="";
}else{
document.getElementById("btn").disabled="disabled";
}
}
//执行删除的方法,通过confirm询问框
function del(){
var box=document.getElementsByName("ids");
var ids="";
for(var i=1;i<box.length;i++){
if(box[i].checked){
ids+=box[i].value+",";
}
}
if(confirm('你确定要删除id是'+ids+'的数据吗?')){
alert('执行删除');
location.href='deleteUser?ids='+ids;
}else{
alert('您取消了删除的操作!');
}
}
</script>
</head>
<body>
<#if list?? && (list?size > 0) >
<table>
<tr>
<td><input type="checkbox" name="ids" onclick="chooseAll();"></td>
<td>序列号</td>
<td>userId</td>
<td>userName</td>
<td>userPassword</td>
<td>操作</td>
</tr>
<#list list as item>
<tr>
<td><input type="checkbox" name="ids" value="${item.userId}" onclick="chooseOne();"></td>
<td>${item_index+1}</td>
<td>${item.userId}</td>
<td>${item.userName}</td>
<td>${item.userPassword}</td>
<td><a href="selectUserById?userId=${item.userId}">修改</a></td>
</tr>
</#list>
<tr>
<td><a href="insertOrUpdateUser">点击我新增数据</a></td>
<td><input type="button" value="删除" id="btn" disabled="disabled" onclick="del();"></td>
</tr>
</table>
<#else>
暂无数据
</#if>
</body>
</html>
insertOrupdateUser.ftl
增加或修改页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>insertOrupdate</title>
<script>
// console.log('#{userId}');
// console.log('<%=userId%>');
window.onload = function(){
var userId = document.getElementById("userId").value.trim();
if(userId == '' || userId ==null){
document.getElementById("userName").disabled = "";
}else{
document.getElementById("userName").disabled = "disabled";
}
}
</script>
</head>
<body>
增加数据
<!--readonly = "readonly" && disabled ="disabled"-->
<form action="insertOrupdateUser" method="post">
<input type="hidden" name="userId" id="userId" value="${userId}">
<p>userName<input type="text" id="userName" name="userName" value="${userName}"></p>
<p>userPassword<input type="text" id="userPassword" name="userPassword" value="${userPassword}"></p>
<p><input type="submit"></p>
</form>
</body>
</html>