本文需要参考前文:【从无到有】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
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
一、名词解释
二、下载安装配置 MySQL
三、正文
1、数据库、依赖
2、构建目录结构
3、配置 spring、mybatis
4、构建实体类、Mapper、MySQL
5、使用构建的 Mapper
6、前端部分
四、测试
MySQL:是一个关系型数据库管理系统。
JDBC:是 Java 提供的一个操作数据库的 API。
MyBatis:是一个支持普通SQL查询,存储过程 和高级映射 的优秀持久层框架。MyBatis 是对 JDBC 的封装。
软件下载安装过程请自行学习,此处仅说明:
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 文件中添加依赖,在
jackson 相关依赖是方便前端后台数据交互,
mysql:mysql-connector-java 相关依赖是 JDBC 核心,
mybatis 相关依赖是跟 Mapper.xml 有关,
mybatis spring 相关依赖是跟在 spring 中配置 mybatis 有关,
c3p0 相关依赖是跟数据池有关。
(具体干嘛用的请自行学习)具体代码如下:
com.fasterxml.jackson.core
jackson-core
2.9.8
com.fasterxml.jackson.core
jackson-annotations
2.9.8
com.fasterxml.jackson.core
jackson-databind
2.9.8
mysql
mysql-connector-java
8.0.16
org.mybatis
mybatis
3.5.1
org.mybatis
mybatis-spring
2.0.1
com.mchange
c3p0
0.9.5.4
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 findUsers(@Param("loginName") String loginName, @Param("password") String password);
}
11、在 resources/mapper 文件夹中写一个 UserMapper.xml 文件,代码如下。
说明: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 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" %>
Title
Hello World
登录
注:我用了 ECMA Script 6 语法,IDEA默认使用的是 ECMA Script 5 语法,因此,这个代码会报错,如下图。
按 Ctrl + Alt + S 打开 Settings,搜索 ECMA,点击最后一个“JavaScript”,右侧改为 ECMAScript 6。
说明:前端代码的意思就是将两个 input 里面的值通过 ajax 发送给后台,看如下示意图,看不懂建议你学一下html、ajax。
1、先回顾一下数据库数据。
2、我们运行一下。先故意输错一个,用户名为“admin”,我们数据库中没有用户名为“admin”的数据。
3、输入正确的试一下。
同时控制台也打印了信息。