一、使用注解
这里是通过全注解的方式来写SQL,不写XML文件,@Select 、@Insert 、@Update以及@Delete 四个注解分别对应XML中的 select、 insert 、 update 以及 delete 标签,
@Results注解类似于XML中的ResultMap映射文件(getUserById方法给查询结果的字段取别名主要是向小伙伴们演示下@Results注解的用法),
另外使用@SelectKey注解可以实现主键回填的功能,即当数据插入成功后,插入成功的数据id会赋值到user对象的id属性上。
此处演示用的是SQL Server数据库。实际开发中导入的Maven依赖按照自己的数据库。
1、添加 pom.xml 文件。

<!-- https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc --> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.20</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency>
2、在application.properties中配置数据库的基本信息(配置数据源细节参考上篇文章)。

server.port=8001 #mybatis相关配置 mybatis.type-aliases-package=com.springboot.com.model #mybatis.config-location=classpath\:mapper/*.xml #Druid 相关配置 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver spring.datasource.url=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=Sync_temp3 spring.datasource.username=sa spring.datasource.password=123 #连接池初始化大小 spring.datasource.druid.initial-size=10 #连接池最大连接数 spring.datasource.druid.max-active=100 #最小连接数 spring.datasource.druid.min-idle=10 #请求获取连接的超时时间 毫秒 spring.datasource.druid.max-wait=60000 #打开PSCache,并且指定每个连接上PSCache的大小 spring.datasource.druid.pool-prepared-statements=true spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 spring.datasource.druid.time-between-eviction-runs-millis=20 #配置一个连接在池中最小生存的时间,单位是毫秒 spring.datasource.druid.min-evictable-idle-time-millis=30000 spring.datasource.druid.validation-query=SELECT 1 spring.datasource.druid.test-while-idle=true spring.datasource.druid.test-on-borrow=false spring.datasource.druid.test-on-return=false #配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 spring.datasource.druid.filters=stat,log4j # WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter #是否启用StatFilter默认值true spring.datasource.druid.web-stat-filter.enabled=true ##spring.datasource.druid.web-stat-filter.url-pattern= spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/* # StatViewServlet配置,说明请参考Druid Wiki,配置_StatViewServlet配置 #是否启用StatViewServlet默认值true spring.datasource.druid.stat-view-servlet.enabled=true spring.datasource.druid.stat-view-servlet.url-pattern=/druid/* spring.datasource.druid.stat-view-servlet.reset-enable=false spring.datasource.druid.stat-view-servlet.login-username=admin spring.datasource.druid.stat-view-servlet.login-password=123456 # LOG4J配置 log4j.rootCategory=INFO,stdout # 控制台输出 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
3、编写相关的 Service 、Dao、Model 文件。
实体类:

public class CompanyModel { public String companyCode; public String companyName; public String Address; public String getCompanyCode() { return companyCode; } public void setCompanyCode(String companyCode) { this.companyCode = companyCode; } public String getCompanyName() { return companyName; } public void setCompanyName(String companyName) { this.companyName = companyName; } public String getAddress() { return Address; } public void setAddress(String address) { Address = address; } }
Service:

public interface IUserService { /* 查询数据列表 */ List<CompanyModel> getList(); /* 查询数据列表 */ List<CompanyModel> getList(UserModel searchModel); /* 删除用户 */ int DeleteUser(int i); /* 异常测试 */ int UpdateUser(UserModel model); } @Service public class UserServiceImp implements IUserService { @Autowired private CompanyMapper companyMapper; /* 查询数据列表 */ public List<CompanyModel> getList() { List<CompanyModel> list = null; try { list = companyMapper.selectUserList(); } catch (Exception ex) { throw ex; } return list; } /* 查询数据列表 */ public List<CompanyModel> getList(UserModel searchModel) { List<CompanyModel> list = null; int result = 0; try { list = companyMapper.selectUserListByName("dhgk"); } catch (Exception ex) { throw ex; } return list; } /* 删除用户 */ @LogAnnotion(executeName = "用户删除") public int DeleteUser(int i) { int result = companyMapper.DeleteUser(561); return result; } /* 更新用户 */ public int UpdateUser(UserModel model) { int result; result = companyMapper.UpdateUser(model); return result; } }
Mapper:

