mybatis+vue2前后端分离

目录

后端样例目录结构:

​编辑pom.xml文件

连接数据库信息(mysql): config.properties

全部配置文件:mybatis-config.xml

包装sqlSessionFactory(减少代码耦合)

实体类food:

编写mapper.xml

mapper接口:

完整代码(测试):

后端实例:(前后交叉)

 登录:

vue创建:

前置准备:(安装axios和element组件)

登录页面:

 创建路由:

App.vue文件:(应用程序入口点的 App.vue 组件)

解决跨域问题:

vue.config.js文件下:

后端样例
目录结构:


pom.xml文件
<!--作用:连接池来管理数据库连接-->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.1.22</version>
</dependency>
<!--作用:JDBC驱动程序允许Java程序与MySQL数据库进行交互-->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.32</version>
</dependency>
<!--作用:一个服务器程序(servlet),目的是和浏览器交互并且生成动态的web内容-->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.1.0</version>
  <scope>provided</scope>
</dependency>
<!--作用:数据库交互支持自定义 SQL、存储过程以及高级映射。-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<!--日志输出到标准输出到控制台-->
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>1.7.36</version>
</dependency>
<!--作用:测试类工具提供@Test注解-->
<dependency>
  <groupId>org.junit.jupiter</groupId>
  <artifactId>junit-jupiter-api</artifactId>
  <version>5.9.2</version>
  <scope>test</scope>
</dependency>
<!-- Java 对象和 JSON 字符串之间进行转换-->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>2.0.21.graal</version>
</dependency>
连接数据库信息(mysql): config.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/数据库名?serverTimezone=GMT
username=root
password=1234

全部配置文件:mybatis-config.xml
<?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>
    <!--引入数据库连接信息-->
    <properties resource="config.properties" />
    <!--实体类名与表名转换-->
    <typeAliases>
        <package name="dao"/>
    </typeAliases>

<!--通过上面引入的resource="config.properties"-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--加载某包下所有的映射配置文件-->
    <!--如果没有在 mybatis-config.xml 中引入 UserMapper.xml,那么 MyBatis 将不知道
    UserMapper.xml 文件中定义的任何 SQL 语句,也无法将这些语句与 UserMapper 接口中的方法关联起来。-->
    <mappers>
        <package name="mapper"/>
    </mappers>


</configuration>

包装sqlSessionFactory(减少代码耦合)
private static SqlSessionFactory sqlSessionFactory;

static {
    try {
        String resource = "mybatis/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    } catch (IOException e) {
        throw new RuntimeException(e.getMessage());
    }
}

public static SqlSessionFactory getSqlSessionFactory() {
    return sqlSessionFactory;
}
实体类food:

。。。

编写mapper.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="mapper.FoodMapper"><!--命名空间:用于标识这个Mapper的作用域-->
    <!--列名映射,如果字段不一致-->
    <resultMap id="FoodMap" type="food">
        <id property="foodId" column="food_id"/>
        <result property="foodName" column="food_name"/>
        <result property="foodPrice" column="food_price"/>
        <result property="foodImgUrl" column="food_img_url"/>
    </resultMap>
   <!--id:方法名  resultMap:里面写的上面编写的id-->
    <select id="selectAllFoods" resultMap="FoodMap">
        SELECT food_id,food_name,food_price,food_img_url
        FROM food
    </select>
</mapper>
mapper接口:
public interface FoodMapper {
    // 方法名对应上面.xml里面的id
    List<Food> selectAllFoods();

}

完整代码(测试):

@Test
public void login() throws IOException {
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryUtil().getSqlSessionFactory();
    SqlSession sqlSession = sqlSessionFactory.openSession();

    FoodMapper foodMapper = sqlSession.getMapper(FoodMapper.class);
    List<Food> foods = foodMapper.selectAllFoods();
    System.out.println(foods);
// 如果进行非查询操作,写入数据库需要提交:sqlSession.commit();
    sqlSession.close();
}

后端实例:(前后交叉)

 登录:
