06 Mybatis 使用xml配置映射模式+动态SQL---使用案例
1.项目结构
2.数据库表User对应的实体类
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 + '\'' + '}'; } }
3.查询条件javabean
package domain; import java.util.List; /** * 查询条件实体类 */ public class QueryCondition { private User user; public List<Integer> getIds() { return ids; } public void setIds(List<Integer> ids) { this.ids = ids; } private List<Integer> ids; public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
4.操作数据库的接口IUserDao.java
package dao; import domain.QueryCondition; import domain.User; import java.util.List; /** * */ public interface IUserDao { /** * 查询所有 * @return */ List<User> findAll(); /** * 保存用户 * @param user */ void saveUser(User user); /** * 更新操作 * @param user */ void updateUser(User user); /** * 删除操作 * @param userId 用户id */ void deleteUser(Integer userId); /** * 根据用户id查询 * @param userId 用户id */ User queryById(Integer userId); /** * 根据用户名进行模糊查询 * @param username 用户名 * @return 查询结果 */ List<User> queryByName(String username); /** * 获取用户的总记录数 * @return */ int queryTotalCount(); /** * 根据查询条件对象(由实体类生成)进行查询 * @param queryConditon 查询条件 * @return */ List<User> queryByQueryConditionObject(QueryCondition queryConditon); /** * 根据传入参数条件 * @param user 查询的条件:有可能有用户名,有可能有性别,也有可能有地址,还有可能是都有 * @return */ List<User> queryUserByCondition(User user); /** * 根据QueryCondition中提供的ids集合,查询用户信息 * @param queryCondition 查询条件 * @return */ List<User> queryUserByIds(QueryCondition queryCondition); }
5.IUserDao.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="dao.IUserDao"> <!-- 查询所有 --> <select id="findAll" resultType="domain.User"> select * from user </select> <!-- 保存操作 --> <select id="saveUser" resultType="domain.User"> insert into user(username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday}) </select> <!-- 更新操作 --> <select id="updateUser" resultType="domain.User"> update user set username= #{username},address= #{address},sex= #{sex},birthday= #{birthday} where id=#{id} </select> <!-- 根据id查询用户 --> <select id="queryById" parameterType="INT" resultType="domain.User"> select * from user where id = #{uid} </select> <!-- 根据名称模糊查询 --> <select id="queryByName" parameterType="string" resultType="domain.User"> select * from user where username like #{name} </select> <!-- 获取用户的总记录数 --> <select id="queryTotalCount" resultType="INT"> select count(id) from user </select> <!-- 根据queryVo的条件查询用户 --> <select id="queryByQueryConditionObject" parameterType="domain.QueryCondition" resultType="domain.User"> select *from user where username like #{user.username} and sex like #{user.sex} </select> <!--id值要与IUserDao.java这个接口的方法名一致--> <select id="queryUserByCondition" resultType="domain.User" parameterType="domain.User"> select * from user <where> <if test="username != null"> and username = #{username} </if> <if test="sex != null"> and sex = #{sex} </if> </where> </select> <!--根据QueryCondition中提供的ids集合,查询用户信息 --> <select id="queryUserByIds" resultType="domain.User" parameterType="domain.QueryCondition"> select * from user <where> <if test="ids != null and ids.size()>0"> <foreach collection="ids" open="and id in (" close=")" item="uid" separator=","> #{uid} </foreach> </if> </where> </select> </mapper>
6.Mybatis的配置文件SqlMapConfig.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"> <!-- mybatis的主配置文件 --> <configuration> <!-- 配置环境 --> <environments default="mysql"> <!-- 配置mysql的环境--> <environment id="mysql"> <!-- 配置事务的类型--> <transactionManager type="JDBC"></transactionManager> <!-- 配置数据源(连接池) --> <dataSource type="POOLED"> <!-- 配置连接数据库的4个基本信息(以下内容需要根据实际情况进行修改) --> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="plj824"/> </dataSource> </environment> </environments> <!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 --> <mappers> <!--方法1:xml配置--> <mapper resource="dao/IUserDao.xml"/> </mappers> </configuration>
7.综合测试类
package test; import dao.IUserDao; import domain.QueryCondition; 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.ArrayList; 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(); QueryCondition queryConditon=new QueryCondition(); //创建查询条件实体类 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(); } /** * 查询总记录数 * @throws Exception */ @Test public void testQueryUserByCondition()throws Exception{ User user=new User(); user.setUsername("老王"); initMyBatis(); //5.使用代理对象执行方法 List<User> users = userDao.queryUserByCondition(user); for (User user1 : users) { System.out.println(user1); } destroy(); } /** * 根据查询条件实体类对象进行查询 * @throws Exception */ @Test public void testQueryUserByIds()throws Exception{ initMyBatis(); QueryCondition queryConditon=new QueryCondition(); //创建查询条件实体类 List<Integer> ids=new ArrayList<Integer>(); ids.add(41); ids.add(42); ids.add(49); ids.add(50); queryConditon.setIds(ids); //5.使用代理对象执行方法 List<User> users = userDao.queryUserByIds(queryConditon); for (User user1 : users) { System.out.println(user1); } destroy(); } }
【推荐】国内首个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)