--------------------先在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/。神奇的事情发生了。