@WebServlet("/userLogin")
public class UserLogin extends HttpServlet {
    /*将注册用户信息存入数据库*/
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        // 定义全部变量
        ServletContext servletContext = request.getServletContext();
        // 通过servlet获取前端数据
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        /*密码加密*/
        password = SecureUtil.md5(username+password);
        /*创建session工厂:调用工具类*/
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryUtil().getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        /*获取用户信息*/
        User user = userMapper.checkAccount(username, password);
        HashMap<String, Object> result = new HashMap<>();
        sqlSession.close();
        if(Objects.nonNull(user)){
            result.put("user",user);
            result.put("code",200);
            servletContext.setAttribute("user",user);
        }
        // 设置HTTP响应的内容类型和字符集(这里是用的json相应的)
        response.setContentType("application/json;charset=UTF-8");
        String jsonString = JSON.toJSONString(result);
        // 通过调用response.getWriter()方法,Servlet容器(如Tomcat)提供了一个PrintWriter对         象,该对象可以用于将字符数据写入HTTP响应体中。
        try (PrintWriter out = response.getWriter()) {
            out.println(jsonString);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }


    }
}

vue创建:

找到项目创建的文件夹下:输入cmd打开黑窗口

 

 

前置准备:(安装axios和element组件)

终端输入以下命令

npm install axios 


npm i element-ui  // element一个组件可以选择不添加

main.js(或有时命名为 main.ts 如果项目使用 TypeScript)通常是项目的入口文件。这个文件是构建和启动 Vue 应用程序的起点

import Vue from 'vue'  
import App from './App.vue' 
import router from "@/router/index.js";  //引入路由的index.js 
// 引入element组件
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';

Vue.config.productionTip = false
// 使用element组件
Vue.use(ElementUI); 


new Vue({
  render: h => h(App),
  router:router
}).$mount('#app')


//main.js是程序的入口
登录页面:
<template>
  <div class="login" id="root">
    <form>
      <div class="header">登录</div>
      <div class="container">
        <input type="text" 
          v-model="username" 
          id="username" 
          autocomplete="off" 
          placeholder="请输入用户名"
        />
        <span class="left"></span>
        <span class="right"></span>
        <span class="top"></span>
        <span class="bottom"></span>
      </div>
      <div class="container1">
        <input type="password" v-model="password" id="password" autocomplete="off" placeholder="请输入密码"/>
        <span class="left"></span>
        <span class="right"></span>
        <span class="top"></span>
        <span class="bottom"></span>
      </div>
      <button type="button" class="btn" @click="login">登录</button>
      <button type="button" class="btnr" @click="register">注册</button>
    </form>
  </div>
</template>
  
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

<script>
import http from "@/api/http"; // 导入服务器路径(跨域处理)
import router from '@/router'; // 导入路由切换组件
export default {
  data() {
    return {
      username: '',
      password: ''
    };
  },
  methods: {
    login() {
        http.get('/userLogin',{ // 引入http(导入的服务器路径)
          params:{
            username: this.username,
            password: this.password
          }
        }).then(loginResult => {
              if (loginResult.data.code == 200) {
                router.push("/meal");
              }else{
                alert("账号或密码错误,请重试")
              }
        }).catch(err => {
          console.log('登录时出错:', err);
        });
      },
      register(){
        router.push("/register")
      }
    }
};
  </script>
  <!-- scoped仅对当前页面有效,防止css样式对其他页面造成影响 -->
<style scoped>
  @import '../css/login.css';

</style>
 创建路由:
//1 引入路由对象
import VueRouter from "vue-router";
import Vue from "vue";
//2.引入vue:@直接转到src路径下
import Login from "@/components/LoginApp.vue";

Vue.use(VueRouter);

//创建路由对象 
var router = new VueRouter({
    routes: [
        {
            path:"/",
            component:Login
        }
        
    ] 
})

//将路由对象暴漏出去
export default router;
App.vue文件:(应用程序入口点的 App.vue 组件)
<template>
  <div>
//<router-view/> 是一个功能性的组件,它本身不渲染任何内容。它的作用主要是作为占位符,Vue Router //会根据当前的路由配置,动态地将对应的组件渲染到 <router-view/> 的位置。
    <router-view/>
  
  </div>
</template>

<script>

export default {

}
</script>