//@Mapper public interface CompanyMapper { /* 查询列表 */ @Select("SELECT TOP 1000 UserName AS companyCode,UnitName AS companyName,Address AS Address " + "FROM User_Enterprise") List<CompanyModel> selectUserList(); /* 根据条件查询 */ @Select("SELECT UserName AS companyCode,UnitName AS companyName,Address AS Address " + "FROM User_Enterprise" + " WHERE UserName !='${companyName}'") List<CompanyModel> selectUserListByName(String companyName); /* 删除数据 */ @Delete("DELETE User_Enterprise WHERE ID=#{id}") Integer DeleteUser(Integer id); /* 更新数据 */ @Update("UPDATE User_Enterprise SET IsDelete=1,UserName=#{userName} WHERE ID=#{id}") Integer UpdateUser(UserModel model); }
注意:此处把 Mapper 交给 Spring 进行管理有两种方式,可以在 Mapper 文件上加上 @Mapper 注解,或者在启动类上添加 @MapperScan() 注解。
此处我选择的是 @MapperScan() 注解。

@SpringBootApplication @MapperScan(basePackages ={"com.springboot.com.mapper"}) public class SpringbootApplication { public static void main(String[] args) { SpringApplication.run(SpringbootApplication.class, args); } }
我的项目路径:
二、使用 ***Mapper.xml 配置文件方式
1、在启动类上添加 @MapperScan() 注解。
2、在 application.properties 配置 **Mapper.xml 配置文件的位置。
#mybatis相关配置 mybatis.mapper-locations=classpath:mapper/*.xml
#打印SQL--参数和查询结果 这个配置会将执行的sql打印出来,在开发或测试的时候可以用 mybatis.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl #定义LOG输出级别 log4j.rootLogger=error, Console # 控制台输出 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
org.apache.ibatis.logging.stdout.StdOutImpl: 这个是可以打印sql、参数、查询结果的
org.apache.ibatis.logging.log4j.Log4jImpl : 这个不打印查询结果三、打印SQL
3、Service层

public interface IUserService { /* 查询数据列表 */ List<CompanyModel> getList(); /* 查询数据列表 */ List<CompanyModel> getList(UserModel searchModel); /* 删除用户 */ Integer DeleteUser(int i); /* 异常测试 */ int UpdateUser(UserModel model); } @Service public class UserServiceImp implements IUserService { @Autowired private CompanyMapper companyMapper; /* 查询数据列表 */ public List<CompanyModel> getList() { List<CompanyModel> list = null; try { list = companyMapper.selectUserList(); } catch (Exception ex) { throw ex; } return list; } /* 查询数据列表 */ public List<CompanyModel> getList(UserModel searchModel) { List<CompanyModel> list = null; int result = 0; try { list = companyMapper.selectUserListByName("dhgk"); } catch (Exception ex) { throw ex; } return list; } /* 删除用户 */ // @LogAnnotion(executeName = "用户删除") public Integer DeleteUser(int i) { int result = companyMapper.DeleteUser(576); return result; } /* 更新用户 */ public int UpdateUser(UserModel model) { int result; result = companyMapper.UpdateUser(model); return result; } }
4、Mapper.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.springboot.com.mapper.CompanyMapper"> <!--查询所有数据--> <select id="selectUserList" resultType="com.springboot.com.model.CompanyModel"> SELECT TOP 1000 UserName AS companyCode,UnitName AS companyName,Address AS Address FROM User_Enterprise </select> <!--根据查询条件-查询所有数据--> <select id="selectUserListByName" resultType="com.springboot.com.model.CompanyModel" parameterType="java.lang.String"> SELECT TOP 1000 UserName AS companyCode,UnitName AS companyName,Address AS Address FROM User_Enterprise WHERE UserName !='${companyName}' </select> <!--删除数据--> <delete id="DeleteUser" parameterType="java.lang.Integer"> DELETE User_Enterprise WHERE ID=#{id} </delete> <!--修改数据--> <update id="UpdateUser" parameterType="com.springboot.com.model.CompanyModel"> UPDATE User_Enterprise SET IsDelete=1,UserName=#{userName} WHERE ID=#{id} </update> </mapper>
三、使用 PageHelper 分页查询
1、添加 Maven 依赖
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.10</version> </dependency>
2、添加分页配置
#PageHelper相关配置 pagehelper.helper-dialect=sqlserver #分页合理化参数, # 默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, # pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。 pagehelper.reasonable=true #支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。 pagehelper.support-methods-arguments=true #为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, # 可以配置pageNum,pageSize,count,pageSizeZero,reasonable, # 不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero pagehelper.params=count=countSql #如果 pageSize=0 就会查询出全部的结果(相当于没有执行分页查询) pagehelper.page-size-zero=true
3、代码调用 :
/* 查询数据列表 */ public PageInfo<CompanyModel> getList() { PageInfo<CompanyModel> pageInfo; try { PageHelper.startPage(1,10); List<CompanyModel> list = companyMapper.selectUserList(); pageInfo=new PageInfo<CompanyModel>(list); } catch (Exception ex) { throw ex; } return pageInfo; }
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决