当前位置: 首页 > wzjs >正文

新闻系统网站开发dw实训总结报告重庆建设工程造价管理协会

新闻系统网站开发dw实训总结报告,重庆建设工程造价管理协会,wordpress设置主题,广州网站改版方案以下是使用MyBatis注解方式的完整示例,涵盖CRUD、动态SQL、分页、事务管理等场景,并附详细注释和对比表格: 项目结构 mybatis-annotation-demo/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com.example/…

以下是使用MyBatis注解方式的完整示例,涵盖CRUD、动态SQL、分页、事务管理等场景,并附详细注释和对比表格:
在这里插入图片描述


项目结构

mybatis-annotation-demo/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com.example/
│   │   │       ├── entity/
│   │   │       ├── mapper/
│   │   │       ├── service/
│   │   │       └── config/
│   │   └── resources/
│   │       ├── mybatis-config.xml
│   │       └── schema.sql
│   └── test/
│       └── java/
│           └── com.example/
│               └── MyBatisTest.java
├── pom.xml

1. Maven依赖(pom.xml)

<dependencies><!-- MyBatis核心 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.10</version></dependency><!-- 数据库驱动 --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.30</version></dependency><!-- JUnit测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency>
</dependencies>

2. 数据库表(schema.sql)

CREATE TABLE user (id BIGINT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(255) NOT NULL,email VARCHAR(255) UNIQUE NOT NULL
);CREATE TABLE order (id BIGINT PRIMARY KEY AUTO_INCREMENT,user_id BIGINT,amount DECIMAL(10,2) NOT NULL,FOREIGN KEY (user_id) REFERENCES user(id)
);

3. 实体类(User.java & Order.java)

// User.java
public class User {private Long id;private String name;private String email;// Getters and Setters
}// Order.java
public class Order {private Long id;private Long userId;private BigDecimal amount;// Getters and Setters
}

4. MyBatis全局配置(mybatis-config.xml)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><package name="com.example.mapper"/></mappers>
</configuration>

5. Mapper接口(UserMapper.java)

import org.apache.ibatis.annotations.*;
import java.util.List;public interface UserMapper {// === 基础CRUD ===@Insert("INSERT INTO user (name, email) VALUES (#{name}, #{email})")@Options(useGeneratedKeys = true, keyProperty = "id")void insertUser(User user); // 新增用户@Select("SELECT * FROM user WHERE id = #{id}")User selectUserById(Long id); // 根据ID查询@Update("UPDATE user SET name = #{name}, email = #{email} WHERE id = #{id}")void updateUser(User user); // 更新用户@Delete("DELETE FROM user WHERE id = #{id}")void deleteUser(Long id); // 删除用户// === 动态SQL ===@Select("SELECT * FROM user WHERE name LIKE CONCAT('%', #{keyword}, '%')")List<User> searchUsersByName(@Param("keyword") String keyword); // 模糊查询// === 关联查询 ===@Results({@Result(id = true, column = "id", property = "id"),@Result(column = "name", property = "name"),@Result(column = "email", property = "email"),@Result(property = "orders", column = "id", javaType = List.class,many = @Many(select = "com.example.mapper.OrderMapper.selectOrdersByUserId"))})@Select("SELECT * FROM user WHERE id = #{id}")User selectUserWithOrders(Long id); // 通过ID查询用户及其订单// === 分页 ===@Select("SELECT * FROM user LIMIT #{offset}, #{limit}")List<User> selectUsersByPage(@Param("offset") int offset,@Param("limit") int limit);// === 事务管理 ===@Insert("INSERT INTO user (name, email) VALUES (#{name}, #{email})")@SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "id", before = false, resultType = Long.class)void insertWithTransaction(User user); // 带事务的插入
}

6. Service层(UserService.java)

import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSession;
import java.util.List;public class UserService {private final SqlSessionFactory sqlSessionFactory;public UserService(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory = sqlSessionFactory;}public void addUser(User user) {try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);mapper.insertUser(user);session.commit();}}public List<User> searchUsers(String keyword) {try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);return mapper.searchUsersByName(keyword);}}// 其他方法类似...
}

7. 测试类(MyBatisTest.java)

import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;public class MyBatisTest {private SqlSessionFactory sqlSessionFactory;@Beforepublic void setup() {sqlSessionFactory = new SqlSessionFactoryBuilder().build(getClass().getResourceAsStream("/mybatis-config.xml"));}@Testpublic void testInsert() {User user = new User();user.setName("John");user.setEmail("john@example.com");UserService service = new UserService(sqlSessionFactory);service.addUser(user);System.out.println("Inserted user ID: " + user.getId());}// 其他测试方法...
}

8. 核心注解对比表

