SpringBoot学习日记二(整合mysql+mybatis实现前后台完全分离网站登录功能)

——————–先在pow.xml中引入mybatis依赖和mysql的依赖——————–

<!--mybatis依赖-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.0.0</version>
</dependency>
<!--mysql依赖-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <!--版本号根据自己的mysql版本进行更改-->
    <version>5.1.47</version>
</dependency>

mybatis支持的映射方式有基于xml的mapper.xml文件、基于mybatis的Mapper接口注解。这两个的区别就是有无mapper.xml文件。

——-基于xml的mapper.xml文件——-

 

——-使用mybatis generator自动生成mapper接口、实体类以及mapper数据库映射——-

首先我们来实现基于xml的mapper.xml文件的方式来整合mybatis。然后就是写mapper接口了和实体类以及mapper数据库映射了。

传统的方式就是我们自己去手写,但是为了提高效率(emm,还是懒,哈哈,不过确实不用自己写了),我们使用mybatis generator 自动生成代码插件来为我们自动生成这些东西。

使用mybatis generator 自动生成代码插件我们同样首先需要引入依赖,

注意,这个依赖是在build->plugins下添加:

<!--mybatis自动生成代码插件-->
<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.3.6</version>
    <configuration>
        <!--自动生成代码插件配置文件的位置,Personal-GeneratorConfig.xml文件名字可以随便起-->
        <configurationFile>src/main/resources/mybatis/mybatis-generator/generatorConfig.xml</configurationFile>
        <!-- 是否覆盖,true表示会替换生成的JAVA文件,false则不覆盖 -->
        <overwrite>true</overwrite>
    </configuration>
    <dependencies>
        <!--mysql驱动包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
    </dependencies>
</plugin>

然后我们就需要在src/main/resources目录下去建立mybatis/mybatis-generator目录,然后创建generatorConfig.xml文件,这个文件自动生成代码插件配置文件。创建路径必须要和上面的<configurationFile>路径</configurationFile>标签中的路径保持一致。

generatorConfig.xml代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!-- 第二种mybatis逆向生成xml配置 -->
<generatorConfiguration>
    <!-- 需要指明数据库连接器的绝对路径 -->
    <classPathEntry
            location="C:\Users\Administrator\.m2\repository\mysql\mysql-connector-java\8.0.16\mysql-connector-java-8.0.16.jar" />
    <context id="sqlserverTables" targetRuntime="MyBatis3">
        <!-- 生成的pojo,将implements Serializable-->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
        <commentGenerator>
            <!-- 将数据库中表的字段描述信息添加到注释 -->
            <property name="addRemarkComments" value="true"/>
            <!-- 注释里不添加日期 -->
            <property name="suppressDate" value="true"/>
            <!-- 是否去除自动生成的注释 true:是 : false:否-->
            <property name="suppressAllComments" value="true" />

        </commentGenerator>

        <!-- 数据库链接URL、用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/springBootDemo"
                        userId="user"
                        password="password">
        </jdbcConnection>

        <!--
        默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer
            true,把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal
        -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!--
        生成model模型,对应的包路径,以及文件存放路径(targetProject),targetProject可以指定具体的路径,如./src/main/java,
        也可以使用“MAVEN”来自动生成,这样生成的代码会在target/generatord-source目录下
        -->
        <!--<javaModelGenerator targetPackage="com.lds.springbootdemo.domain" targetProject="MAVEN">-->
        <javaModelGenerator targetPackage="com.lds.springbootdemo.domain" targetProject="./src/main/java">
            <property name="enableSubPackages" value="true"/>
            <!-- 从数据库返回的值被清理前后的空格  -->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <!--对应的mapper.xml文件  -->
        <sqlMapGenerator targetPackage="mybatis.mapper" targetProject="./src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

        <!-- 对应的Mapper接口类文件 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.lds.springbootdemo.mapper" targetProject="./src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>


        <!-- 列出要生成代码的所有表,这里配置的是不生成Example文件 -->
        <table tableName="sbd_user" domainObjectName="sbd_user"
               enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" selectByExampleQueryId="false" >
            <property name="useActualColumnNames" value="false"/>
        </table>
    </context>
</generatorConfiguration>

其中classPathEntry的location属性为需要指明数据库连接器的绝对路径。这个的绝对路径就是mysql-connector的jar包文件绝对路径。绝对路径请参照下图获得:

 

之后我们就去创建相应的包。