<style>

</style>
解决跨域问题:
 

在src下api下创建http.js

import axios from "axios";

// 配置 
var http = axios.create({
    baseURL:"http://localhost:8080/api" // 代理服务器路径


})

export default http;
vue.config.js文件下:
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  lintOnSave:false, // 配置:文件名不必驼峰命名


// 代理服务器:解决跨域问题
devServer:{
  proxy:{
    "/api":{  // 拦截路径中含有api的
      target:"http://localhost:8088",
      changeOrigin:true,
      pathReWrite:{
        "^/api":"" //将所有api和前面的路径重写为字符串""和目标路径拼接
      }

    }
  }
}

})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/675164.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud网关-gateway

一 什么是网关&#xff1f;为什么选择 Gateway? 网关功能如下&#xff1a; 身份认证和权限校验服务路由、负载均衡请求限流 在 Spring Cloud 中网关的实现包含两种&#xff1a; Gateway&#xff08;推荐&#xff09;&#xff1a;是基于 Spring5 中提供的 WebFlux &#xff…

仿真文件下载审核 有效保障HPC环境下的数据安全性

仿真文件在科学、工程和技术领域中具有重要性&#xff0c;所以确保仿真文件的安全性是非常重要的&#xff0c;特别是当这些文件包含敏感信息或涉及到关键的业务操作时。在获取仿真文件时&#xff0c;仿真文件下载审核这个流程也比较重要的。 审核仿真文件下载&#xff0c;你需要…

SAP 日期函数

1.计算两个时间的时间差&#xff1a;cl_abap_tstmp>subtract DATA: tstmp1 TYPE timestampl, tstmp2 TYPE timestampl, diff TYPE tzntstmpl. " P代表秒 " 获取两个时间戳 tstmp1 20230911183000. tstmp2 20230911153000. diff cl_abap_tstmp&g…

第 53 期:MySQL 创建了用户却无法登陆

社区王牌专栏《一问一实验&#xff1a;AI 版》全新改版归来&#xff0c;得到了新老读者们的关注。其中不乏对 ChatDBA 感兴趣的读者前来咨询&#xff0c;表达了想试用体验 ChatDBA 的意愿&#xff0c;对此我们表示感谢 &#x1f91f;。 目前&#xff0c;ChatDBA 还在最后的准备…

HBuilderX打包uni-app项目成安卓app

目录 1、下载Android 离线SDK 2、Android Studio导入工程 3、生成签名 3.1、进入到jdk bin目录下&#xff0c;输入cmd执行命令keytool -genkey -alias wxsalias -keyalg RSA -keysize 2048 -validity 36500 -keystore wxs.keystore 生成签名 3.2、查看签名密钥keytool -lis…

APP 备案步骤

一、打开阿里云备案系统平台&#xff1a;aliyunbaike.com/go/beian 二、开始备案 三、填写APP名称并进行信息校验 四、填写主办者基础信息和主办者负责人信息 五、填写互联网信息,android打包的APK包可直接上传识别信息&#xff0c;ios需要手动填写信息 公钥和证书SHA-1指纹如…

图片去手写软件有哪些?这三款值得一试!

图片去手写软件有哪些&#xff1f;在当今数字化时代&#xff0c;图片处理与编辑已成为我们日常生活中不可或缺的一部分。特别是在处理手写笔记、涂鸦或草图时&#xff0c;图片去手写软件发挥着至关重要的作用。它们能够帮助我们轻松去除图片中的手写内容&#xff0c;使图片更加…

企业百度百科如何修改

百度百科是一个可以让我们快速的了解一个企业情况的地方&#xff0c;同时也让我们的企业展示了什么&#xff0c;还有哪些是可以做的。 注册与登录 首先&#xff0c;你需要注册一个百度账号&#xff0c;并通过邮箱或手机进行验证。登录后&#xff0c;可以开始创建或编辑百度百科…

Ubuntu系统升级k8s节点的node节点遇到的问题

从1.23版本升级到1.28版本 node节点的是Ubuntu系统20.04的版本 Q1 node节点版本1.23升级1.28失败 解决办法&#xff1a; # 改为阿里云镜像 vim /etc/apt/sources.list.d/kubernetes.list# 新增 deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main# 执…

