SSM学习笔记(8)_MyBatis_Day02_CRUD/配置文件
持久层接口和持久层接口的映射配置必须在 相同的包 下。 持久层映射配置中 SQL 语句的配置标签 持久层接口和持久层接口的映射配置必须在 相同的包 下。 持久层映射配置中 SQL 语句的配置标签 编写 QueryVo 类:
发布日期:2021-04-30 21:01:28
浏览次数:103
分类:精选文章
本文共 8905 字,大约阅读时间需要 29 分钟。
MyBatis CRUD 操作与环境配置
1. MyBatis 的 CRUD 操作
1.1 数据库与实体类一致
当数据库文件的列名与实体类的属性名一致时,可以直接使用 MyBatis 的代理 DAO 操作。以下是使用要求:
<mapper> 标签的 namespace 属性取值必须是持久层接口的全限定类名。<select>, <insert>, <delete>, <update> 的 id 属性必须和持久层接口的方法名相同。1.2 环境配置
POM.xml
4.0.0 com.itheima day02_eesy_01mybatisCRUD 1.0-SNAPSHOT jar org.mybatis mybatis 3.4.5 mysql mysql-connector-java 5.1.6 log4j log4j 1.2.12 junit junit 4.10
实体类 User
public class User { private Integer id; private String username; private String address; private String sex; private Date birthday; // set、get、toString 方法} SqlMapConfig.xml
接口 IUserDao
package com.itheima.dao;public interface IUserDao { List findAll(); void saveUser(User user); void updateUser(User user); void deleteUser(Integer userId); User findById(Integer userId); List findByName(String username); int findTotal(); List findByVo(QueryVo vo);} 测试类 MyTest
package com.itheima.test;import com.itheima.dao.IUserDao;import com.itheima.domain.User;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;import java.io.InputStream;import java.util.Date;import java.util.List;public class MyTest { private InputStream in; private SqlSession sqlSession; private IUserDao userDao; @Before public void init() throws Exception { in = Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); sqlSession = factory.openSession(); userDao = sqlSession.getMapper(IUserDao.class); } @After public void destroy() throws Exception { sqlSession.commit(); sqlSession.close(); in.close(); } @Test public void testFindAll() { List users = userDao.findAll(); for (User user : users) { System.out.println(user); } } @Test public void testSave() { User user = new User(); user.setUsername("modify User property"); user.setAddress("北京市顺义区"); user.setSex("男"); user.setBirthday(new Date()); userDao.saveUser(user); } @Test public void testUpdate() { User user = new User(); user.setId(49); user.setUsername("mybatis update user"); user.setAddress("北京市顺义区"); user.setSex("女"); user.setBirthday(new Date()); userDao.updateUser(user); } @Test public void testDelete() { userDao.deleteUser(48); } @Test public void testFindOne() { User user = userDao.findById(49); System.out.println(user); } @Test public void testFindByName() { List users = userDao.findByName("%王%"); for (User user : users) { System.out.println(user); } } @Test public void testFindTotal() { int count = userDao.findTotal(); System.out.println(count); }} IUserDao.xml
insert into user (username, address, sex, birthday) values (#{username}, #{address}, #{sex}, #{birthday}); update user set username=#{username}, address=#{address}, sex=#{sex}, birthday=#{birthday} where id=#{id}; delete from user where id = #{uid};
2. CRUD 操作
2.1 数据库与实体类一致
当数据库文件的列名与实体类的属性名一致时,可以直接使用 MyBatis 的代理 DAO 操作。以下是使用方法:
<mapper> 标签的 namespace 属性取值必须是持久层接口的全限定类名。<select>, <insert>, <delete>, <update> 的 id 属性必须和持久层接口的方法名相同。2.2 传递 POJO 包装对象
当需要传递复杂查询条件时,可以使用 POJO 包装对象。以下是使用方法:
package com.itheima.domain;public class QueryVo { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; }} - 在持久层接口中添加方法:
- 在映射文件中配置:
- 在测试类中使用:
- 在 SQL 语句中使用别名:
- 配置查询结果的列名和实体类的属性名的对应关系:
- 在插入操作中使用
selectKey获取自增字段值: - 语法:MyBatis 使用 XML 配置文件,而 JDBC 使用注解或代码配置。
- 参数传递:MyBatis 支持通过参数映射传递对象,而 JDBC 通常使用 PreparedStatement。
- 缓存:MyBatis 提供缓存机制,JDBC 缓存机制较为简单。
- 定制化:MyBatis 配置更加灵活,支持动态 SQL 和复杂查询。
- 获取 SqlSessionFactory 实例。
- 获取 SqlSession 对象。
- 执行 SQL 语句(如 selectList、insert、update、delete、selectOne)。
- 提交事务。
- 释放 SqlSession 和 SqlSessionFactory。
public interface IUserDao { List findByVo(QueryVo vo);} @Testpublic void testFindByQueryVo() { QueryVo vo = new QueryVo(); User user = new User(); user.setUsername("%王"); vo.setUser(user); List users = userDao.findByVo(vo); for (User u : users) { System.out.println(u); }} 2.3 数据库与实体类不一致
当数据库文件的列名与实体类的属性名不一致时,可以通过以下方法解决:
select last_insert_id(); insert into user (username, address, sex, birthday) values (#{userName}, #{userAddress}, #{userSex}, #{userBirthday});
3. MyBatis 与 JDBC 的比较
MyBatis 和 JDBC 在以下方面有显著区别:
4. SqlMapConfig.xml 配置文件
4.1 properties 标签
可以在 <properties> 标签内配置数据库连接信息:
可以使用外部文件配置:
然后在数据源标签中引用:
4.2 typeAliases 标签
在 SqlMapConfig.xml 中配置类型别名:
4.3 mappers 标签
配置映射文件路径:
或使用 mapper 接口路径:
注册指定包下的所有 mapper 接口:
5. MyBatis 传统开发方式
5.1 代码编写
UserDaoImpl
package com.itheima.dao.impl;import com.itheima.dao.IUserDao;import com.itheima.domain.User;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import java.util.List;public class UserDaoImpl implements IUserDao { private SqlSessionFactory factory; public UserDaoImpl(SqlSessionFactory factory) { this.factory = factory; } public List findAll() { SqlSession session = factory.openSession(); List users = session.selectList("com.itheima.dao.IUserDao.findAll"); session.close(); return users; } public void saveUser(User user) { SqlSession session = factory.openSession(); session.insert("com.itheima.dao.IUserDao.saveUser", user); session.commit(); session.close(); } public void updateUser(User user) { SqlSession session = factory.openSession(); session.update("com.itheima.dao.IUserDao.updateUser", user); session.commit(); session.close(); } public void deleteUser(Integer userId) { SqlSession session = factory.openSession(); session.update("com.itheima.dao.IUserDao.deleteUser", userId); session.commit(); session.close(); } public User findById(Integer userId) { SqlSession session = factory.openSession(); User user = session.selectOne("com.itheima.dao.IUserDao.findById", userId); session.close(); return user; } public List findByName(String username) { SqlSession session = factory.openSession(); List users = session.selectList("com.itheima.dao.IUserDao.findByName", username); session.close(); return users; } public int findTotal() { SqlSession session = factory.openSession(); Integer count = session.selectOne("com.itheima.dao.IUserDao.findTotal"); session.close(); return count; }} 5.2 执行过程分析
以下是通过 SqlSessionFactory 获取 SqlSession 并执行 SQL 语句的步骤:
通过以上步骤,可以实现 MyBatis 的传统开发方式。
发表评论
最新留言
不错!
[***.144.177.141]2026年06月08日 16时00分56秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
php基本符号大全
2023-03-01
php基础篇-二维数组排序 array_multisort
2023-03-01
php增删改查封装方法
2023-03-01
php多条件筛选功能的实现
2023-03-01
php多线程
2023-03-01
PHP大数组循环-避免产生Notice或者是Warning
2023-03-01
PHP大数组过滤元素、修改元素性能分析
2023-03-01
PHP大文件切片下载代码
2023-03-01
php如何做表格,新手怎么制作表格
2023-03-01
RabbitMQ集群 - 普通集群搭建、宕机情况
2023-03-01
php如何正确的获得文件的后缀名
2023-03-01
PHP如何生成唯一的数字ID
2023-03-01
PHP如何获取当前页面的最后修改时间
2023-03-01
PHP如何读取json数据
2023-03-01
PHP字符串
2023-03-01
PHP字符串递增
2023-03-01
php学习之基础语法
2023-03-01
RabbitMQ集群 - 仲裁队列、Raft协议(最详细的选举流程)
2023-03-01
PHP学习总结(11)——PHP入门篇之WAMPServer多站点配置
2023-03-01