注解作用使用场景示例
@Insert定义插入操作新增数据@Insert("INSERT INTO user (name, email) VALUES (#{name}, #{email})")
@Select定义查询操作查询单条或多条数据@Select("SELECT * FROM user WHERE id = #{id}")
@Update定义更新操作修改数据@Update("UPDATE user SET name = #{name} WHERE id = #{id}")
@Delete定义删除操作删除数据@Delete("DELETE FROM user WHERE id = #{id}")
@Param标记参数名多参数传递时指定参数名@Param("keyword") String keyword
@Options配置操作选项(如主键回填)需要自动生成主键时@Options(useGeneratedKeys = true, keyProperty = "id")
@Results定义复杂结果映射处理多表关联查询(如嵌套对象)@Result(property = "orders", column = "id", many = @Many(...))
@SelectKey定义主键生成逻辑需要自定义主键生成逻辑(如UUID)@SelectKey(statement = "SELECT UUID()", keyProperty = "id", before = true)
@ResultMap引用外部定义的@Results复用结果映射配置@Select("...") @ResultMap("userWithOrders")

9. 关键差异总结

特性注解方式XML方式
代码耦合度与Java代码强耦合,注解直接写在方法上XML文件独立,与Java代码解耦
可读性简单查询可读性高,复杂查询易混乱XML结构清晰,适合复杂SQL
动态SQL支持需结合@Select拼接字符串,灵活性有限XML支持<if>, <choose>, <foreach>等标签
维护成本小型项目维护简单,大型项目易产生代码冗余XML集中管理SQL,便于统一维护
性能优化难以复用SQL片段XML可定义<sql>片段复用
适用场景简单CRUD操作、快速开发复杂查询、多表关联、企业级项目

10. 最佳实践建议

  1. 简单场景:优先使用注解(如@Select/@Insert),代码简洁。
  2. 复杂场景:改用XML(如动态SQL、多表关联),避免注解拼接字符串的可读性问题。
  3. 分页与分页:注解适合固定分页逻辑,复杂分页建议结合RowBounds或自定义插件。
  4. 事务管理:通过Spring AOP或SqlSession显式控制事务边界。
  5. 结果映射:复杂对象关联建议使用XML的<resultMap>,避免注解嵌套过深。

文章转载自:

http://X4Ys9YXQ.pfLpb.cn
http://IDuToVz9.pfLpb.cn
http://ZEkhWoUB.pfLpb.cn
http://m5RLaW5C.pfLpb.cn
http://Eus8x0Ne.pfLpb.cn
http://GG2bP2fC.pfLpb.cn
http://fCX6plLv.pfLpb.cn
http://GYMMAaAM.pfLpb.cn
http://BntA9WSe.pfLpb.cn
http://jv03ygXF.pfLpb.cn
http://kvpr59ru.pfLpb.cn
http://8TqmZS2f.pfLpb.cn
http://tR1oIAjk.pfLpb.cn
http://YQBdQuCR.pfLpb.cn
http://BSKaqIS8.pfLpb.cn
http://RfZXRNs9.pfLpb.cn
http://9AE6T7xQ.pfLpb.cn
http://4p9fesfy.pfLpb.cn
http://gZUdsTcU.pfLpb.cn
http://wpD2TEoR.pfLpb.cn
http://mQnwXTXk.pfLpb.cn
http://XpTqQhIc.pfLpb.cn
http://PulO4BIc.pfLpb.cn
http://6VuGWMYF.pfLpb.cn
http://FvGjpFHW.pfLpb.cn
http://FugljcoC.pfLpb.cn
http://ywieLYi1.pfLpb.cn
http://9iPkYCTm.pfLpb.cn
http://t98G5qRq.pfLpb.cn
http://TetbigAv.pfLpb.cn
http://www.dtcms.com/wzjs/661924.html

相关文章:

  • 下步我院将建设网站信息保密网站代管理
  • 长春企业建站平台上海旅游网站建设情况
  • 北京建设信源资讯网站官网安徽省建设厅网站怎么进不去
  • 重庆企业网站推广费用html5 微信网站
  • 网站搜索排名高怎么做天津外贸网络推广
  • 公需道德与能力建设培训网站免费网站整站模板下载
  • 北京网站开发怎么做孩子学编程网上课程哪家好
  • 企业网站建设联系方式wordpress ssl部署
  • 行情软件免费下载的网站如何做网站首页关键词
  • 宜黄住房和城乡建设部网站公司装修办公楼
  • ps可以在哪个网站上做兼职做矿产公司的网站
  • 便捷网站建设多少钱wordpress仿站步骤
  • php工具箱是直接做网站的吗网站推广软件免费下载
  • 桂平逗乐游戏招聘网站开发公司网站建设及优化计划书
  • 望京做网站的公司中山东莞网站推广
  • 怎样设置网站访问权限小红书推广引流
  • 南昌网站seo技术重庆百度推广开户
  • 毕业设计做网站有什么好的创意太原网站建设与维护
  • 如何做彩票网站的教程wordpress 瀑布流分页
  • 有做企业网站的吗全国疫苗接种率
  • 重庆建设工程质量检测整站多关键词优化
  • 山西有哪些做网站的公司html 模板网站
  • 国内设计师个人网站欣赏网站空间 哪个公司好
  • 数据库对网站开发的作用傻瓜式搭建网站
  • 中核华泰建设有限公司网站外贸是做什么的工作内容是什么
  • 佛山网约车驾驶员资格证网上报名seo专员是什么意思
  • 网站建设大赛海报成品在线短视频免费入口
  • 建设电子商务网站论文校园网网站建设
  • 自己申请一个网站怎么做安卓网站开发ui
  • 怎么申请一个网站企业推广方式隐迅推知名