在/src/main/java/com/lds/springBootDemo/下去创建domain包。存放生成model模型。

在/src/main/resources/mybatis/下去创建mapper目录。存放生成的对应的Mapper.xml文件。

在/src/main/java/com/lds/springBootDemo/下去创建mapper包。存放生成的对应的Mapper接口类文件。

创建好这三个包后就可以进行自动生成了。生成步骤见下图所示:

 

之后就会自动去生成代码到对应目录和包中。生成结果如下图所示:

 

 

而且可以看到,还帮我们自动生成了常用的方法。emm…

——————–实现前后台完全分离的网站登陆功能——————–

我计划这个项目整体全部是使用前后端完全分离,数据交互全部采用ajax交互的方式。就好比简单的登陆来说。

LoginController.java

package com.lds.springbootdemo.controller.login_register;

import com.lds.springbootdemo.service.login_register.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


/**
 * @program: springbootdemo
 * @description:
 * @author:
 * @createData: 
 * @updateAuthor:
 * @updateData: 
 * @updateContent:
 * @Version: 1.0
 * @email: lidongshenglife@163.com
 * @blog: www.b0c0.com
 */
/*
@RestController是一个组合注解,用于标注控制层组件(如struts中的action)
@RestController = @Controller + @ResponseBody
@RestController注解直接将返回的对象输出到客户端
如果返回字符串,直接返回
如果返回不是字符串,默认使用Jackson将对象序列化成JSON字符串后输出
这个不会返回视图
 */
@RestController
@RequestMapping("/login")
public class LoginController {
    //自动注入bean
    @Autowired
    private LoginService loginService;

    @RequestMapping(value = "/loginValidate")
    public String loginValidate(String account,String password) {
        boolean validate=loginService.loginValidate(account, password);
        if(validate){
            return "200";
        }else{
            return "400";
        }
    }
    /*
    也可以使用这种方法获得前台传的值
    @RequestMapping(value = "/loginValidate")
    public String loginValidate(HttpServletRequest request) {
        String account=request.getParameter("account");
        String password=request.getParameter("password");
        boolean validate=loginService.loginValidate(account, password);
        if(validate){
            return "200";
        }else{
            return "400";
        }
    }
     */

}

LoginService.java

package com.lds.springbootdemo.service.login_register;


/**
 * @program: springbootdemo
 * @description:
 * @author:
 * @createData: 
 * @updateAuthor:
 * @updateData: 
 * @updateContent:
 * @Version: 1.0
 * @email: lidongshenglife@163.com
 * @blog: www.b0c0.com
 */


public interface LoginService {
    /**
     * 登录验证Service
     * @return
     */
    boolean loginValidate(String account, String password);
}

LoginServiceImpl.java

package com.lds.springbootdemo.service.login_register;

import com.lds.springbootdemo.domain.sbd_user;
import com.lds.springbootdemo.mapper.sbd_userMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @program: springbootdemo
 * @description:
 * @author:
 * @createData: 
 * @updateAuthor:
 * @updateData:
 * @updateContent:
 * @Version: 1.0
 * @email: lidongshenglife@163.com
 * @blog: www.b0c0.com
 */

@Service
public class LoginServiceImpl implements LoginService {

    @Autowired
    private sbd_userMapper userMapper;

    /**
     * 登录验证Service
     * @return
     */
    @Override
    public boolean loginValidate(String account,String password) {
        boolean retu=false;
        sbd_user em=userMapper.selectByAccount(account);
        if(em!=null&&password.equals(em.getPassword())){
            retu=true;
        }
        return retu;
    }
}

sbd_userMapper.java(Mapper接口类)

package com.lds.springbootdemo.mapper;

import com.lds.springbootdemo.domain.sbd_user;
import org.apache.ibatis.annotations.Mapper;

//@Mapper
public interface sbd_userMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(sbd_user record);

    int insertSelective(sbd_user record);

    sbd_user selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(sbd_user record);

    int updateByPrimaryKey(sbd_user record);
    /**
     * 根据账号返回实体
     * @param account
     * @return
     */
    sbd_user selectByAccount(String account);
}

在sbd_userMapper.java中,我们理应该在类上面加上@Mapper注解,但是这种方式要求每一个mapper类都需要添加此注解,麻烦。所以我们可以在SpringBootDemoApplication(也就是springboot项目的启动入口类)上面加上@MapperScan注解。

SpringBootDemoApplication.java

