学习目标:
1.springboot搭建
2.MBG逆向工程
3.SSM开发
4.集成PageHelper
5.集成通用Mapper
一、SpringBoot搭建
①建模
阿里云网站:
https://start.aliyun.comhttps://start.aliyun.com
Spring Web:集成ssm环境,搭服务器;
MyBatis Framework:集成MyBatis;
MySQL Driver:数据库;
②yml文件
server:
port: 8080
二、MBG逆向工程
①连接数据库
②逆向生成器代码
1.导入依赖
<!--逆向工程依赖-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency><!--插件-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<configurationFile>
<!--这里是配置generatorConfig.xml的路径 不写默认在resources目录下找generatorConfig.xml文件-->
</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
2.导入配置文件
在resource包内:
Generator.properties:
userSSL意思是非加密的;serverTimezone:时区;useUnicode:防止乱码;allowPublicKeyRetrieval:允许加密访问
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/boot?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true jdbc.username=root jdbc.password=123456----mysql密码 jdbc.driverLocation=F:\\maven\\jar\\mysql\\mysql-connector-java\\8.0.25\\mysql-connector-java-8.0.25.jar----mysql驱动地址 model.package=com.xhy.code.entity mapper.package=com.xhy.code.mapper xml.mapper.package=mapper
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"> <generatorConfiguration> <properties resource="generator.properties"/> <!--指定数据库jdbc驱动jar包的位置--> <classPathEntry location="${jdbc.driverLocation}"/> <context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat"> <property name="beginningDelimiter" value="`"/> <property name="endingDelimiter" value="`"/> <property name="javaFileEncoding" value="UTF-8"/> <!--生成mapper.xml时覆盖原文件--> <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/> <plugin type="org.mybatis.generator.plugins.MyBatisPlugin"> <property name="hasLombok" value="true"/> </plugin> <!--可以自定义生成model的代码注释--> <commentGenerator> <property name="suppressAllComments" value="true"/> <!-- 是否取消注释 --> <property name="suppressDate" value="true"/> <!-- 是否生成注释代时间戳 --> </commentGenerator> <!--配置数据库连接--> <jdbcConnection driverClass="${jdbc.driver}" connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"> <!--解决mysql驱动升级到8.0后不生成指定数据库代码的问题--> <property name="nullCatalogMeansCurrent" value="true"/> </jdbcConnection> <!-- 非必需,类型处理器,在数据库类型和java类型之间的转换控制--> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!--指定pojo生成位置--> <javaModelGenerator targetPackage="${model.package}" targetProject="src\main\java"/> <!--指定生成mapper.xml的路径--> <sqlMapGenerator targetPackage="${xml.mapper.package}" targetProject="src\main\resources"/> <!--指定生成mapper接口的的路径--> <javaClientGenerator type="XMLMAPPER" targetPackage="${mapper.package}" targetProject="src\main\java"/> <table tableName="student" domainObjectName="Student"> <!--<columnOverride column="create_time" javaType="java.sql.Timestamp" jdbcType="timestamp"/>--> <!--<columnOverride column="modify_time" javaType="java.sql.Timestamp" jdbcType="timestamp"/>--> <property name="enableCountByExample" value="false"/> <property name="enableDeleteByExample" value="false"/> <property name="enableDeleteByPrimaryKey" value="false"/> <property name="enableInsert" value="false"/> <property name="enableSelectByPrimaryKey" value="false"/> <property name="enableUpdateByExample" value="false"/> <property name="enableUpdateByPrimaryKey" value="false"/> <property name="selectByExampleQueryId" value="true"/> <property name="selectByPrimaryKeyQueryId" value="false"/> <!--自动生成主键,可以代替useGeneratedKeys--> <generatedKey column="stu_id" sqlStatement="Mysql" type="post" identity="true"/> </table> </context> </generatorConfiguration>
3.生成表对象上的注解以及文档上的注释
在Java包内新建软件包,包名与此一致org.mybatis.generator.plugins
package org.mybatis.generator.plugins;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.Plugin;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.*;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author hgh
*/
@Slf4j
public class MyBatisPlugin extends PluginAdapter {
@Override
public boolean validate(List<String> list) {
return true;
}
// 生成类上面的注释
@Override
public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
boolean hasLombok = Boolean.parseBoolean(getProperties().getProperty("hasLombok", "false"));
log.warn("hasLombok:\t" + hasLombok);
if (hasLombok) {
topLevelClass.addImportedType("lombok.Data");
topLevelClass.addImportedType("lombok.NoArgsConstructor");
topLevelClass.addImportedType("lombok.AllArgsConstructor");
topLevelClass.addImportedType("lombok.experimental.Accessors");
topLevelClass.addAnnotation("@Data");
topLevelClass.addAnnotation("@NoArgsConstructor");
topLevelClass.addAnnotation("@AllArgsConstructor");
topLevelClass.addAnnotation("@Accessors(chain = true)");
}
topLevelClass.addJavaDocLine("/**");
String remarks = introspectedTable.getRemarks();
log.error("@table\t" + remarks);
topLevelClass.addJavaDocLine(" * "+remarks + "\t" + introspectedTable.getFullyQualifiedTable());
topLevelClass.addJavaDocLine(" * @author lv");
topLevelClass.addJavaDocLine(" * @date " + LocalDateTime.now());
topLevelClass.addJavaDocLine(" */");
return true;
}
// 生成在每个字段上面的注释
@Override
public boolean modelFieldGenerated(Field field, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
field.addJavaDocLine("/**");
String remarks = introspectedColumn.getRemarks();
log.error("@column\t" + remarks);
field.addJavaDocLine(" * " + remarks);
field.addJavaDocLine(" */");
return true;
}
// 生成接口注解
@Override
public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
interfaze.addImportedType(new FullyQualifiedJavaType("org.apache.ibatis.annotations.Mapper"));
interfaze.addAnnotation("@Mapper");
interfaze.addImportedType(new FullyQualifiedJavaType("org.springframework.stereotype.Repository"));
interfaze.addAnnotation("@Repository");
interfaze.addJavaDocLine("/**");
interfaze.addJavaDocLine(" * @author hgh");
interfaze.addJavaDocLine(" * @date " + LocalDateTime.now());
interfaze.addJavaDocLine(" */");
return true;
}
// 模型是否需要生成set方法
@Override
public boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
boolean hasLombok = Boolean.parseBoolean(getProperties().getProperty("hasLombok", "false"));
return !hasLombok;
}
// 模型是否需要生成get方法
@Override
public boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
boolean hasLombok = Boolean.parseBoolean(getProperties().getProperty("hasLombok", "false"));
return !hasLombok;
}
}
4.将这个类的编译文件丢到pom.xml文件所指的mybatis-generator-core文件内相应版本的jar包里面去:
首先执行一下文件,获得编译文件:
将此文件丢到本地仓库中:F:\maven\jar\org\mybatis\generator\mybatis-generator-core\1.3.7
5.点击逆向生成代码
③配置数据源、mybatis
application.yml文件:
server: port: 8080 spring: datasource: username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/eshop?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true mybatis: config-location: classpath*:mapper/*.xml type-aliases-package: com.xhy.code.entity configuration: map-underscore-to-camel-case: true
4、查询表数据
StudentMapper.java:
package com.xhy.code.mapper; import com.xhy.code.entity.Student; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; import java.util.List; @Mapper @Repository public interface StudentMapper { int deleteByPrimaryKey(Long stuId); int insert(Student record); int insertSelective(Student record); Student selectByPrimaryKey(Long stuId); int updateByPrimaryKeySelective(Student record); int updateByPrimaryKey(Student record); List<Student>select(); }
StudentMapper.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="com.xhy.code.mapper.StudentMapper"> <resultMap id="BaseResultMap" type="com.xhy.code.entity.Student"> <id column="student_stu_id" jdbcType="BIGINT" property="stuId" /> <result column="student_stu_name" jdbcType="VARCHAR" property="stuName" /> <result column="student_stu_phone" jdbcType="VARCHAR" property="stuPhone" /> <result column="student_stu_class" jdbcType="BIGINT" property="stuClass" /> <result column="student_stu_address" jdbcType="VARCHAR" property="stuAddress" /> </resultMap> <sql id="Base_Column_List"> student.stu_id as student_stu_id, student.stu_name as student_stu_name, student.stu_phone as student_stu_phone, student.stu_class as student_stu_class, student.stu_address as student_stu_address </sql> <select id="select" resultType="com.xhy.code.entity.Student"> select * from student </select> <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from student student where student.stu_id = #{stuId,jdbcType=BIGINT} </select> <delete id="deleteByPrimaryKey" parameterType="java.lang.Long"> delete from student where stu_id = #{stuId,jdbcType=BIGINT} </delete> <insert id="insert" keyColumn="stu_id" keyProperty="stuId" parameterType="com.xhy.code.entity.Student" useGeneratedKeys="true"> insert into student (stu_name, stu_phone, stu_class, stu_address) values (#{stuName,jdbcType=VARCHAR}, #{stuPhone,jdbcType=VARCHAR}, #{stuClass,jdbcType=BIGINT}, #{stuAddress,jdbcType=VARCHAR}) </insert> <insert id="insertSelective" keyColumn="stu_id" keyProperty="stuId" parameterType="com.xhy.code.entity.Student" useGeneratedKeys="true"> insert into student <trim prefix="(" suffix=")" suffixOverrides=","> <if test="stuName != null"> stu_name, </if> <if test="stuPhone != null"> stu_phone, </if> <if test="stuClass != null"> stu_class, </if> <if test="stuAddress != null"> stu_address, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="stuName != null"> #{stuName,jdbcType=VARCHAR}, </if> <if test="stuPhone != null"> #{stuPhone,jdbcType=VARCHAR}, </if> <if test="stuClass != null"> #{stuClass,jdbcType=BIGINT}, </if> <if test="stuAddress != null"> #{stuAddress,jdbcType=VARCHAR}, </if> </trim> </insert> <update id="updateByPrimaryKeySelective" parameterType="com.xhy.code.entity.Student"> update student <set> <if test="stuName != null"> stu_name = #{stuName,jdbcType=VARCHAR}, </if> <if test="stuPhone != null"> stu_phone = #{stuPhone,jdbcType=VARCHAR}, </if> <if test="stuClass != null"> stu_class = #{stuClass,jdbcType=BIGINT}, </if> <if test="stuAddress != null"> stu_address = #{stuAddress,jdbcType=VARCHAR}, </if> </set> where stu_id = #{stuId,jdbcType=BIGINT} </update> <update id="updateByPrimaryKey" parameterType="com.xhy.code.entity.Student"> update student set stu_name = #{stuName,jdbcType=VARCHAR}, stu_phone = #{stuPhone,jdbcType=VARCHAR}, stu_class = #{stuClass,jdbcType=BIGINT}, stu_address = #{stuAddress,jdbcType=VARCHAR} where stu_id = #{stuId,jdbcType=BIGINT} </update> </mapper>
测试:SpringBoot03ApplicationTests.java
package com.xhy.code; import com.xhy.code.mapper.StudentMapper; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import javax.sql.DataSource; @SpringBootTest class Springboot03ApplicationTests { @Autowired DataSource dataSource; @Autowired StudentMapper mapper; @Test void contextLoads() throws Exception{ System.out.println(dataSource); System.out.println(dataSource.getConnection()); System.out.println( mapper.select()); } }
三、SSM开发
`