【从无到有】数据库,IDEA + maven + java web + springMVC + MySql + MyBatis项目搭建

【前言】

本文需要参考前文:【从无到有】IDEA + maven + java web + springMVC + Tomcat 项目搭建

本文主要以 JAVA 代码配置 springMVC,用 xml 配置 MyBatis

本文适用读者:了解 java web 相关知识,了解 ajax 的使用,对 spring 的相关注解,如 @Configuration、@Controller、@Service、@Autowired、@RequestMapping 有过使用经验,了解 SQL 语句。熟读前文【从无到有】IDEA + maven + java web + springMVC + Tomcat 项目搭建

本文对Tomcat只字未提,有关内容请参考前文:【从无到有】IDEA + maven + java web + springMVC + Tomcat 项目搭建

【本文参考文章】

以下文章顺序不分先后。

Idea SpringMVC+Spring+MyBatis+Maven+Tomcat调整

Mybatis和JDBC区别

Mybatis 报错`Parameter '0' not found. Available parameters are [arg1, arg0, param1, param2]`

MySql驱动8.0.11版本的一些使用注意事项

[Spring]Cannot enhance @Configuration bean definition....

@Bean 的用法

【本文涉及软件】

1、Windows 操作系统

2、IntelliJ IDEA 

3、JDK(Java Development Kit)

4、Tomcat

5、MySQL

【IDEA 版本】

IntelliJ IDEA 2019.1.2 (Ultimate Edition)
Build #IU-191.7141.44, built on May 7, 2019
Licensed to ssc

JRE: 1.8.0_202-release-1483-b49 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0

【JDK 版本】

【MySQL 版本】

【目录】

一、名词解释

二、下载安装配置 MySQL

三、正文

1、数据库、依赖

2、构建目录结构

3、配置 spring、mybatis

4、构建实体类、Mapper、MySQL

5、使用构建的 Mapper

6、前端部分

四、测试

【名词解释】

MySQL:是一个关系型数据库管理系统。

JDBC:是 Java 提供的一个操作数据库的 API。

MyBatis:是一个支持普通SQL查询存储过程 高级映射 的优秀持久层框架。MyBatis 是对 JDBC 的封装。

【下载安装配置 MySQL】

软件下载安装过程请自行学习,此处仅说明:

0、数据库登录名为 root,数据库密码为 admin。

1、我们有一个叫 example 的数据库。

2、该数据库里面有一个叫 user 的表。

3、该表有两个字段,loginName 和 password,类型都是 varchar。

4、该表中有两条数据,第一条 loginName 是 example,password 是 123;第二条 loginName 是 test,password 是 admin。

【正文】

〇、搭建项目

1、本文按前文介绍构建一个 java web 项目,采用 java 代码方式配置 springMVC,文件目录结构参考前文

一、数据库、依赖

2、构建数据库,信息详看上一部分。

3、在 pom 文件中添加依赖,在 <dependencies> 标签中增加 <dependency> 标签。

jackson 相关依赖是方便前端后台数据交互,

mysql:mysql-connector-java 相关依赖是 JDBC 核心,

mybatis 相关依赖是跟 Mapper.xml 有关,

mybatis spring 相关依赖是跟在 spring 中配置 mybatis 有关,

c3p0 相关依赖是跟数据池有关。

(具体干嘛用的请自行学习)具体代码如下:

        <!-- jackson -->
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-core</artifactId>
          <version>2.9.8</version>
        </dependency>
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-annotations</artifactId>
          <version>2.9.8</version>
        </dependency>
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.9.8</version>
        </dependency>
        <!--  mysql:mysql-connector-java:8.0.16  -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
        <!--  mybatis  -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.1</version>
        </dependency>
        <!--mybatis spring整合-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.1</version>
        </dependency>
        <!--c3p0-->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.4</version>
        </dependency>

4、在 resources 文件夹中新建文件夹 config,然后在 config 文件夹中新建文件 db.properties,该文件中写如下代码。

jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/example?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
jdbc.username = root
jdbc.password = admin

说明:1)driver:由于 pom 文件中引入的 mysql-connector-java 版本为 8.x ,所以 driver 需要是 com.mysql.cj.jdbc.Driver 而不是 com.mysql.jdbc.Driver,该类下存在和数据库交互的方法。

2)url:localhost 表示访问本地数据库,3306 表示数据库的接口(在安装 MySQL 时可以设置,默认就是3306),example 是数据库的名字,?后面的参数是为了防止后期报错。

3)username 和 password 就是登录数据库的用户名和密码。

4)等号左边的内容不是固定的,只是习惯上大家都这么写,后续读取配置文件会用到。

二、构建目录结构

5、在 java/cn/example 下新建 package “pojo” 、 “mapper” 、 “interfaces” 、 “impl”,后续我们都会用到。

