2026/1/21 7:15:57
网站建设
项目流程
制作网站的公司注册资本要多少,wordpress 侵权,?a品定制网站开发,网站移动端生成器在Java持久层开发领域#xff0c;MyBatis凭借其轻量化、高灵活性的特性#xff0c;成为连接Java应用与数据库的主流框架。它摒弃了JDBC繁琐的代码编写#xff0c;通过“接口XML”的映射模式#xff0c;让开发者专注于SQL逻辑本身。本文将基于一套完整的用户数据操作代码MyBatis凭借其轻量化、高灵活性的特性成为连接Java应用与数据库的主流框架。它摒弃了JDBC繁琐的代码编写通过“接口XML”的映射模式让开发者专注于SQL逻辑本身。本文将基于一套完整的用户数据操作代码从核心架构、模块解析到实战运行逻辑全方位拆解MyBatis实现CRUD增删改查、主键返回、模糊查询的核心流程帮助开发者快速掌握MyBatis的实战应用精髓。一、核心架构与前置依赖说明在深入代码解析前我们先明确这套实战代码的核心架构与运行依赖。整套代码遵循MyBatis“接口绑定SQL”的核心设计思想主要分为三大核心模块Mapper映射文件UserDao.xml存储所有数据库操作的SQL语句通过命名空间namespace与Dao接口建立绑定关系是MyBatis实现SQL与Java代码解耦的核心载体。Dao接口UserDao.java定义用户数据操作的抽象方法无需编写实现类——MyBatis会通过动态代理机制自动生成接口的实现类完成接口方法与Mapper中SQL语句的关联。测试类UserTest.java基于JUnit框架实现单元测试封装了MyBatis的初始化加载配置、创建SqlSession与资源释放逻辑为每个数据操作方法提供独立的测试入口。运行这套代码需提前引入以下核心依赖以Maven为例配置在pom.xml中确保MyBatis、数据库驱动及测试框架正常工作dependencies dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.31/version /dependency dependency groupIdorg.mybatis/groupId artifactIdmybatis/artifactId version3.4.5/version /dependency dependency groupIdjunit/groupId artifactIdjunit/artifactId version4.10/version /dependency /dependencies此外需准备MyBatis核心配置文件SqlMapConfig.xml用于配置数据库连接信息、Mapper映射文件扫描路径等核心参数这是MyBatis初始化的基础。SqlMapConfig.xml?xml version1.0 encodingUTF-8? !DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtd configuration environments defaultmysql environment idmysql !--配置事务的类型使用本地事务策略-- transactionManager typeJDBC/transactionManager !--是否使用连接池 POOLED表示使用链接池UNPOOLED表示不使用连接池-- dataSource typePOOLED property namedriver valuecom.mysql.cj.jdbc.Driver/ property nameurl valuejdbc:mysql://localhost:3306/mybatis_demo/ property nameusername value用户名/ property namepassword value密码/ /dataSource /environment /environments mappers mapper resourcemapper/UserMapper.xml/mapper /mappers /configuration二、核心模块深度解析模块1Mapper映射文件UserDao.xml—— SQL与接口的桥梁Mapper文件是MyBatis的核心配置文件之一每个SQL标签对应一个数据库操作通过属性与Dao接口的方法精准绑定。下面逐一对标签进行解析1.1 命名空间namespace绑定Dao接口文件开头的namespacedao.UserDao是核心绑定配置它指定当前Mapper文件对应dao包下的UserDao接口。MyBatis正是通过这个配置将SQL标签与接口中的方法建立映射关系。mapper namespacedao.UserDao //写Mybatis标签... /mapper1.2 查操作select标签的应用查操作是数据库最常用的操作对应两个核心方法查询所有用户findAll和根据ID查询用户findById。select idfindAll resultTypeentity.User select * from user /select select idfindById resultTypeentity.User parameterTypejava.lang.Integer select * from user where id #{id} /selectfindAll方法对应标签select idfindAll resultTypeentity.User。idfindAll与UserDao接口中的findAll()方法名一致resultTypeentity.User指定查询结果的返回类型——将查询到的每条记录封装为entity包下的User实体类对象最终返回User对象的集合ListUser。SQL语句select * from user用于查询user表中的所有记录。findById方法对应标签select idfindById resultTypeentity.User parameterTypejava.lang.Integer。新增的parameterTypejava.lang.Integer指定方法的参数类型为Integer即接口中findById(int id)的int类型自动装箱为IntegerSQL语句select * from user where id #{id}中的#{id}是MyBatis的参数占位符用于接收接口方法传入的id参数实现精准查询。1.3 增操作insert标签的两种场景增操作对应两个标签普通插入insertUser和插入并返回主键insertGetId满足不同业务场景需求。insert idinsertUser parameterTypeentity.User insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) /insert insert idinsertGetId parameterTypeentity.User selectKey keyPropertyid resultTypeint orderAFTER select LAST_INSERT_ID() /selectKey insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) /insert普通插入insertUser标签insert idinsertUser parameterTypeentity.User中parameterTypeentity.User指定参数类型为User实体类——接口方法insertUser(User user)接收User对象SQL语句中#{username}、#{birthday}等占位符分别对应User对象的username、birthday等属性通过getter方法获取属性值实现将User对象的数据插入到user表的对应字段中。插入并返回主键insertGetId在很多业务场景中插入数据后需要获取自动生成的主键如user表的id字段为自增主键此时需借助selectKey子标签。标签中keyPropertyid指定将查询到的主键值封装到User对象的id属性中resultTypeint指定主键类型为intorderAFTER表示先执行插入操作再执行查询主键的操作因为自增主键需先插入数据才能生成。子标签内的select LAST_INSERT_ID()是MySQL的内置函数用于获取最后一次插入操作生成的自增主键值。后续的插入SQL与普通插入一致最终插入成功后传入的User对象的id属性会被赋值为生成的主键。1.4 改操作update标签的应用update idupdate parameterTypeentity.User update user set username #{username},birthday #{birthday},sex #{sex},address #{address} where id #{id} /update改操作对应update标签update idupdate parameterTypeentity.User。idupdate与接口的update(User user)方法绑定参数类型仍为User实体类。SQL语句update user set username #{username},birthday #{birthday},sex #{sex},address #{address} where id #{id}中通过User对象的属性值更新user表的对应字段where条件中的id用于定位要更新的记录确保更新的精准性。1.5 删操作delete标签的应用delete iddelete parameterTypejava.lang.Integer delete from user where id #{id} /delete删操作对应delete标签delete iddelete parameterTypejava.lang.Integer。iddelete与接口的delete(int id)方法绑定参数类型为Integer。SQL语句delete from user where id #{id}通过传入的id参数删除user表中对应的记录。1.6 模糊查询likeByName方法select idlikeByName resultTypeentity.User parameterTypejava.lang.String select * from user where username like concat(%,#{username},%) /select模糊查询对应likeByName方法标签为select idlikeByName resultTypeentity.User parameterTypejava.lang.String。参数类型为String接收用户名关键字SQL语句select * from user where username like concat(%,#{username},%)中使用MySQL的concat函数拼接模糊查询的通配符%%表示任意长度的字符实现“包含关键字”的模糊查询。例如传入“小”则查询所有用户名为“小明”“小王”等包含“小”字的用户。这种拼接方式可避免SQL注入风险比直接拼接字符串更安全。模块2Dao接口UserDao.java—— 数据操作的抽象定义UserDao是一个纯接口仅定义数据操作的方法签名无需编写实现类。MyBatis的动态代理机制会在运行时自动生成接口的实现类将接口方法与Mapper中的SQL标签关联起来。接口方法的设计需遵循以下核心规则方法名必须与Mapper文件中对应SQL标签的id属性完全一致如findAll对应idfindAll。方法的参数类型必须与Mapper标签的parameterType属性一致或兼容如int与Integer可兼容。方法的返回值类型必须与Mapper标签的resultType属性一致集合类型需对应单个实体类类型如ListUser对应resultTypeentity.User。public interface UserDao { public ListUser findAll(); public User findById(int id); public Integer insertUser(User user); public int update(User user); public int delete(int id); public Integer insertGetId(User user); public ListUser likeByName(String username); }接口中7个方法的对应关系清晰findAll()对应查询所有用户返回ListUserfindById(int id)对应根据ID查询单个用户返回UserinsertUser(User user)对应普通插入返回Integer影响的行数update(User user)对应更新操作返回int影响的行数delete(int id)对应删除操作返回int影响的行数insertGetId(User user)对应插入并返回主键返回Integer影响的行数主键通过User对象的id属性获取likeByName(String username)对应模糊查询返回ListUser。模块3测试类UserTest.java—— 验证数据操作的正确性UserTest类基于JUnit 4框架编写通过Before、After、Test注解实现测试流程的自动化。核心逻辑是封装MyBatis的初始化与资源释放确保每个测试方法独立、可重复执行。3.1 成员变量与初始化方法init类中定义了三个核心成员变量InputStream in用于读取MyBatis核心配置文件、SqlSession sessionMyBatis的核心会话对象用于执行SQL操作、UserDao mapperUserDao接口的代理对象通过它调用接口方法。Before注解标记的init()方法会在每个Test方法执行前执行完成MyBatis的初始化通过Resources.getResourceAsStream(SqlMapConfig.xml)加载核心配置文件获取输入流in。通过SqlSessionFactoryBuilder的build()方法传入输入流in创建SqlSessionFactory对象SqlSessionFactory是创建SqlSession的工厂线程安全通常整个应用只创建一个。通过SqlSessionFactory的openSession()方法创建SqlSession对象SqlSession是非线程安全的每个测试方法需独立创建用完及时关闭。通过SqlSession的getMapper(UserDao.class)方法获取UserDao接口的动态代理对象mapper后续通过mapper调用接口方法即可执行对应的SQL操作。public class UserTest { private InputStream in null; private SqlSession session null; private UserDao mapper null; Before //前置通知, 在方法执行之前执行 public void init() throws IOException { //加载主配置文件目的是为了构建SqlSessionFactory对象 in Resources.getResourceAsStream(SqlMapConfig.xml); //创建SqlSessionFactory对象 SqlSessionFactory factory new SqlSessionFactoryBuilder().build(in); //通过SqlSessionFactory工厂对象创建SqlSesssion对象 session factory.openSession(); //通过Session创建UserDao接口代理对象 mapper session.getMapper(UserDao.class); } }3.2 资源释放方法destoryAfter注解标记的destory()方法会在每个Test方法执行后执行完成资源的释放关闭SqlSession对象和输入流in。这是避免资源泄漏的关键步骤确保数据库连接等资源被及时回收。After //After: 后置通知, 在方法执行之后执行 。 public void destory() throws IOException { //释放资源 session.close(); in.close(); }3.3 各操作的测试方法每个Test注解标记的方法对应一个数据操作的测试逻辑清晰可独立运行验证findAll测试调用mapper.findAll()获取所有用户通过for循环遍历集合并打印User对象需确保User类重写了toString()方法否则打印的是对象地址。findById测试调用mapper.findById(1)查询id为1的用户打印查询到的User对象验证精准查询功能。insertUser测试创建User对象通过setter方法设置用户名、生日、性别、地址、id等属性调用mapper.insertUser(user)执行插入操作打印影响的行数插入成功返回1。注意MyBatis的SqlSession默认不自动提交事务因此需手动调用session.commit()提交事务否则插入操作不会生效。update测试创建User对象设置要更新的属性值重点是id用于定位记录调用mapper.update(user)执行更新操作打印影响的行数同样需调用session.commit()提交事务。delete测试调用mapper.delete(2)删除id为2的用户打印影响的行数调用session.commit()提交事务。insertGetId测试创建User对象设置除id外的其他属性id为自增调用mapper.insertGetId(user)执行插入操作插入成功后通过user.getId()即可获取生成的自增主键并打印最后提交事务。likeByName测试调用mapper.likeByName(小)查询所有用户名包含“小”字的用户遍历集合并打印验证模糊查询功能。Test public void findAll(){ ListUser users mapper.findAll(); for (User user:users){ System.out.println(user.toString()); } } Test public void findById(){ User user mapper.findById(1); System.out.println(user.toString()); } Test public void InsertUser(){ User user new User(); user.setUsername(小王); user.setBirthday(new Date()); user.setSex(女); user.setAddress(云南); user.setId(1); int count mapper.insertUser(user); System.out.println(count); session.commit(); } Test public void update(){ User user new User(); user.setUsername(小王); user.setBirthday(new Date()); user.setSex(女); user.setAddress(云南); user.setId(1); int count mapper.update(user); System.out.println(count); session.commit(); } Test public void delete(){ int count mapper.delete(2); System.out.println(count); session.commit(); } Test public void insertGetId(){ User user new User(); user.setUsername(王六); user.setBirthday(new Date()); user.setSex(男); user.setAddress(河北); mapper.insertGetId(user); System.out.println(user.getId()); session.commit(); } Test public void likeByName(){ ListUser users mapper.likeByName(小); for (User user:users){ System.out.println(user.toString()); } }三、核心运行流程与原理总结结合上述三个模块整套MyBatis用户操作的核心运行流程可总结为以下几步加载配置测试方法执行前通过init()方法加载SqlMapConfig.xml配置文件创建SqlSessionFactory对象。创建会话与代理对象通过SqlSessionFactory创建SqlSession对象再通过SqlSession获取UserDao接口的动态代理对象mapper。执行SQL调用mapper的对应方法如findAll()MyBatis通过动态代理机制根据接口方法名匹配Mapper文件中对应id的SQL标签解析SQL语句并传入参数。结果封装MyBatis执行SQL后将查询结果封装为指定的实体类对象或集合返回给调用者增删改操作则返回影响的行数。事务提交与资源释放增删改操作需手动提交事务session.commit()所有操作执行完成后通过destory()方法关闭SqlSession和输入流释放资源。四、实战价值与拓展思考这套代码覆盖了MyBatis的核心使用场景是实际开发中用户模块的基础模板。其核心价值在于解耦通过Mapper文件将SQL与Java代码分离便于SQL的维护与优化无需修改Java代码即可调整SQL。高效MyBatis自动完成参数映射与结果封装避免了JDBC繁琐的手动封装操作提升开发效率。灵活支持原生SQL编写可根据复杂业务场景定制SQL语句比全自动化ORM框架如Hibernate更灵活。拓展思考在实际开发中可基于这套代码进行优化例如使用分页插件实现分页查询、通过resultMap解决实体类属性与数据库字段名不一致的问题、配置事务管理器实现自动提交事务、使用注解替代部分XML配置等。掌握这套基础流程后再学习这些高级特性会更加轻松。总结本文通过完整的代码案例从模块解析、运行流程到实战价值全面讲解了MyBatis实现用户CRUD操作的核心逻辑。希望通过本文的解析能帮助开发者快速掌握MyBatis的实战应用为后续开发复杂的持久层模块奠定基础。