开发基础
开发基础笔记
mybatis-plus通用的service方法
通过jenkins配置前后端自动打包及发布
mybatis-plus实现分页的方式
Java极客技术公众号PDF
狂神说SpringBoot
Hashids java 版使用
SpringBoot
1、Web快速开发
2、结果集的封装
3、集成MyBatis实现数据库操作
4、Springboot @Validated参数校验
5、SpringBoot全局异常处理
6、拦截器HandlerInterceptor
7、集成Swagger实现API自动生成
8、集成knife4j实现API自动生成
9、Springboot集成MyBatis-Plus快速入门
10、springboot自定义注解及AOP切面使用
11、使用Shiro实现登陆和权限认证,基于MyBatis
12、集成SpringSecurity实现授权认证
13、SpringBoot集成EasyExcel实现数据导入与导出
14、Spring Task定时任务的实现
15、Quartz快速上手与实践
16、如何用代码实现Spring IOC
17、SpringBoot集成JWT,实现接口的鉴权交互
SpringCloud
Nacos作为服务注册中心
seata1.6.1 结合springcloud实现分布锁的技术笔记
一些技术博客推荐
前端面试相关
看这一篇就够了
java.util包常用的类和接口
CountDownLatch介绍与使用
Common-lang3使用入门
Hutool简单使用入门
lombok 介绍及基本使用方法
git项目统计成员代码行数和提交的次数
mysql 逗号分隔的数据 like查询
使用sonar进行代码质量检查
线上使用jmeter进行压测的时候,使用Arthas诊断工具排查响应慢的接口
php结合phpstudy8、vscode开启xdebug进行代码调试
node-red使用入门
本文档使用 MrDoc 发布
-
+
首页
3、集成MyBatis实现数据库操作
### 1、引入坐标 parent和上一章节一样,保持不变,以后的所有章节,如果不做特殊说明,都需要继承这个Parent ~~~xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> </parent> ~~~ 依赖如下: ~~~xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- 热部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> <!-- Web支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- JDBC --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> <version>5.1.9</version> </dependency> <!-- 集成MyBatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.2</version> </dependency> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <!-- 测试 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> ~~~ ### 2、配置数据源 也就是在application.yml增加数据库的相关配置信息 如果你习惯使用properties的配置文件,可以通过下面这个网站进行格式的互转 https://www.toyaml.com/index.html application.yml的配置如下: ~~~yaml mybatis: mapper-locations: classpath:mapper/*.xml typeAliasesPackage: com.mmno.demo.model server: port: 8088 servlet: context-path: /demospring spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/demo_springboot?characterEncoding=utf8 username: root password: 123456 ~~~ application.properties的配置如下: ~~~properties # 配置数据库驱动 spring.datasource.driver-class-name=com.mysql.jdbc.Driver # 配置数据库url spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8 # 配置数据库用户名 spring.datasource.username=root # 配置数据库密码 spring.datasource.password=123456 # 指定MyBatis配置文件位置 mybatis.mapper-locations=classpath:mapper/*.xml # 指定模型位置 mybatis.typeAliasesPackage=com.mmno.demo.model # 修改端口号避免冲突 server.port=8088 # 服务路径 server.servlet.context-path=/demospring ~~~ ### 3、表说明 本系列教程都是 围绕着demo_springboot这个数据库进行操作的。 库里有一张user表,包括常用的字段信息:id、username、password、nickname等信息。 所以新建一个model包,然后创建User的实体类。 ~~~java package com.mmno.demo.model; import java.time.LocalDate; import java.util.Date; import java.util.Locale; public class User { @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + ", nickname='" + nickname + '\'' + ", loginTime=" + loginTime + '}'; } private Integer id; private String username; private String password; private String nickname; private LocalDate loginTime; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public LocalDate getLoginTime() { return loginTime; } public void setLoginTime(LocalDate loginTime) { this.loginTime = loginTime; } } ~~~ ### 4、数据访问层DAO 也叫mapper层,操作的接口和xml都是成对出现,且xml中的id和接口方法也是一一对应的。 **UserMapper.java接口** ~~~java @Repository public interface UserMapper { List<User> GetInfo(); List<User> SelectName(@Param("nickname") String nickname); User SelectById(@Param("id") int id); int AddInfo( @Param("username") String username, @Param("password") String password, @Param("nickname") String nickname ); int UpdateInfo( @Param("password") String password, @Param("id") int id ); int DeleteById(@Param("id") int id); } ~~~ **UserMapper.xml 映射文件** 此文件放到resource/mapper文件夹下面。 ``` <?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.mmno.demo.mapper.UserMapper"> <!-- 用作基础查询测试 --> <select id="GetInfo" resultType="User"> select * from user </select> <!-- 用做传递参数测试 --> <select id="SelectName" resultType="User"> select * from user where nickname like "%${nickname}%" </select> <!-- id精准查询 --> <select id="SelectById" resultType="User"> select * from user where id=#{id} </select> <!-- 增加 --> <insert id="AddInfo"> insert into user values(0,"${username}","${password}","${nickname}"); </insert> <!-- 修改 --> <update id="UpdateInfo"> update user set password="${password}" where id=#{id} </update> <!-- 删除 --> <delete id="DeleteById"> delete from user where id=#{id} </delete> </mapper> ``` ### 5、Service层 serice层包括了接口和接口实现impl UserService.java ``` public interface UserService { /** * 获取所有 * @return */ List<User> GetInfo(); /** * 获取nickName的模糊查询结果集 * @param nickName * @return */ List<User> SelectName(String nickName); /** * id精准查询 * @param id * @return */ Users SelectById(int id); /** * 添加信息 * @param userName * @param pwd * @param nickName * @return */ int AddInfo( String userName, String pwd, String nickName ); /** * 修改密码 * @param pwd * @param id * @return */ int UpdateInfo( String pwd, int id ); /** * 删除信息 * @param id * @return */ int DeleteById(int id); } ``` UserServiceImpl.java ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public List<User> GetInfo() { return userMapper.GetInfo(); } @Override public List<User> SelectName(String nickname) { return userMapper.SelectName(nickname); } @Override public User SelectById(int id) { return userMapper.SelectById(id); } @Override public int AddInfo(String username, String password, String nickname) { password=encrypt(password); return userMapper.AddInfo(username, password, nickname); } @Override public int UpdateInfo(String password, int id) { password=encrypt(password); return userMapper.UpdateInfo(password, id); } @Override public int DeleteById(int id) { return userMapper.DeleteById(id); } /** * MD5加密 * @param password * @return */ private String encrypt(String password) { String passwordMd5 = null; try { MessageDigest md5 = MessageDigest.getInstance("MD5"); byte[] bytes = md5.digest(password.getBytes("utf-8")); passwordMd5 = toHex(bytes); } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) { e.printStackTrace(); } return passwordMd5; } private static String toHex(byte[] bytes) { final char[] HEX_DIGITS = "0123456789ABCDEF".toCharArray(); StringBuilder ret = new StringBuilder(bytes.length * 2); for (int i = 0; i < bytes.length; i++) { ret.append(HEX_DIGITS[(bytes[i] >> 4) & 0x0f]); ret.append(HEX_DIGITS[bytes[i] & 0x0f]); } return ret.toString(); } } ``` 第一行的 @Service 很重要,,别漏写了。 ### 6、测试一下 新建一个MyTest方法,测试一下效果吧 ```java @RunWith(SpringRunner.class) @SpringBootTest public class MyTest { @Autowired UserService userService; @Test public void getInfo(){ List<User> list = userService.GetInfo(); list.stream().forEach(System.out::println); } } ``` ### 7、代码快速生成 感觉上述的这些操作 太麻烦,那么可以试试官方的代码快速生成工具:Generator 在resources文件夹下创建一个目录mybatis-generator,在目录mybatis-generator下创建文件generatorConfig.xml(此处的目录名可任意取) #### 修改项目的pom文件,增加一个plugin。 ~~~xml <build> <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.5</version> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.21</version> </dependency> </dependencies> <configuration> <configurationFile>${basedir}/src/main/resources/mybatis-generator/generatorConfig.xml </configurationFile> <overwrite>true</overwrite> <verbose>true</verbose> </configuration> </plugin> </plugins> </build> ~~~ #### 配置generatorConfig.xml 这个文件里有很多配置参数,需要根据你的实际情况去修改! 1. jdbcConnection 修改成自己的数据库连接信息 2. javaModelGenerator 实体类存放的地址 3. sqlMapGenerator mapper映射的xml存放的地址 4. javaClientGenerator mapper存放的地址 5. table 一个表名,一个生成的类名 有心的朋友可能看到了 <properties resource="mybatis-generator/generator.properties"/> <classPathEntry location="c:/software/mysql/mysql-connector-java-5.1.6.jar"/> 这两行代码,但是被注释掉了。 第一个是因为在jdbcConnection里面把数据库配置写死了,所以没必要再去新建一个generator.properties文件专门配置数据库信息。 第二个是因为在pom文件里加入了 mysql-connector-java的依赖,所以不需要再去手动指向到本地的Mysql连接驱动。 ~~~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="mybatis-generator/generator.properties"/>--> <!-- 连接数据库jar包的路径--> <!-- <classPathEntry location="c:/_software/mysql/mysql-connector-java-5.1.6.jar"/>--> <context id="DB2Tables" targetRuntime="MyBatis3"> <commentGenerator> <property name="suppressDate" value="true"/> <!-- 是否去除自动生成的注释 true:是 : false:否 --> <property name="suppressAllComments" value="true"/> </commentGenerator> <!--数据库连接参数 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/demo_springboot?serverTimezone=UTC&useSSL=true" userId="root" password="123456"> </jdbcConnection> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- 实体类的包名和存放路径 --> <javaModelGenerator targetPackage="com.mmno.demo.model" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- 生成映射文件*.xml的位置--> <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <!-- 生成DAO的包名和位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.mmno.demo.mapper" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <!-- tableName:数据库中的表名或视图名;domainObjectName:生成的实体类的类名--> <table tableName="blog" domainObjectName="Blog" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/> <!-- <table tableName="xxx" domainObjectName="xxx" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/> ... <table tableName="xxx" domainObjectName="xxx" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/> --> </context> </generatorConfiguration> ~~~ #### 双击执行  生成的代码如下,红色部分:  > 生成的mapper接口上方没有 加 或者 @Mapper,同时在启动类里加上 @MapperScan("com.mmno.mapper") ,配置扫描mapper的路径,记得加一下!!! > > 比较遗憾的是只生成了 mapper 和实体类,没有生成相应的service层和controller层,当然网上也有一些相应的解决方案。 > > 如果想追求更高效的开发,可以尝试使用mybatis-plus,国人开发的利器,完全兼容mybatis。对mybatis只做增强,不做修改。
superadmin
2023年9月21日 10:27
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码