6、在 resources 文件夹中新建文件夹 “mapper”。

三、配置 spring、mybatis

7、在 cn/example/config 中新建一个类 DatabaseProperties.java,代码如下,此处注解 @Value 里面的值与第 4 步的值对应。

package cn.example.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource(value = {"classpath:config/db.properties"})
public class DatabaseProperties {
    @Value(value = "${jdbc.driver}")
    private  String driver;
    @Value(value = "${jdbc.url}")
    private  String url;
    @Value(value = "${jdbc.username}")
    private  String username;
    @Value(value = "${jdbc.password}")
    private  String password;

    public String getDriver() {
        return driver;
    }

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

8、在 cn/example/config 中新建一个类 ApplicationConfig.java,我们注入一些 Bean。

8.1 先在类名上面写两个注解,代码如下。

@MapperScan 注解的作用就是扫描 Mapper 文件。

package cn.example.config;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan(basePackages = "cn.example.mapper")
public class ApplicationConfig {


}

8.2 注入第一个 Bean,代码如下。

因为需要使用到 db.properties 配置文件,所以在入参传入 DatabaseProperties 对象。

具体的各 set 方法的作用,请自行学习。

package cn.example.config;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.beans.PropertyVetoException;

@Configuration
@MapperScan(basePackages = "cn.example.mapper")
public class ApplicationConfig {

    @Bean
    ComboPooledDataSource comboPooledDataSource(DatabaseProperties databaseProperties) throws PropertyVetoException {
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        comboPooledDataSource.setDriverClass(databaseProperties.getDriver());
        comboPooledDataSource.setJdbcUrl(databaseProperties.getUrl());
        comboPooledDataSource.setUser(databaseProperties.getUsername());
        comboPooledDataSource.setPassword(databaseProperties.getPassword());
        comboPooledDataSource.setMaxPoolSize(50);
        comboPooledDataSource.setMinPoolSize(2);
        comboPooledDataSource.setMaxIdleTime(60);
        return comboPooledDataSource;
    }
}

8.3 注入第二个 Bean,代码如下。

一定要确保路径正确,否则会报错文件不存在(is not exist),"classpath:mapper/*.xml" 对应的是第6步创建的文件夹,虽然我们目前还没有在该文件夹下创建 xml 文件。

package cn.example.config;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import java.beans.PropertyVetoException;
import java.io.IOException;

@Configuration
@MapperScan(basePackages = "cn.example.mapper")
public class ApplicationConfig {

    @Bean
    ComboPooledDataSource comboPooledDataSource(DatabaseProperties databaseProperties) throws PropertyVetoException {
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        comboPooledDataSource.setDriverClass(databaseProperties.getDriver());
        comboPooledDataSource.setJdbcUrl(databaseProperties.getUrl());
        comboPooledDataSource.setUser(databaseProperties.getUsername());
        comboPooledDataSource.setPassword(databaseProperties.getPassword());
        comboPooledDataSource.setMaxPoolSize(50);
        comboPooledDataSource.setMinPoolSize(2);
        comboPooledDataSource.setMaxIdleTime(60);
        return comboPooledDataSource;
    }

