赞
踩
MyBatis的优势:
MyBatis的劣势:
MyBatis Plus的优势:
MyBatis Plus的劣势:
综上所述,MyBatis具有灵活性和可定制性高的优势,适合处理复杂的查询需求;而MyBatis Plus则提供了更多的便捷操作和增强功能,适合处理常规的增删改查操作。选择哪个框架取决于项目的需求和开发团队的偏好。
当使用MyBatis在实际的Spring Boot项目中,以下是一个更加符合真实项目的示例:
- <dependencies>
- <!-- MyBatis -->
- <dependency>
- <groupId>org.mybatis.spring.boot</groupId>
- <artifactId>mybatis-spring-boot-starter</artifactId>
- <version>VERSION</version>
- </dependency>
- <!-- 数据库驱动 -->
- <!-- 其他依赖 -->
- </dependencies>
products
:- @Data
- public class Product {
- private Long id;
- private String name;
- private BigDecimal price;
- // 其他属性和getter/setter方法
- }
- @Mapper
- public interface ProductMapper {
- void insert(Product product);
- void update(Product product);
- void delete(Long id);
- Product getById(Long id);
- List<Product> getAll();
- }
同时,创建对应的XML文件ProductMapper.xml,配置SQL语句:
- <mapper namespace="com.example.mapper.ProductMapper">
- <insert id="insert" parameterType="com.example.entity.Product">
- INSERT INTO products (name, price) VALUES (#{name}, #{price})
- </insert>
- <update id="update" parameterType="com.example.entity.Product">
- UPDATE products SET name=#{name}, price=#{price} WHERE id=#{id}
- </update>
- <delete id="delete" parameterType="java.lang.Long">
- DELETE FROM products WHERE id=#{id}
- </delete>
- <select id="getById" parameterType="java.lang.Long" resultType="com.example.entity.Product">
- SELECT id, name, price FROM products WHERE id=#{id}
- </select>
- <select id="getAll" resultType="com.example.entity.Product">
- SELECT id, name, price FROM products
- </select>
- </mapper>
- @Service
- public class ProductService {
- @Autowired
- private ProductMapper productMapper;
-
- public void createProduct(Product product) {
- productMapper.insert(product);
- }
-
- public void updateProduct(Product product) {
- productMapper.update(product);
- }
-
- public void deleteProduct(Long id) {
- productMapper.delete(id);
- }
-
- public Product getProductById(Long id) {
- return productMapper.getById(id);
- }
-
- public List<Product> getAllProducts() {
- return productMapper.getAll();
- }
- }
-
- @RestController
- @RequestMapping("/products")
- public class ProductController {
- @Autowired
- private ProductService productService;
-
- @PostMapping
- public ResponseEntity<String> createProduct(@RequestBody Product product) {
- productService.createProduct(product);
- return ResponseEntity.ok("Product created successfully");
- }
-
- @PutMapping("/{id}")
- public ResponseEntity<String> updateProduct(@PathVariable Long id, @RequestBody Product product) {
- Product existingProduct = productService.getProductById(id);
- if (existingProduct == null) {
- return ResponseEntity.notFound().build();
- }
- product.setId(id);
- productService.updateProduct(product);
- return ResponseEntity.ok("Product updated successfully");
- }
-
- @DeleteMapping("/{id}")
- public ResponseEntity<String> deleteProduct(@PathVariable Long id) {
- Product existingProduct = productService.getProductById(id);
- if (existingProduct == null) {
- return ResponseEntity.notFound().build();
- }
- productService.deleteProduct(id);
- return ResponseEntity.ok("Product deleted successfully");
- }
-
- @GetMapping("/{id}")
- public ResponseEntity<Product> getProductById(@PathVariable Long id) {
- Product product = productService.getProductById(id);
- if (product == null) {
- return ResponseEntity.notFound().build();
- }
- return ResponseEntity.ok(product);
- }
-
- @GetMapping
- public ResponseEntity<List<Product>> getAllProducts() {
- List<Product> products = productService.getAllProducts();
- return ResponseEntity.ok(products);
- }
- }
products
:- @Data
- @TableName("products")
- public class Product {
- @TableId(type = IdType.AUTO)
- private Long id;
- private String name;
- private BigDecimal price;
- // 其他属性和getter/setter方法
- }
- @Mapper
- public interface ProductMapper extends BaseMapper<Product> {
-
- }
- @Service
- public class ProductService {
- @Autowired
- private ProductMapper productMapper;
-
- public void createProduct(Product product) {
- productMapper.insert(product);
- }
-
- public void updateProduct(Product product) {
- productMapper.updateById(product);
- }
-
- public void deleteProduct(Long id) {
- productMapper.deleteById(id);
- }
-
- public Product getProductById(Long id) {
- return productMapper.selectById(id);
- }
-
- public List<Product> getAllProducts() {
- return productMapper.selectList(null);
- }
- }
-
- @RestController
- @RequestMapping("/products")
- public class ProductController {
- @Autowired
- private ProductService productService;
-
- @PostMapping
- public ResponseEntity<String> createProduct(@RequestBody Product product) {
- productService.createProduct(product);
- return ResponseEntity.ok("Product created successfully");
- }
-
- @PutMapping("/{id}")
- public ResponseEntity<String> updateProduct(@PathVariable Long id, @RequestBody Product product) {
- Product existingProduct = productService.getProductById(id);
- if (existingProduct == null) {
- return ResponseEntity.notFound().build();
- }
- product.setId(id);
- productService.updateProduct(product);
- return ResponseEntity.ok("Product updated successfully");
- }
-
- @DeleteMapping("/{id}")
- public ResponseEntity<String> deleteProduct(@PathVariable Long id) {
- Product existingProduct = productService.getProductById(id);
- if (existingProduct == null) {
- return ResponseEntity.notFound().build();
- }
- productService.deleteProduct(id);
- return ResponseEntity.ok("Product deleted successfully");
- }
-
- @GetMapping("/{id}")
- public ResponseEntity<Product> getProductById(@PathVariable Long id) {
- Product product = productService.getProductById(id);
- if (product == null) {
- return ResponseEntity.notFound().build();
- }
- return ResponseEntity.ok(product);
- }
-
- @GetMapping
- public ResponseEntity<List<Product>> getAllProducts() {
- List<Product> products = productService.getAllProducts();
- return ResponseEntity.ok(products);
- }
- }
这个示例展示了在一个Spring Boot项目中使用MyBatis Plus进行数据库操作的常见步骤,包括实体类定义、Mapper接口的创建以及在Service或Controller中调用Mapper接口。通过继承BaseMapper接口,可以直接使用MyBatis Plus提供的方法来完成增删改查操作,无需手动编写SQL语句。注意,具体的表名、字段名等需要根据实际情况进行修改。
products
:- @Data
- @TableName("products")
- public class Product {
- @TableId(type = IdType.AUTO)
- private Long id;
- private String name;
- private BigDecimal price;
- // 其他属性和getter/setter方法
- }
- public interface ProductService extends IService<Product> {
-
- }
-
- @Service
- public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
-
- }
- @RestController
- @RequestMapping("/products")
- public class ProductController {
- @Autowired
- private ProductService productService;
-
- @PostMapping
- public ResponseEntity<String> createProduct(@RequestBody Product product) {
- productService.save(product);
- return ResponseEntity.ok("Product created successfully");
- }
-
- @PutMapping("/{id}")
- public ResponseEntity<String> updateProduct(@PathVariable Long id, @RequestBody Product product) {
- Product existingProduct = productService.getById(id);
- if (existingProduct == null) {
- return ResponseEntity.notFound().build();
- }
- product.setId(id);
- productService.updateById(product);
- return ResponseEntity.ok("Product updated successfully");
- }
-
- @DeleteMapping("/{id}")
- public ResponseEntity<String> deleteProduct(@PathVariable Long id) {
- Product existingProduct = productService.getById(id);
- if (existingProduct == null) {
- return ResponseEntity.notFound().build();
- }
- productService.removeById(id);
- return ResponseEntity.ok("Product deleted successfully");
- }
-
- @GetMapping("/{id}")
- public ResponseEntity<Product> getProductById(@PathVariable Long id) {
- Product product = productService.getById(id);
- if (product == null) {
- return ResponseEntity.notFound().build();
- }
- return ResponseEntity.ok(product);
- }
-
- @GetMapping
- public ResponseEntity<List<Product>> getAllProducts() {
- List<Product> products = productService.list();
- return ResponseEntity.ok(products);
- }
- }
在这个示例中,通过继承MyBatis Plus提供的IService接口和ServiceImpl类,Service层可以直接使用MyBatis Plus提供的方法来完成单表数据的增删改查操作。在Controller层中,注入ProductService,并调用其提供的方法来处理业务逻辑。
在MyBatis Plus中,通过Service层继承Service类和Mapper层继承BaseMapper接口,都可以实现单表数据的增删改查操作。它们之间的区别主要体现在以下几个方面:
抽象层级:
Service层继承Service类:Service层是对业务逻辑进行抽象和封装的层级,负责处理复杂的业务逻辑,事务管理等。
Mapper层继承BaseMapper接口:Mapper层是与数据库交互的接口层级,负责执行SQL语句和数据库操作。
接口方法:
Service层:继承Service类后,会自动获得Service类中定义的一组CRUD方法,如save、update、remove、getById、list等,同时还可以定义自己的业务方法。
Mapper层:继承BaseMapper接口后,会自动获得BaseMapper接口中定义的一组CRUD方法,如insert、updateById、deleteById、selectById、selectList等。
动态SQL支持:
Service层:Service层一般不直接处理SQL语句,而是通过调用Mapper层的方法来执行SQL语句,可以利用MyBatis Plus提供的条件构造器Wrapper来进行动态查询。
Mapper层:Mapper层直接使用注解或XML编写SQL语句,提供了更灵活的操作方式,可以根据实际需求自由定义SQL语句。
事务管理:
Service层:Service层可以通过使用@Transactional注解或编程式事务管理来管理事务,保证数据的一致性和完整性。
Mapper层:Mapper层通常不涉及事务管理,它的主要职责是执行SQL操作。
综上所述,Service层继承Service类适用于处理复杂的业务逻辑,并提供了一组CRUD方法以及自定义的业务方法。Mapper层继承BaseMapper接口适用于直接执行SQL操作和灵活的动态SQL构造,但不具备业务逻辑处理能力。根据项目的具体情况,可以选择合适的方式来进行单表数据的增删改查操作。
MyBatis和MyBatis Plus都是优秀的持久层框架,适用于不同的场景。以下是它们各自适合使用的场景:
MyBatis适合的场景:
MyBatis Plus适合的场景:
总结来说,如果项目对SQL的灵活性要求较高,需要精细调整数据库连接等细节,或者开发人员有SQL开发经验,则可以选择MyBatis。如果项目只需进行简单的增删改查操作,追求快速开发和高效率,并且不强调对底层SQL的细节控制,可以选择MyBatis Plus。当然,这两个框架在实际使用中也可以结合起来,根据具体的项目需求进行选择与使用。
最近白嫖了一个chatgpt的学习网站,分享给大家:欢迎来到GPT (yantegpt.cn)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。