Java 中的 CRUD(Create、Read、Update、Delete)操作是数据持久化的基础操作,通常用于与数据库交互。目前随着技术发展,CRUD的开发越来越简便。
涉及技术栈:Spring;Spring boot; MyBATis; Maven; Mybatis-plus
(数据库需要自己去写,至少得有一个吧)
(只提供到后端接口,没有前端)
1.注解写法下的CRUD
项目结构:
pojo/entity/domain:实体类,顾名思义里面存放的就是对应数据库的各种实体。如我这里里面有一个user类对应数据库中的用户表。在这个实体类中存在它的属性以及getter,setter,有参,无参,toString方法。
package com.imut.sccos.pojo; public class User { private Integer id; private String username; private String password; private String userrole; private String phone; private String avatar; private Integer isdelete; public Integer getIsdelete() { return isdelete; } public void setIsdelete(Integer isdelete) { this.isdelete = isdelete; } 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 getUserrole() { return userrole; } public void setUserrole(String userrole) { this.userrole = userrole; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getAvatar() { return avatar; } public void setAvatar(String avatar) { this.avatar = avatar; } public User(Integer id, String username, String password, String userrole, String phone, String avatar, Integer isdelete) { this.id = id; this.username = username; this.password = password; this.userrole = userrole; this.phone = phone; this.avatar = avatar; this.isdelete = isdelete; } public User() { } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + ", userrole='" + userrole + '\'' + ", phone='" + phone + '\'' + ", avatar='" + avatar + '\'' + ", isdelete=" + isdelete + '}'; } }
其中getter,setter,有参,无参,toString方法可以用注解的方法来优化省略不写(就是注解给你写了),具体如下:
引入依赖坐标lombok:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
@Data // getter setter toString @AllArgsConstructor // 有参构造 @NoArgsConstructor // 无参构造 public class Order { private Integer id; private Integer userId; private Integer productId; private Integer number; private Double price; private Double amount; private String productName; private String username; }
注意:如果有实体类报错最好不要用lombok,老实自己写方法就好了。
controller层:这个地方主要是写后端与前端链接的端口。接口一般有逻辑删除、修改、全部查询、条件查询。
@RestController @CrossOrigin//允许跨域访问 @RequestMapping("/user") public class UserController { @Autowired UserService userService; @GetMapping("/findUserByUsername") public List<User> findUserByUsername(User user){ return userService.findUserByUsername(user); } @GetMapping("/findUserById") public User findUserById(Integer id){ return userService.findUserById(id); } @RequestMapping("/editUser") public int editUser(User user){ return userService.editUser(user); } }
service层:这里是实现具体业务的地方,主要分为接口和实现类。
public interface UserService { public List<User> findUserByUsername(User user); public User findUserById(Integer id); public int editUser(User user); }
@Service public class UserServiceImpl implements UserService { @Autowired UserMapper userMapper; @Override public List<User> findUserByUsernamLWLFYWVCle(User user) { return userMapper.findUserByUsername(user); } @Override public User findUserById(Integer id) { return userMapper.findUserById(id); } @Override public int editUser(User user) { if (user.getId() != null && user.getId() >0){ return userMapper.updateByPrimaryKeySelective( user); }else{ return userMapper.insertSelective(user); } } }
注:注意这里的editUser,有人会问前面的接口为什么没有添加呢?这里面进行了判断:如果在修改时能够在数据库中能够获取到该id,那它就是修改操作;如果查不到,那就是新增操作。
mapper层:这一层用来和数据库进行交互。分为接口和实现文件。
@Mapper public interface UserMapper { //新增和修改,如果有id就是修改,没有则是新增 int insertSelective(User record); int updateByPrimaryKeySelective(User record); //根据id查询 User findUserById(Integer id); //根据名字,电话,角色模糊查询,还包含了逻辑删除 List<User> findUserByUsername(User user); }
<?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.imut.sccos.mapper.UserMapper"> <resultMap id="BaseResultMap" type="com.imut.sccos.pojo.User"> <id column="id" property="id" jdbcType="INTEGER"/> <result column="username" property="username" jdbcType="VARCHAR"/> <result column="password" property="password" jdbcType="VARCHAR"/> &ljavascriptt;result column="userrole" property="userrole" jdbcType="VARCHAR"/> <result column="phone" property="phone" jdbcType="VARCHAR"/> <result column="isdelete" property="isdelete" jdbcType="INTEGER"/> <result column="avatar" property="avatar" jdbcType="VARCHAR"/> </resultMap> <sql id="Base_Column_List"> id, username, password, userrole, phone, isdelete, avatar </sql> <!--新增操作--> <insert id="insertSelective" parameterType="com.imut.sccos.pojo.User"> insert into user <trim prefix="(" suffix=")" suffixOverrides=","> <if test="id != null"> id, </if> <if test="username != null"> username, </if> <if test="password != null"> password, </if> <if test="userrole != null"> userrole, </if> <if test="phone != null"> phone, </if> <if test="isdelete != null"> isdelete, </if> <if test="avatar != null"> avatar, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="id != null"> #{id,jdbcType=INTEGER}, </if> <if test="username != null"> #{username,jdbcType=VARCHAR}, </if> <if test="password != null"> #{password,jdbcType=VARCHAR}, </if> <if test="userrole != null"> #{userrole,jdbcType=VARCHAR}, </if> <if test="phone != null"> #{phone,jdbcType=VARCHAR}, </if> <if test="isdelete != null"> #{isdelete,jdbcType=INTEGER}, </if> <if test="avatar != null"> #{avatar,jdbcType=VARCHAR}, </if> </trim> </insert> <!--更新操作--> <update id="updateByPrimaryKeySelective" parameterType="com.imut.sccos.pojo.User"> update user <set> <if test="username != null"> username = #{username,jdbcType=VARCHAR}, </if> <if test="password != null"> password = #{password,jdbcType=VARCHAR}, </if> <if test="userrole != null"> userrole = #{userrole,jdbcType=VARCHAR}, </if> <if test="phone != null"> phone = #{phone,jdbcType=VARCHAR}, </if> <if test="isdelete != null"> isdelete = #{isdelete,jdbcType=INTEGER}, </if> <if test="avatar != null"> avatar = #{avatar,jdbcType=VARCHAR}, </if> </set> where id = #{id,jdbcType=INTEGER} </update> <!--条件查询用户信息,支持用户名,电话,角色查询--> <select id="findUserByUsername" parameterType="com.imut.sccos.pojo.User" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from user <where> isdelete = 0 <if test="username != null and username!=''"> and username like concat('%',#{username,jdbcType=VARCHAR},'%') </if> <if test ="userrole !=null and userrole !=''"> and userrole like concat('%',#{userrole,jdbcType=VARCHAR},'%') </if> <if test ="phone !=null and phone !=''"> and phone like concat('%',#{phone,jdbcType=VARCHAR},'%') </if> </where> order by id desc </select> <!--根据id查询--> <select id="findUserById" resultType="com.imut.sccos.pojo.User"> select <include refid="Base_Column_List" /> from user where id = #{id,jdbcType=INTEGER} </select> </mapper>
启动类:Spring boot项目自带的启动类,顾名思义就是用来启动项目的。
@SpringBootApplication @MapperScan("com.imut.sccos.mapper") //扫描mapper包位置 public class SccosApplication { public static void main(String[] args) { SpringApplication.run(SccosApplication.class, args); } }
2.配置类写法下的CRUD
emmm个人很不喜欢配置类,写的东西有点多,不愿意写,但是这种写法更容易搞清楚类与类之间的关系。了解即可。
3.使用Mybatis逆向工程生成CRUD
核心工具:Mybatis Generator(代码生成器)
他能直接把表结构转化为Mapper接口和xml文件,以及给你生成一份实体类。
导入依赖坐标:
<build> <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <configuration> <verbose>true</verbose> <overwrite>true</overwrite> </configuration> </plugin> </plugins> </build>
在resources下创建它的配置文件:
导入后找到该文件,复制它的路径,在下面的配置文件中需要用到。
<?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="datasource.properties">&www.devze.comlt;/properties>--> <!--1.修改点:指定特定数据库的jdbc驱动jar包的位置,复制到此处--> <classPathEntry location="C:\Users\user\.m2\repository\com\mysql\mysql-connector-j\8.0.33\mysql-connector-j-8.0.33.jar"/> <context id="default" targetRuntime="MyBatis3"> <!-- optional,旨在创建class时,对注释进行控制 --> <commentGenerator> <property name="suppressDate" value="true"/> <property name="suppressAllComments" value="true"/> </commentGenerator> <!--2.修改点:jdbc的数据库连接 --> <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/ld_mysql0317? characterEncoding=utf8 & useSSL=false & serverTimezone=UTC & rewriteBatchedStatements=true" userId="root" password="123456"> </jdbcConnection> <!-- 非必需,类型处理器,在数据库类型和java类型之间的转换控制--> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- Model模型生成器,用来生成含有主键key的类,记录类 以及查询Example类 targetPackage 指定生成的model生成所在的包名 targetProject 指定在该项目下所在的路径 --> <!--3.修改点:targetPackage:存储路径,修改这个即可<javaModelGenerator targetPackage="com.mmall.pojo" targetProject=".\src\main\java">--> <javaModelGenerator targetPackage="com.candy.bean" targetProject="./src/main/java"> <!-- 是否允许子包,即targetPackage.schemaName.tableName --> <property name="enableSubPackages" value="false"/> <!-- 是否对model添加 构造函数 --> <property name="constructorBased" value="true"/> <!-- 是否对类CHAR类型的列的数据进行trim操作 --> <property name="trimStrings" value="true"/> <!-- 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法,只有构造方法 --> <property name="immutable" value="false"/> </javaModelGenerator> <!--4.修改点:mapper映射文件生成所在的目录 为每一个数据库的表生成对应的SqlMap文件 --> <!--<sqlMapGenerator targetPackage="mappers" targetProject=".\src\main\resources">--> <sqlMapGenerator targetPackage="mapper" targetProject="./src/main/resources"> <property name="enableSubPackages" value="false"/> </sqlMapGenerator> <!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件 的代码 type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 --> <!-- 5:修改点:targetPackage:mapper接口dao生成的位置 --> <!--<javaClientGenerator type="XMLMAPPER" targetPackage="com.mmall.dao" targetProject=".\src\main\java">--> <javaClientGenerator type="XMLMAPPER" targetPackage="com.candy.dao" targetProject="./src/main/java"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false" /> </javaClientGenerator> <!-- <table tableName="mmall_shipping" domainObjectName="Shipping" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>--> <!-- <table tableName="mmall_cart" domainObjectName="Cart" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>--> <!-- <table tableName="mmall_cart_item" domainObjectName="CartItem" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>--> <!-- <table tableName="mmall_category" domainObjectName="Category" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>--> <!-- <table tableName="mmall_order" domainObjectName="Order" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>--> <!-- <table tableName="mmall_order_item" domainObjectName="OrderItem" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>--> <!-- <table tableName="mmall_pay_info" domainObjectName="PayInfo" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>--> <!-- <table tableName="mmall_product" domainObjectName="Product" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">--> <!-- <!– 数据库的表中这两个字段用的text,mybatis不同版本生成的不一样,所以改为VARCHAR –>--> <!-- <columnOverride column="detail" jdbcType="VARCHAR" />--> <!-- <columnOverride column="sub_images" jdbcType="VARCHAR" />--> <!-- </table>--> <!--6.修改点:tableName:你要对数据库中哪张表进行生成 domainObjectName:你要生成的对象叫什么名字--> <table tableName="userinfo" domainObjectName="UserInfo" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table> <table tableName="userinfo" domainObjectName="UserInfo" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table> <table tableName="userinfo" domainObjectName="UserInfo" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table> <!-- geelynote mybatis插件的搭建 --> </context> </generatorConfiguration>
注:看注释修改你的代码配置,不能直接拿来用
配置完毕后在Maven中点击该插件即可自动生成了:
4.使用Mybatis-plus代码生成器
官方网站:简介 | MyBatis-Plus
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
引入依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.31</version> <!-- 请根据需要选择合适的版本 --> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.16</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <annotationProcessorPaths> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </path> </annotationProcessorPaths> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build>
application.properties:配置数据库文件:
spring.application.name=自己的项目名字 server.port=8086 # MyBatis Plus Configuration spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/ld_mysql0317?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=123456
添加mapper扫描器:
@SpringBootApplication @MapperScan("com.candy.dao") //<----- public class NgdSpringbootMybatisPlus20250820Application { public static void main(String[] args) { SpringApplication.run(NgdSpringbootMybatisPlus20250820Application.class, args); } }
实体类:自己写一个实体类,具体写法上面有讲,可自己选择用不用lombok
mapper层:添加一个接口:
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.candy.bean.Userinfo; public interface UserinfoMapper extends BaseMapper<Userinfo> { }www.devze.com
然后就没有然后了,你可以在测试类测试是否成功添加:
@SpringBootTest class NgdSpringbootMybatisPlus20250820ApplicationTests { @Autowired UserInfoMapper userInfoMapper; @Test void contextLoads() { List<UserInfo> userInfos=userInfoMapper.selectList(null); for (UserInfo userInfo : userInfos) { System.out.println(userInfo); js } } }
注:实体类报错就不要用lombok了,老实自己写方法。
5.B站大佬的写法
【B站讲的最好的SpringBoot教程,一小时学会springboot快速上手+实战项目,让你少走99%弯路!】 https://www.bilibili.com/video/BV1fmvkeeEth/?share_source=copy_web&vd_source=3c83936ad44c69171f2fe73f94be606b
写法很专业,其中在mapper的实现里,一个接口上的继承实现CRUD,也很方便:
目前个人知道的就这些,有新技术在更
到此这篇关于Java:CRUD的快速实现的文章就介绍到这了,更多相关Java CRUD实现内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论