    @Bean
    SqlSessionFactoryBean sqlSessionFactoryBean(ComboPooledDataSource comboPooledDataSource) throws IOException {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(comboPooledDataSource);
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:mapper/*.xml"));
        return sqlSessionFactoryBean;
    }
}

四、构建实体类、Mapper、MySQL

9、在 cn/example/pojo 中写一个实体类 User,写两个属性,对应数据库的字段。(当然不对应也行,此处先对应,后期再介绍不对应如何处理)

10、在 cn/example/mapper 中写一个接口文件 UserMapper.java,写一个方法来查找 User 表信息,代码如下。

在接口上面写上 @Service,因为我们后续要用这个接口的方法。

因为后续我们要用两个参数的查询语句,因此加上 @Param 注解,这个注解里的字符串很重要,形参名字不重要。

package cn.example.mapper;

import cn.example.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public interface UserMapper {
    List<User> findUsers(@Param("loginName") String loginName, @Param("password") String password);
}

11、在 resources/mapper 文件夹中写一个 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="cn.example.mapper.UserMapper">
    <select id="findUsers" parameterType="string" resultType="cn.example.pojo.User">
        select *
        from user
        where loginName = #{loginName}
          and password = #{password}
    </select>
</mapper>

说明:1)namespace 与 上一步创建的 UserMapper 相对应,需要写全类名。

2)select 标签的 id 与 UserMapper.java 的方法名对应一致。

3)parameterType 表示入参类型,与 UserMapper 的 isExist 方法的入参类型对应一致。(如果入参不全为 String 类型,需要写 parameterMap 标签进行配置)

4)resultType 表示结果类型,因为 UserMapper 的 isExist 方法的返回值类型是 User 类集合,因此这里写 User 的全类名。(第9步中,如果数据库中的字段名和 User 类的属性不一致,则需要写 resultMap 标签进行配置)

5)#{loginName} 和 #{password} 与 UserMapper 的 isExist 方法的入参注解对应一致。

注:如果你写完,或复制完之后发现如下图所示,报红,可以进行如下操作。

1)光标放置报红处,按 Alt + Enter ,或点击左侧的红色小灯泡,然后点击 Configure data source。

2)点击左上角 “+” 加号,然后点击 “MySQL”。

3)然后输入 User:root、Password:admin、Database:example,然后在 URL 后面加上参数
“?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC”

4)点击下方的 Test Connection,可以发现测试成功,如果测试失败请自行查找原因,可以使用它提示的“troubleshooting”。

5)点击 Schemas,会发现什么都没有,稍等一会,弹出提示,输入密码,点击OK。

6)勾选 Current schema 或 example,点击 OK。

7)弹出一个页面,这个页面可以用来写 sql 语句测试的,如下图。

8)该页面可以从右侧的 Database 中找到。

五、使用构建的 Mapper

12、在 cn/example/interfaces 里写一个接口文件 UserService.java,代码如下。

package cn.example.interfaces;

public interface UserService {
    boolean isExist(String loginName, String password);
}

13、在 cn/example/impl 里写一个接口文件 UserServiceImpl.java,代码如下。

package cn.example.impl;

import cn.example.interfaces.UserService;
import cn.example.mapper.UserMapper;
import cn.example.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {
    private UserMapper userMapper;

    @Override
    public boolean isExist(String loginName, String password) {
        List<User> users = userMapper.findUsers(loginName, password);
        for (User user : users) {
            System.out.println("UserServiceImpl文件开始打印");
            System.out.println("loginName: " + user.getLoginName());
            System.out.println("password: " + user.getPassword());
        }
        return users.size() != 0;
    }

    @Autowired
    public void setUserMapper(UserMapper userMapper) {
        this.userMapper = userMapper;
    }
}

说明:1)该类使用到了刚刚注解了 @Service 的 UserMapper 接口,然后该类也需要注解 @Service,因为该类的 isExist 方法也需要在另外的地方调用。

2)正常操作是 isExist 方法直接返回 userMapper.findUsers(loginName, password).size() != 0 即可,此处为了后续演示打印结果。

14、在 cn/example/controller 里新建一个类,我取名为 Request(名字随意,符合 java 语法规范即可),代码如下。(各注解语法、用处不解释了,累了)

package cn.example.controller;

import cn.example.interfaces.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/requestAction")
public class Request {
    private UserService userService;
    
    @RequestMapping("/findUser")
    @ResponseBody
    public boolean findUser(String loginName, String password) {
        return userService.isExist(loginName, password);
    }

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}

六、前端部分

15、后台部分全部完成,开始前端部分。打开 index.jsp,写两个input,写一个div以供点击,引入 jQuery,然后发送请求。代码如下。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Title</title>
    <link rel="stylesheet" type="text/css" href="<c:url value='css/index.css'/>"/>
    <style type="text/css">
        div {
            cursor: pointer;
            border: 1px solid #555;
            background: #ccc;
            padding: 5px;
            width: 100px;
            height: 20px;
            line-height: 20px;
            text-align: center;
        }
    </style>
</head>
<body>
<p>Hello World</p>
<label><span>登录名:</span><input id="loginName" type="text" value="admin"></label>
<label><span>密码:</span><input id="password" type="password" value="admin"></label>
<div id="login" style="">登录</div>
<script type="text/javascript" src="lib/jquery/jquery-3.3.1.js"></script>
<script type="text/javascript">
    $("#login").on("click", () => {
            $.ajax({
                type: "POST",
                url: "${pageContext.request.contextPath}/requestAction/findUser",
                dataType: "json",
                data: {loginName: $("#loginName").val(), password: $("#password").val()},
                async: true,
                success: (data) => {
                    if (data)
                        alert("登陆成功");
                    else
                        alert("登陆失败");
                }
            });
        }
    )
</script>
</body>
</html>

注:我用了 ECMA Script 6 语法,IDEA默认使用的是 ECMA Script 5 语法,因此,这个代码会报错,如下图。

按 Ctrl + Alt + S 打开 Settings,搜索 ECMA,点击最后一个“JavaScript”,右侧改为 ECMAScript 6。

说明:前端代码的意思就是将两个 input 里面的值通过 ajax 发送给后台,看如下示意图,看不懂建议你学一下html、ajax。

【测试】

1、先回顾一下数据库数据。

2、我们运行一下。先故意输错一个,用户名为“admin”,我们数据库中没有用户名为“admin”的数据。

3、输入正确的试一下。

同时控制台也打印了信息。

【开源项目地址】

https://github.com/supsunc/TestDatabase

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值