IDEA Maven+SpringMVC+Mybatis HTML+Ajax MySql Tomcat登录Demo(二)
- 开发工具:IDEA
- 前端技术:HTML+JQuery+Ajax
- 后端技术:Maven+SpringMVC+MyBatis
- 数据库:MySql
本节内容记录了Model数据层面的记录,MyBatis的配置
一、IDEA操作Mysql数据库建表
二、MyBatis的配置
1.配置依赖,在pom.xml中继续增加依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.10.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.10.3</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
2.web.xml增加配置解决中文返回乱码问题:
<!--GET解决需要设置tomcat-->
<!--POST解决中文乱码问题-->
<filter>
<filter-name>characterFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.在resource下配置mybatis-config.xml文件
需注意:
- *配置中解决了驼峰命名转换的问题;
- *property name="url"的配置;
- *可配置多个environment,用方便生产测试的切换。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 根标签 -->
<configuration>
<settings>
<!-- goods_id ==> goodsId 驼峰命名转换 -->
<setting value="true" name="mapUnderscoreToCamelCase"/>
</settings>
<!-- 环境,可以配置多个,default:指定采用哪个环境 -->
<environments default="test">
<!-- id:唯一标识 -->
<environment id="test">
<!-- 事务管理器,JDBC类型的事务管理器 -->
<transactionManager type="JDBC"/>
<!-- 数据源,池类型的数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--&=&-->
<property name="url"
value="jdbc:mysql://127.0.0.1:3306/chenxhtest?useUnicode=true&characterEncoding=UTF-8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
<!--生产-->
<!-- id:唯一标识 -->
<environment id="pro">
<!-- 事务管理器,JDBC类型的事务管理器 -->
<transactionManager type="JDBC"/>
<!-- 数据源,池类型的数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--&=&-->
<property name="url"
value="jdbc:mysql://127.0.0.1:3306/chenxhtest?useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mappers/springmvc_user.xml"/>
</mappers>
</configuration>
4、创建mappers文件夹,配置管理数据操作。
springmvc_user.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="springmvcUser">
<select id="findAll" resultType="com.bruce.chen.entity.SpringmvcUser">
select * from springmvc_user order by id desc
</select>
<select id="findByName" parameterType="String" resultType="com.bruce.chen.entity.SpringmvcUser">
select * from springmvc_user u where u.uname = #{value}
</select>
<select id="findById" parameterType="java.util.Map" resultType="com.bruce.chen.entity.SpringmvcUser">
select * from springmvc_user u where u.id between #{min} and #{max} order by id desc
</select>
<insert id="insertUser" parameterType="com.bruce.chen.entity.SpringmvcUser" useGeneratedKeys="true">
insert into springmvc_user(uname,upwd)
values (#{uname},#{upwd})
<selectKey resultType="Integer" keyProperty="id" order="AFTER">
select last_insert_id()
</selectKey>
</insert>
<update id="update" parameterType="com.bruce.chen.entity.SpringmvcUser">
UPDATE springmvc_user
SET
uname = #{uname},
upwd = #{upwd}
WHERE
id = #{id}
</update>
</mapper>
配置就基本结束了
三、开发数据操作模块并JUNIT测试
1、添加测试Junit4依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
2、创建MyBatisUtils
首先SqlSessionFactory 需要全局唯一,所以Utils使用会更方便。
package com.bruce.chen.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.Reader;
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory = null;
static {
Reader reader = null;
try {
reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
throw new ExceptionInInitializerError(e);
}
}
public static SqlSession openSqlSession() {
//默认SqlSession会自动提交事务数据
//设置false代表关闭自动提交,改为手动提交事务数据
return sqlSessionFactory.openSession(false);
}
public static boolean closeSqlSession(SqlSession sqlSession) {
if (sqlSession != null) {
sqlSession.close();
return true;
}
return false;
}
}
3、创建实体类
3.1对应账户存储数据表实体类SpringmvcUser.java
package com.bruce.chen.entity;
public class SpringmvcUser {
private int id;
private String uname;
private String upwd;
public SpringmvcUser(String uname, String upwd) {
this.uname = uname;
this.upwd = upwd;
}
public SpringmvcUser(int id, String uname, String upwd) {
this.id = id;
this.uname = uname;
this.upwd = upwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpwd() {
return upwd;
}
public void setUpwd(String upwd) {
this.upwd = upwd;
}
@Override
public String toString() {
return "SpringmvcUser{" +
"id=" + id +
", uname='" + uname + '\'' +
", upwd='" + upwd + '\'' +
'}';
}
}
3.2对应前端接口实体类 User.java
package com.bruce.chen.entity;
public class User {
private String uname;
private String upwd;
public User() {
}
public User(String uname, String upwd) {
this.uname = uname;
this.upwd = upwd;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpwd() {
return upwd;
}
public void setUpwd(String upwd) {
this.upwd = upwd;
}
@Override
public String toString() {
return "User{" +
"uname='" + uname + '\'' +
", upwd='" + upwd + '\'' +
'}';
}
}
3.3对应前端交互返回实体类 Response.java
package com.bruce.chen.entity;
public class ResponseData {
private String rescode;
private String resdesc;
private String ext;
public ResponseData() {
}
public ResponseData(String rescode, String resdesc, String ext) {
this.rescode = rescode;
this.resdesc = resdesc;
this.ext = ext;
}
public String getRescode() {
return rescode;
}
public ResponseData setRescode(String rescode) {
this.rescode = rescode;
return this;
}
public String getResdesc() {
return resdesc;
}
public ResponseData setResdesc(String resdesc) {
this.resdesc = resdesc;
return this;
}
public String getExt() {
return ext;
}
public ResponseData setExt(String ext) {
this.ext = ext;
return this;
}
@Override
public String toString() {
return "ResponseData{" +
"rescode='" + rescode + '\'' +
", resdesc='" + resdesc + '\'' +
", ext='" + ext + '\'' +
'}';
}
}
4.单例测试各操作的数据库action
MyMybatisTest .java
package com.bruce.chen.test;
import com.bruce.chen.entity.SpringmvcUser;
import com.bruce.chen.utils.MyBatisUtils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MyMybatisTest {
@Test
public void testSqlSessionFactory() throws IOException {
//读取配置文件
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
//初始化SqlSessionFactory,同事解析mybatis-config.xml
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
System.out.println("加载成功");
//创建SqlSession对象,SqlSession是JDBC扩展类
SqlSession sqlSession = null;
try {
sqlSession = sqlSessionFactory.openSession();
Connection connection = sqlSession.getConnection();
System.out.println(connection);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (sqlSession != null) {
//mybatis-config.xml配置的type不同 close也不同
//type="POOLED" close则将回收到连接池中
//typr="UNPOOLED" close调用底层Connection。close关闭连接
sqlSession.close();
}
}
}
@Test
public void testSession() {
SqlSession sqlSession = null;
try {
sqlSession = MyBatisUtils.openSqlSession();
Connection connection = sqlSession.getConnection();
System.out.println("connection=" + connection);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (sqlSession != null) {
MyBatisUtils.closeSqlSession(sqlSession);
}
}
}
@Test
public void testSelectAllSession() {
SqlSession sqlSession = null;
try {
sqlSession = MyBatisUtils.openSqlSession();
Connection connection = sqlSession.getConnection();
List<SpringmvcUser> datas = sqlSession.selectList("springmvcUser.findAll");
for (SpringmvcUser data : datas) {
System.out.println("datas=" + data.toString());
}
System.out.println("connection=" + connection);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (sqlSession != null) {
MyBatisUtils.closeSqlSession(sqlSession);
}
}
}
@Test
public void testSelectByName(){
SqlSession sqlSession=null;
try {
sqlSession = MyBatisUtils.openSqlSession();
SpringmvcUser springmvcUser = sqlSession.selectOne("springmvcUser.findByName","88");
System.out.println(springmvcUser);
}catch (Exception e){
e.printStackTrace();
}finally {
if(sqlSession!=null){
sqlSession.close();
}
}
}
@Test
public void testSelectByIdBetween(){
SqlSession sqlSession=null;
try {
sqlSession = MyBatisUtils.openSqlSession();
Map<String, String> map = new HashMap<String,String>();
map.put("min","0");
map.put("max","2");
List<SpringmvcUser> springmvcUser = sqlSession.selectList("springmvcUser.findById",map);
for (SpringmvcUser user : springmvcUser) {
System.out.println(user.toString());
}
}catch (Exception e){
e.printStackTrace();
}finally {
if(sqlSession!=null){
sqlSession.close();
}
}
}
@Test
public void testInsertUser(){
SqlSession sqlSession=null;
try {
sqlSession = MyBatisUtils.openSqlSession();
SpringmvcUser user = new SpringmvcUser("88","88");
int num = sqlSession.insert("springmvcUser.insertUser",user);
sqlSession.commit();
System.out.println(num+" id="+user.getId());
}catch (Exception e){
if(sqlSession!=null){
sqlSession.rollback();
}
e.printStackTrace();
}finally {
MyBatisUtils.closeSqlSession(sqlSession);
}
}
@Test
public void updateUser(){
SqlSession sqlSession = null;
try {
sqlSession = MyBatisUtils.openSqlSession();
System.out.println("-------------");
SpringmvcUser user = sqlSession.selectOne("springmvcUser.findById",2);
System.out.println(user.toString());
user.setUpwd("1234567890");
int num = sqlSession.update("springmvcUser.update",user);
System.out.println(num);
System.out.println("-------");
sqlSession.commit();
}catch (Exception e){
sqlSession.rollback();
}finally {
MyBatisUtils.closeSqlSession(sqlSession);
}
}
}
5.创建登录数据查询工具
LoginDataHelper.java
package com.bruce.chen.utils;
import com.bruce.chen.entity.SpringmvcUser;
import com.bruce.chen.entity.User;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class LoginDataHelper {
public static String checkUserName(User user) {
SqlSession sqlSession = null;
SpringmvcUser springmvcUser = null;
try {
sqlSession = MyBatisUtils.openSqlSession();
springmvcUser = sqlSession.selectOne("springmvcUser.findByName", user.getUname());
System.out.println(springmvcUser.toString());
} catch (Exception e) {
sqlSession.rollback();
e.printStackTrace();
} finally {
MyBatisUtils.closeSqlSession(sqlSession);
if (springmvcUser == null) {
return "02";
}
if (springmvcUser.getUpwd().equals(user.getUpwd())) {
return "00";
}
return "01";
}
}
public static boolean registerUser(User user) {
SpringmvcUser user1 = null;
SqlSession session = null;
int num = 0;
try {
session = MyBatisUtils.openSqlSession();
System.out.println(user.getUname()+user.getUpwd());
user1 = new SpringmvcUser(user.getUname(), user.getUpwd());
num = session.insert("springmvcUser.insertUser", user1);
session.commit();
} catch (Exception e) {
session.rollback();
e.printStackTrace();
} finally {
MyBatisUtils.closeSqlSession(session);
if (num == 1) {
return true;
} else {
return false;
}
}
}
public static List<SpringmvcUser> squeryAllUser() {
SqlSession sqlSession = null;
SpringmvcUser springmvcUser = null;
List<SpringmvcUser> list = null;
try {
sqlSession = MyBatisUtils.openSqlSession();
list = sqlSession.selectList("springmvcUser.findAll");
for (SpringmvcUser user : list) {
System.out.println(user.toString());
}
} catch (Exception e) {
sqlSession.rollback();
e.printStackTrace();
} finally {
MyBatisUtils.closeSqlSession(sqlSession);
return list;
}
}
}
6.创建完善各功能控制器
完善loginh.js
$(function () {
$("#register").click(function () {
console.log("注册处理");
var uname = $("#uname").val();
var upwd = $("#upwd").val();
var sendMsg = {
uname: uname,
upwd: upwd
};
console.log("登录处理请求信息:" + JSON.stringify(sendMsg));
$.ajax({
"url": "/ajaxRegister",
"type": "POST",
contentType: "application/json",
"data": JSON.stringify(sendMsg),
"dataType": "json",
"success": function (json) {
console.log("success 返回数据=" + json);
var rescode = json.rescode;
var resdesc = json.resdesc;
if (rescode == 00) {
alert(resdesc);
} else {
alert(rescode + " " + resdesc);
}
},
"error": function (xmlhttp, errorText) {
console.log(xmlhttp);
console.log(typeof xmlhttp.status);
switch (xmlhttp.status) {
case 404:
alert("未找到URL资源");
break;
case 405:
alert("无效请求方式");
break;
case 500:
alert("服务器内部错误");
break;
default:
alert("异常");
break;
}
;
}
});
}),
$("#login").click(function () {
alert("1111111");
var uname = $("#uname").val();
var upwd = $("#upwd").val();
var sendMsg = {
uname: uname,
upwd: upwd
};
console.log("登录处理请求信息:" + JSON.stringify(sendMsg));
$.ajax({
url: "/loginAjax",
type: "POST",
contentType: "application/json",
dataType: "json",
data: JSON.stringify(sendMsg),
success: function (json) {
var resCode = json.rescode;
var resDesc = json.resdesc;
var ext = json.ext;
if (resCode == 00) {
alert("登录成功");
} else {
alert(resCode + resDesc);
}
},
error: function (xmlhttp, errorText) {
}
});
}),
$("#select").click(function () {
console.log("登录处理");
// alert("login");
console.log("查询");
var uname = $("#uname").val();
var upwd = $("#upwd").val();
var sendMsg = {
uname: uname,
upwd: upwd
};
console.log("请求信息:" + JSON.stringify(sendMsg));
$.ajax({
"url": "/ajaxSelect",
"type": "POST",
"contentType": "application/json",
"data": JSON.stringify(sendMsg),
"dataType": "json",
"success": function (json) {
console.log("success 返回数据=" + JSON.stringify(json));
var rescode = json.rescode;
var resdesc = json.resdesc;
var ext = JSON.parse(json.ext);
console.log("success 返回数据=" + ext);
if (rescode == 00) {
alert("查询成功");
var content = "";
for (var i = 0; i < ext.length; i++) {
console.log(ext[i]);
console.log(ext[i].uname);
content += ext[i].id + " ";
content += ext[i].uname + " ";
content += ext[i].upwd + " ";
content += "<br>";
}
$("#content").html(content);
} else {
alert(rescode + resdesc)
}
},
"error": function (xmlhttp, errorText) {
console.log(xmlhttp);
console.log(typeof xmlhttp.status);
switch (xmlhttp.status) {
case 404:
alert("未找到URL资源");
break;
case 405:
alert("无效请求方式");
break;
case 500:
alert("服务器内部错误");
break;
default:
alert("异常");
break;
}
;
}
});
})
})
LoginControl.java
package com.bruce.chen.control;
import com.bruce.chen.entity.ResponseData;
import com.bruce.chen.entity.SpringmvcUser;
import com.bruce.chen.entity.User;
import com.bruce.chen.utils.LoginDataHelper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List;
@Controller
public class LoginControl {
/**
* 设置 请求方式 POST对应PostMapping;GET对应GetMapping
* @return
*/
@ResponseBody
@PostMapping(value = "/loginAjax", produces = {"application/json;charset=UTF-8"})
public ResponseData login(@RequestBody User user, HttpServletResponse response) {
System.out.println(user.toString());
String resCode = LoginDataHelper.checkUserName(user);
System.out.println(resCode);
String resDesc = "";
switch (resCode) {
case "00":
resDesc = "登录成功";
break;
case "01":
resDesc = "密码错误";
break;
case "02":
resDesc = "无此账号,请确认账号填写";
break;
default:
break;
}
return new ResponseData(resCode, resDesc, "");
}
@PostMapping(value = "/loginForm")
@ResponseBody
public String select(User user) {
System.out.println(user.toString());
String resCode = LoginDataHelper.checkUserName(user);
System.out.println(resCode);
String resDesc = "";
switch (resCode) {
case "00":
resDesc = "登录成功";
break;
case "01":
resDesc = "密码错误";
break;
case "02":
resDesc = "无此账号,请确认账号填写";
break;
default:
break;
}
return "登录成功,跳转首页";
}
@GetMapping("/view")
public ModelAndView showView() {
ModelAndView modelAndView = new ModelAndView("/index.html");
return modelAndView;
}
}
SelectControl.java
package com.bruce.chen.control;
import com.bruce.chen.entity.ResponseData;
import com.bruce.chen.entity.SpringmvcUser;
import com.bruce.chen.utils.LoginDataHelper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
public class SelectControl {
private static ObjectMapper MAPPER = new ObjectMapper();
@PostMapping(value = "/fromSelect")
@ResponseBody
public String selctFromBackString() {
List<SpringmvcUser> list = LoginDataHelper.squeryAllUser();
if (list == null) {
return "无数据";
}
StringBuilder stringBuilder = new StringBuilder();
for (SpringmvcUser user : list) {
stringBuilder.append("<h1>" + user.getId() +" "+ user.getUname() +" "+ user.getUpwd()+" " + "</h1>");
}
return stringBuilder.toString();
}
@PostMapping(value = "/ajaxSelect", produces = {"application/json;charset=UTF-8"})
@ResponseBody
public ResponseData selctAjaxBackJson() {
List<SpringmvcUser> list = LoginDataHelper.squeryAllUser();
if (list == null) {
return new ResponseData("er", "无数据", "");
}
try {
System.out.println(new ResponseData("00", "查询成功", MAPPER.writeValueAsString(list)).toString());
return new ResponseData("00", "查询成功", MAPPER.writeValueAsString(list));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return new ResponseData("er", "系统异常", "");
}
}
RegisterControl.java
package com.bruce.chen.control;
import com.bruce.chen.entity.ResponseData;
import com.bruce.chen.entity.User;
import com.bruce.chen.utils.LoginDataHelper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class RegisterControl {
@PostMapping(value = "/fromRegister")
@ResponseBody
public String fromRegisterBackString(User user) {
boolean a =LoginDataHelper.registerUser(user);
if(a){
return user.getUname()+"注册成功";
}
return user.getUname()+"注册失败";
}
@PostMapping(value = "/ajaxRegister", produces = {"application/json;charset=UTF-8"})
@ResponseBody
public ResponseData registerAjaxBackJson(@RequestBody User user) {
boolean a =LoginDataHelper.registerUser(user);
if(a){
return new ResponseData("00", "注册成功", "");
}
return new ResponseData("er", "注册失败", "");
}
}
源码地址:https://github.com/BruceXuheng/MavenSpringMVCMyBatisLoginDemo
一些问题和解答:
1.java.lang.NoClassDefFoundError类报错
答:看下依赖之后是否导入