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和前面的路径重写为字符串""和目标路径拼接
      }

    }
  }
}

})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值