package com.lds.springbootdemo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
/*直接在Mapper类上面添加注解@Mapper,这种方式要求每一个mapper类都需要添加此注解,麻烦
  所以可以通过使用@MapperScan可以指定要扫描的Mapper类的包的路径
 */
@MapperScan("com.lds.springbootdemo.mapper")
public class SpringBootDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoApplication.class, args);
    }

}

sbd_userMapper.xml(mapperxml文件)

<?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="com.lds.springbootdemo.mapper.sbd_userMapper">
  <resultMap id="BaseResultMap" type="com.lds.springbootdemo.domain.sbd_user">
    <id column="Id" jdbcType="INTEGER" property="id" />
    <result column="Account" jdbcType="VARCHAR" property="account" />
    <result column="Password" jdbcType="VARCHAR" property="password" />
    <result column="Status" jdbcType="INTEGER" property="status" />
  </resultMap>
  <sql id="Base_Column_List">
    Id, Account, Password, Status
  </sql>
  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from sbd_user
    where Id = #{id,jdbcType=INTEGER}
  </select>
  <select id="selectByAccount" parameterType="java.lang.String" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from sbd_user
    where Account = #{account,jdbcType=VARCHAR}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
    delete from sbd_user
    where Id = #{id,jdbcType=INTEGER}
  </delete>
  <insert id="insert" parameterType="com.lds.springbootdemo.domain.sbd_user">
    insert into sbd_user (Id, Account, Password, 
      Status)
    values (#{id,jdbcType=INTEGER}, #{account,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, 
      #{status,jdbcType=INTEGER})
  </insert>
  <insert id="insertSelective" parameterType="com.lds.springbootdemo.domain.sbd_user">
    insert into sbd_user
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        Id,
      </if>
      <if test="account != null">
        Account,
      </if>
      <if test="password != null">
        Password,
      </if>
      <if test="status != null">
        Status,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=INTEGER},
      </if>
      <if test="account != null">
        #{account,jdbcType=VARCHAR},
      </if>
      <if test="password != null">
        #{password,jdbcType=VARCHAR},
      </if>
      <if test="status != null">
        #{status,jdbcType=INTEGER},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.lds.springbootdemo.domain.sbd_user">
    update sbd_user
    <set>
      <if test="account != null">
        Account = #{account,jdbcType=VARCHAR},
      </if>
      <if test="password != null">
        Password = #{password,jdbcType=VARCHAR},
      </if>
      <if test="status != null">
        Status = #{status,jdbcType=INTEGER},
      </if>
    </set>
    where Id = #{id,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.lds.springbootdemo.domain.sbd_user">
    update sbd_user
    set Account = #{account,jdbcType=VARCHAR},
      Password = #{password,jdbcType=VARCHAR},
      Status = #{status,jdbcType=INTEGER}
    where Id = #{id,jdbcType=INTEGER}
  </update>
</mapper>

login.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/springBootDemo/css/login_register/Login.css">
    <script type="text/javascript" src="http://cdn.bootcss.com/blueimp-md5/1.1.0/js/md5.js"></script>
    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    <script type="text/javascript" src="/springBootDemo/js/login_register/Login.js"></script>
</head>
<body>
<br><br><br><br><br><br><br><br><br><br><br>
<div id="login" align="center">
    <p align="center">登  录</p>
    <br>
    <img src="/springBootDemo/img/login_register/account.png">
    <input type="text" id="account" name="account" maxlength="15"
           style="ime-mode: disabled;" placeholder="Username"/>
    <br>
    <img src="/springBootDemo/img/login_register/password.png">
    <input type="password" id="password" name="password" maxlength="18"
           placeholder="Password"/>
    <button onclick="loginValidate()"><b>Login</b></button>

</div>
</body>
</html>

css就不在此贴了,只贴出js文件:

Login.js

function loginValidate(){
    var account=$("#account").val();
    var password=$("#password").val();  
    if(account==""||account.length==0){
        alert("请输入账号!");
    }else{
        if(password==""||password.length==0){
            alert("请输入密码!");
        }else{
             $.ajax({
                 type:"POST",
                 url:"/springBootDemo/login/loginValidate?account="+account+"&password="+password,
                 dataType: "json",
                 success:function (result) {
                    console.log(result);
                     if(result==200)
                         window.location.href="/springBootDemo/view/index.html";
                     else
                         alert("登录失败");
                 }
             });
        }
    }
}