62. UE5 RPG 近战攻击获取敌人并造成伤害

在上一篇&#xff0c;我们实现了通过AI行为树控制战士敌人靠近攻击目标触发近战攻击技能&#xff0c;并在蒙太奇动画中触发事件激活攻击的那一刻的伤害判断&#xff0c;在攻击时&#xff0c;我们绘制了一个测试球体&#xff0c;用于伤害范围。 在之前实现的火球术中&#xff0c…

韩国GreenChip电容式触摸芯片-打造智能触控新时代

在如今科技迅猛发展的时代&#xff1b;智能触控技术已经成为现代生活中不可或缺的一部分&#xff1b;作为一家领先的触控芯片制造商&#xff0c;韩国GreenChip推出的电容式触摸芯片正以其卓越的性能和创新的设计&#xff0c;引领着智能触控的新时代。 韩国GreenChip电容式触摸…

嘴尚绝卤味:口感独特,让你一尝难忘的美食新体验!

在美食的世界里&#xff0c;卤味以其独特的口味和制作工艺&#xff0c;一直受到广大食客的喜爱。而在众多的卤味品牌中&#xff0c;嘴尚绝卤味凭借其口感独特、品质卓越的特点&#xff0c;脱颖而出&#xff0c;成为众多美食爱好者的首选。 嘴尚绝卤味&#xff0c;顾名思义&…

ARM公司发展历程

Arm从1990年成立前开始&#xff0c;历经漫长岁月树立各项公司里程碑及产品成就&#xff0c;一步步成为全球最普及的运算平台。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; Acorn 时期 1978年&#xff0c;Chris Curry和Hermann Hauser共同创立了Acorn…

QT 音乐播放器【一】 显示音频级别指示器

文章目录 效果图概述代码总结 效果图 概述 QMediaPlayer就不介绍了&#xff0c;就提供了一个用于播放音频和视频的媒体播放器 QAudioProbe 它提供了一个探针&#xff0c;用于监控音频流。当音频流被捕获或播放时&#xff0c;QAudioProbe 可以接收到音频数据。这个类在需要访问…

python下绘制地形晕染(shading)图

python可以利用rasterio&#xff0c;cartopy&#xff0c;matplotlib等库绘制地形晕染图。 1.获取高程数据 高程数据可以从GEBCO网站下载&#xff1a;&#xff08;https://www.gebco.net/data_and_products/gridded_bathymetry_data/&#xff09;。 选择raster&#xff08;栅…

flask 之JWT认证实现

目录 1、JWT 1.1、JWT概述 1.2、token的生成 1.3、token校验 1.4、flask项目中实现JWT认证 1、JWT 1.1、JWT概述 JWT&#xff08;JSON Web Token&#xff09;是一种用于身份验证和授权的开放标准。它由三部分组成&#xff0c;分别是头部、负载和签名。 头部&#xff0…

24、Linux网络端口

Linux网络端口 1、查看网络接口信息ifconfig ens33 eth0 文件 ifconfig 当前设备正在工作的网卡&#xff0c;启动的设备。 ifconfig -a 查看所有的网络设备。 ifconfig ens33 查看指定网卡设备。 ifconfig ens33 up/down 对指定网卡设备进行开关 基于物理网卡设备虚拟的…

搭建 3D 智慧农场可视化

运用图扑自主研发的 HT 产品&#xff0c;全程零代码搭建 3D 轻量化 Low Poly 风格的智慧农场可视化解决方案&#xff0c;无缝融合 2D、3D 技术&#xff0c;1&#xff1a;1 还原农场的区域规划&#xff0c;展开对农作物间的网格化管理。

真国色码上赞,科技流量双剑合璧,商家获客新纪元开启

在数字化浪潮汹涌的今天,真国色研发团队依托红玉房网络科技公司的雄厚实力,凭借科技领先的核心竞争力,推出了创新性的商家曝光引流工具——码上赞。这款工具借助微信支付与视频号已有功能,为实体商家提供了一种全新的引流获客方式,实现了科技与商业的完美融合。 科技领先,流量黑…