# 第八章:动态SQL 基于MyBatis的客户管理系统的设计与开发 ## 1.复制第6章的代码 导包:mybatis mysql 准备数据 数据库:mybatis 表 t_customer 创建实体类Customer 创建CustomerMapper.xml文件,写SQL语句的 创建mybatis-config.xml文件,配置文件 创建工具类,对外提供 测试 在上一章节中有所展示记录 ## 2.系统功能 ### 1. if 元素 如果姓名和职业都不为空,按姓名和职业查找客户 如果姓名不为空职业为空,按姓名查找客户 如果姓名为空职业不为空,按职业查找客户 如果姓名和职业都为空,则查找所有客户。 #### 下面是 CustomerMapper.xml 文件中的 sql 语句: ```java test="username!=null and username!=''" 此处的username是实体类Customer的成员变量,如果test中条件成立,and这一行代码就会被拼接到1=1的后面,否则,就不拼接 and username like concat('%',#{username},'%') 此处的第一个username是字段名,第2个username.是实体类Customer的成员变量 concat函数 连接字符串 ``` ```java ``` #### 测试类,通过名字进行查询: ```java @Test public void findCustomerByNameAndJobsTest(){ Customer customer = new Customer(); customer.setUsername("w"); List objects = sqlSession.selectList("CustomerMapper.findCustomerByNameAndJobs", customer); for (Customer object: objects) { System.out.println(object); } } ``` #### 运行截图: 传一个名字,按名字查询: ![image-20220415134517801](https://yovinchen-1308133012.cos.ap-beijing.myqcloud.com/image-20220415134517801.png) 不传参查询全部: ![image-20220415134721203](https://yovinchen-1308133012.cos.ap-beijing.myqcloud.com/image-20220415134721203.png) ### 2. choose - when - otherwise 元素 当客户名不为空,只根据客户名查询 当客户名为空,职业不为空,则只根据职业查询 当客户名和职业都为空,则查询电话不为空的客户 #### 下面是 CustomerMapper.xml 文件中的 sql 语句: ```java ``` ```java ``` #### 测试类,通过职业进行查询: ```java @Test public void findCustomerByNameOrJobs(){ Customer customer = new Customer(); customer.setJobs("teacher"); List objects = sqlSession.selectList("CustomerMapper.findCustomerByNameOrJobs", customer); for (Customer object: objects) { System.out.println(object); } } ``` #### 运行截图: 传职业,按职业查询: ![image-20220415134806665](https://yovinchen-1308133012.cos.ap-beijing.myqcloud.com/image-20220415134806665.png) 不传参,查询有手机号: ![image-20220415134848949](https://yovinchen-1308133012.cos.ap-beijing.myqcloud.com/image-20220415134848949.png) ### 3. where 元素 > 根据需要自动添加 where ,而且会自动保留或去掉 and 关键字 如果姓名和职业都不为空,按姓名和职业查找客户 如果姓名不为空职业为空,按姓名查找客户 如果姓名为空职业不为空,按职业查找客户 如果姓名和职业都为空,则查找所有客户。 #### 下面是 CustomerMapper.xml 文件中的 sql 语句: ```java ``` #### 测试类,通过姓名进行查询: ```java @Test public void findCustomerByNameAndJobs1Test(){ Customer customer = new Customer(); customer.setUsername("j"); List objects = sqlSession.selectList("CustomerMapper.findCustomerByNameAndJobs1", customer); for (Customer object: objects) { System.out.println(object); } } ``` #### 运行截图: 传一个名字,按名字查询: ![image-20220415135501209](https://yovinchen-1308133012.cos.ap-beijing.myqcloud.com/image-20220415135501209.png) 不传参查询全部: ![image-20220415135537915](https://yovinchen-1308133012.cos.ap-beijing.myqcloud.com/image-20220415135537915.png) ### 4. set 元素 > 根据id更新客户信息 set元素根据需要自动去掉多余的逗号 通过 ID 更新信息 #### 下面是 CustomerMapper.xml 文件中的 sql 语句: ```java ``` 测试类,通过 ID 进行修改: ```java @Test public void updateCustomer(){ Customer customer = new Customer(); customer.setId(3); customer.setUsername("maliu"); sqlSession.selectList("CustomerMapper.updateCustomer", customer); sqlSession.commit(); sqlSession.close(); } ``` 运行截图: ![image-20220415135735652](https://yovinchen-1308133012.cos.ap-beijing.myqcloud.com/image-20220415135735652.png)