程序修改题就是让你以不同的形式或方法实现相同的功能,之前说过,第一个就是动态 SQL 条件查询里面的 where 和 trim 转换,这也正是我们模拟考试程序修改中出现的题,模拟考过正式考试还会考吗?那该考还得考,但是我不敢保证,哈哈还是都看看吧,然后就是第二个,依赖注入明明也是有两种方式可以考的,但是老师已明确说明,程序修改题不考依赖注入,ok 跳过,但是程序修改题不考依赖注入,其他地方一定会考哦,第三,Bean 的三种装配方式,嗯这个考的可能性很大,依然是我个人猜测,考完别真实我,欢迎评论区留言。
文章目录
-
- 1. where 和 trim 转换
- 2. Bean 的三种装配方式
-
- 2.1 基于 XML 的装配
- 2.2 基于 Annotation 的装配
- 2.3 自动装配
1. where 和 trim 转换
还记得模拟考试中的程序修改题吗?
它当时是给出我们一段代码,基于动态 SQL 的条件查询操作,原题中是以 where 的方式给出的,它让我们改用 trim 的方式重新设计程序,实现相同的动态 SQL。
题目我找不到了,我只能用一段类似的代码来演示。
先补充一些内容,为什么要使用 where 和 trim? 在映射文件中,编写的 SQL 语句后面加入了 “where 1=1” 的条件的话,既保证了 where 后面的条件成立,又避免了 where 后面第一个词是 and 或者 or 之类的关键字。其实除了 where 1=1 外,我们还可以使用 MyBatis 提供的 where 元素和 trim 元素解决这个问题,也就是说它是用来代替 where 1=1 的。 where 元素会自动判断由组合条件拼装的 SQL 语句,只有 where 元素内的某一个或多个条件成立时,才会在拼装 SQL 中加入 where 关键字,否则将不会添加,即使 where 之后的内容有多余的 and 或 or,where 元素也会自动地将它们去除。 除了 where 外,trim 元素也可以用于删除多余的关键字,它可以直接实现 where 元素的功能,trim 元素包含四个属性。(prefix 指定给 SQL 语句增加的前缀、prefixOverrides 指定 SQL 语句要去掉的前缀字符串、suffix 指定给 SQL 语句增加的后缀、suffixOverrides 指定 SQL 语句要去掉的后缀字符串)
假如这是题目给出的 where 方法的代码:
select id="findCustomer" parameterType="customer" resultType="customer">
select * from customer
where>
if test="username!=null and username!=''">
and username like concat('%',#{username},'%')
/if>
if test="jobs!=null and jobs!=''">
and jobs=#{jobs}
/if>
/where>
/select>
改成 trim 方法后:
select id="findCustomer" parameterType="customer" resultType="customer">
select * from customer
trim prefix="where" prefixOverrides="and">
if test="username!=null and username!=''">
and username like concat('%',#{username},'%')
/if>
if test="jobs!=null and jobs!=''">
and jobs=#{jobs}
/if>
/trim>
/select>
自己对照着看吧,中间内容不需要改动,where 换成 trim 后,相关属性再跟上,这里因为我们前面要增加一个 where,是个前缀所以用 prefix="where",而且我们第一个 if 里面的 and 是要剔除掉的,剔除的也是前缀所以用 prefixOverrides="and"。 为什么要剔除 and?当第一个条件成立时,剔不剔除都是没有影响的,但是如果说我们的第一个语句中的条件并不成立,这时候肯定需要跳过它再去执行下一个语句,但是这时会报错,因为 where 后直接就跟了 and,这是不允许的,prefixOverrides="and" 帮助我们解决这个问题。实在不想理解你就不用理解了,直接记住这样写就可以了,反正考试你就原话去默写吧,不会变的。
2. Bean 的三种装配方式
首先 Bean 的装配方式有三种,基于 XML 的装配、基于 Annotation 的装配、自动装配。
其实你们可以去看课本的,我这里用的是电子书,我也不知道课本是在几页,自己去目录找一下 Bean 的装配方式。
2.1 基于 XML 的装配
基于 XML 的装配也是有两种方法的,构造注入和设值注入。
① 构造注入,有参构造方法装配 Bean
//User实体类
public User(String username, Integer password, ListString> list) {
super();
this.username = username;
this.password = password;
this.list = list;
}
bean id = "user2" class = "com.tyut.xml.User">
constructor-arg index = "0" value = "lisi">constructor-arg>
constructor-arg index = "1" value = "123456">constructor-arg>
constructor-arg>
list>
value>listvalue1value>
value>listvalue1value>
value>listvalue1value>
list>
constructor-arg>
bean>
//Test.java 测试类
package com.tyut.xml;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class XmlBeanTest {
public static void main(String[] args) {
//获取配置文件路径
String xmlpath ="com/tyut/xml/ApplicationContext.xml";
//加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlpath);
//输出有参构造方法注入的结果
User user2 = (User) applicationContext.getBean("user2");
System.out.println(user2);
}
}
② 设值注入,无参构造法和 setter 方法注入
//User实体类
public User() {
super();
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(Integer password) {
this.password = password;
}
public void setList(ListString> list) {
this.list = list;
}
bean id = "user1" class = "com.liu.xml.User">
property name="username" value = "zhangsan">property>
property name="password" value = "123456">property>
property name="list" >
list>
value>listvalue1value>
value>listvalue2value>
value>listvalue3value>
list>
property>
bean>
我这里只提供部分代码,对照两种方法各自的用法,怎么写,相同的无关代码就不往上放了,还有第二种方法的测试类和第一种也是一样的,所以就不重复了!
2.2 基于 Annotation 的装配
//UserDao.java 接口
package annotation;
public interface UserDao {
public void save();
}
//UserDaoImpl.java 接口的实现类
@Repository("userDao")
public class UserDaoImpl implements UserDao {
@Override
public void save() {
// TODO Auto-generated method stub
System.out.println("UserDao------save");
}
}
//UserService.java
package annotation;
public interface UserService {
public void save();
}
//UserServiceImpl.java
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public void save() {
// TODO Auto-generated method stub
this.userDao.save();
System.out.println("UserSerevice-------save");
}
}
//UserController.java
@Controller("controller")
public class UserController {
@Autowired
private UserService userService;
public void save() {
this.userService.save();
System.out.println("UserController------save");
}
}
bean id = "userDao" class = "annotation.UserDaoImpl">bean>
bean id = "userService" class = "annotation.UserServiceImpl">bean>
bean id = "userController" class = "annotation.UserController"> bean>
//Test.java 测试类
public static void main(String[] args) {
String xmlpath = "annotation/ApplicationContext.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlpath);
//获取UserController的实例
UserController userController = (UserController) applicationContext.getBean("userController");
//输出UserController中的save方法
userController.save();
}
2.3 自动装配
UserDao.java、UserDaoImpl.java 、UserService.java、Test.java 与上一种注解装配方式代码完全一样,同样不再重复了。
//UserServiceImpl.java
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void save() {
// TODO Auto-generated method stub
this.userDao.save();
System.out.println("UserSerevice-------save");
}
}
UserServiceImpl.java 与注解装配相比这里也就是多了个构造,下面的 UserController.java 同样,不同的地方就是出题的点,需要你去修改替换的地方。
//UserController.java
public void setUserService(UserService userService) {
this.userService = userService;
}
前、后与 Annotation 相同的部分省略!
bean id = "userDao" class = "auto.UserDaoImpl">bean>
bean id = "userService" class = "auto.UserServiceImpl" autowire="byName">bean>
bean id = "userController" class = "auto.UserController" autowire="byName"> bean>
程序修改题当然不用把整个代码过程都写出来,它让替换成另一种方式,而替换的点就是这几种方式有差异的地方,直接记不同的地方就好了对吧,没必要全记。