这些都编写完之后。我们还需在我们在application.properties项目配置文件中去配置我们的数据源以及mybatis的mapper映射路径。为了方便以后的更改,我们来建立一个自定义的数据源相关的配置文件(dbconfig.properties),让application.properties中直接去读dbconfig.properties的参数值。方便我们以后的管理修改。

dbconfig.properties:

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/springbootdemo
user=user
password=password

application.properties:

#设置项目访问名称
server.servlet.context-path=/springbootdemo
#mysql数据源配置
spring.datasource.driver-class-name=${driverClass}
spring.datasource.url=${url}
spring.datasource.username=${user}
spring.datasource.password=${password}
#mybatis的mapper映射路径
mybatis.mapperLocations=classpath:mybatis/mapper/*.xml

我们虽然写了自定义的配置文件,但是我们肯定需要在项目启动的时候去加载dbconfig.properties自定义配置文件,如何加载呢?我们只需在SpringBootDemoApplication.java(也就是springboot项目的启动入口类)加上@PropertySource

SpringBootDemoApplication.java

package com.lds.springbootdemo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.PropertySource;

@SpringBootApplication
/*直接在Mapper类上面添加注解@Mapper,这种方式要求每一个mapper类都需要添加此注解,麻烦
  所以可以通过使用@MapperScan可以指定要扫描的Mapper类的包的路径
 */
@MapperScan("com.lds.springbootdemo.mapper")
// 用来指定配置文件的位置
@PropertySource(value={"classpath:dbconfig.properties"})
public class SpringBootDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoApplication.class, args);
    }

}

我们这样写过之后,一个基本springboot+mybatis+mysql的登录模块就好了.我们启动项目。对了,我们可以设置项目的默认页面,可以在SpringBootDemoApplication.java的同级下新建一个DefaultController

DefaultController.java

package com.lds.springbootdemo;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @program: springBootDemo
 * @description: 项目默认的Controller
 * @author:
 * @createData: 
 * @updateAuthor:
 * @updateData: 
 * @updateContent: 项目默认的Controller
 * @Version: 1.0
 * @email: lidongshenglife@163.com
 * @blog: www.b0c0.com
 */

@Controller
public class DefaultController {
    @RequestMapping(value = "/")
    public String index(Model model) {

        return "forward:view/login_register/login.html";
    }
}

 

——-基于mybatis的Mapper接口注解——-

上面的是基于xml的mapper.xml文件的方式来整合mybatis。还有一种就是抛弃传统的mapper.xml文件,直接在mapper.java接口里写sql语句。接口方法注解主要是四个:@Insert、@Delete、@Update、@Select。具体的大家可以去官方文档了解,即作如如下改动:

既然现在不需要maper.xml文件了。我们也就没必要在application.properties项目配置文件中写mybatis的mapper映射路径了,把它注释掉。

#设置项目访问名称
server.servlet.context-path=/springBootDemo
#mysql数据源配置
spring.datasource.driver-class-name=${driverClass}
spring.datasource.url=${url}
spring.datasource.username=${user}
spring.datasource.password=${password}
#注释掉mybatis的mapper映射路径
#mybatis.mapperLocations=classpath:mybatis/mapper/*.xml

既然没了mapper.xml,那我们的sql语句写在哪里呢?我们现在既可以直接把sql语句写在mapper.java接口中。就拿登录的那个查询方法selectByAccount来说。改动代码如下:

package com.lds.springbootdemo.mapper;

import com.lds.springbootdemo.domain.sbd_user;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

//@Mapper
public interface sbd_userMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(sbd_user record);

    int insertSelective(sbd_user record);

    sbd_user selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(sbd_user record);

    int updateByPrimaryKey(sbd_user record);
    /**
     * 根据账号返回实体
     * @param account
     * @return
     */
    //sql语句直接写在方法的上面
    @Select("select * from sbd_user where account=#{account}")
    sbd_user selectByAccount(String account);
}

这就可以了~~~.

两种方式都可以。

下个内容(学习日记三)会进行另一种的方式(使用传统的SqlSessionTemplate来实现通用Dao操作)。

 

——————–华丽的分割线——————–

数据库:

至此,我们就可以启动项

 

目,然后在浏览器上输入项目地址:http://localhost:8080/springBootDemo/。神奇的事情发生了。

我已经把这个的实例放在git中了,欢迎大家拉取下载以及指出错误,可以的话给标个小星星~~~地址:

https://github.com/DeBug-Bug/springBootDemo.git

发表评论

电子邮件地址不会被公开。