05 Mybatis的CRUD操作和Mybatis连接池
1.CRUD的含义
CRUD是指在做计算处理时的增加(Create)、读取(Retrieve)(重新得到数据)、更新(Update)和删除(Delete)几个单词的首字母简写。主要被用在描述软件系统中数据库或者持久层的基本操作功能。
2.URL的概念及含义
URL:Uniform Resource Locator 统一资源定位符。它是可以唯一标识一个资源的位置。
它的写法:
http://localhost:8080/mybatisserver/demo1Servlet
协议 主机 端口 URI
URI:Uniform Resource Identifier 统一资源标识符。它是在应用中可以唯一定位一个资源的。
3.Mybatis的CRUD操作
数据库表结构图:
数据库对应的实体类User.java
package domain; import java.io.Serializable; import java.util.Date; /** * 数据库表对应的实体类 */ public class User implements Serializable { //实体类的成员变量名称应该与数据库中的列名一致 private Integer id; private String username; private Date birthday; private String sex; private String address; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", birthday=" + birthday + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}'; } }
IUserDao.java数据库表操作实现接口
package dao; import domain.QueryConditon; import domain.User; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import org.junit.Test; import java.util.List; /** * */ public interface IUserDao { /** * 查询所有 * @return */ //注解模式 @Select("select *from user") List<User> findAll(); /** * 保存用户 * @param user */ @Insert("insert into user(username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday})") void saveUser(User user); /** * 更新操作 * @param user */ @Update("update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id}") void updateUser(User user); /** * 删除操作 * @param userId 用户id */ @Delete("delete from user where id=#{userId}") void deleteUser(Integer userId); /** * 根据用户id查询 * @param userId 用户id */ @Select("select * from user where id=#{userId}") User queryById(Integer userId); /** * 根据用户名进行模糊查询 * @param username 用户名 * @return 查询结果 */ @Select("select *from user where username like #{username} ") List<User> queryByName(String username); /** * 获取用户的总记录数 * @return */ @Select("select count(id) from user") int queryTotalCount(); /** * 根据查询条件对象(由实体类生成)进行查询 * @param queryConditon 查询条件 * @return */ @Select("select *from user where username like #{user.username} and sex like #{user.sex}") List<User> queryByQueryConditionObject(QueryConditon queryConditon); }
测试类
package test; import dao.IUserDao; import domain.QueryConditon; import 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.Test; import java.io.InputStream; import java.util.Date; import java.util.List; public class MybatisTest01 { private InputStream in; private SqlSession sqlSession; private IUserDao userDao; /** * 初始化MyBatis * @throws Exception */ public void initMyBatis() throws Exception{ //1.读取配置文件 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.创建SqlSessionFactory SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder(); //创建SqlSessionFactory的构建者builder SqlSessionFactory factory=builder.build(in); //利用构建者builder创建SqlSessionFactory //3.使用工厂生产SqlSession对象 sqlSession = factory.openSession(); //4.使用SqlSessions对象创建Dao接口的代理对象 userDao = sqlSession.getMapper(IUserDao.class); } /** * 释放资源 * @throws Exception */ public void destroy() throws Exception{ sqlSession.commit();//提交事务 sqlSession.close(); in.close(); } /** * 查询所有 */ @Test public void testQueryAll() throws Exception{ initMyBatis(); //5.使用代理对象执行方法 List<User> users = userDao.findAll(); for (User user : users) { System.out.println(user); } destroy(); } /** * 测试保存操作 * @throws Exception */ @Test public void testSave() throws Exception{ User user=new User(); user.setUsername("lucky"); user.setAddress("天台"); user.setBirthday(new Date()); user.setSex("男"); initMyBatis(); //5.使用代理对象执行方法 userDao.saveUser(user); destroy(); } /** * 测试更新操作 * @throws Exception */ @Test public void testUpdate() throws Exception{ User user=new User(); user.setId(49); user.setUsername("lucky"); user.setAddress("浙江天台"); user.setBirthday(new Date()); user.setSex("男"); initMyBatis(); //5.使用代理对象执行方法 userDao.updateUser(user); destroy(); } /** * 测试更新操作 * @throws Exception */ @Test public void testDelete() throws Exception{ initMyBatis(); //5.使用代理对象执行方法 userDao.deleteUser(48); destroy(); } /** * 测试查询一个的方法 * @throws Exception */ @Test public void testQueryOne()throws Exception{ initMyBatis(); //5.使用代理对象执行方法 User user=userDao.queryById(49); System.out.println(user); destroy(); } /** * 模糊查询 * @throws Exception */ @Test public void testQueryByName()throws Exception{ initMyBatis(); //5.使用代理对象执行方法 List<User> users = userDao.queryByName("%ck%"); for (User user : users) { System.out.println(user); } destroy(); } /** * 查询总记录数 * @throws Exception */ @Test public void testQueryTotalCount()throws Exception{ initMyBatis(); //5.使用代理对象执行方法 int totalCount = userDao.queryTotalCount(); System.out.println(totalCount); destroy(); } /** * 根据查询条件实体类对象进行查询 * @throws Exception */ @Test public void testQueryConditionObject()throws Exception{ initMyBatis(); QueryConditon queryConditon=new QueryConditon(); //创建查询条件实体类 User user=new User(); user.setUsername("%王%"); //查询条件1:名字包含王 user.setSex("女"); //性别为女 queryConditon.setUser(user); //将查询条件封装到查询条件实体类QueryConditon中 //5.使用代理对象执行方法 List<User> users = userDao.queryByQueryConditionObject(queryConditon); for (User user1 : users) { System.out.println(user1); } destroy(); } }
4.Mybatis连接池
(1)连接池综述:
我们在实际开发中都会使用连接池。
因为它可以减少我们获取连接所消耗的时间。
(2)mybatis中的连接池
mybatis连接池提供了3种方式的配置:
配置的位置:
主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是表示采用何种连接池方式。
type属性的取值:
POOLED 采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现
UNPOOLED 采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用池的思想。
JNDI 采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样。
注意:如果不是web或者maven的war工程,是不能使用的。
我们课程中使用的是tomcat服务器,采用连接池就是dbcp连接池。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)