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