程序修改题就是让你以不同的形式或方法实现相同的功能,之前说过,第一个就是动态 SQL 条件查询里面的 where 和 trim 转换,这也正是我们模拟考试程序修改中出现的题,模拟考过正式考试还会考吗?那该考还得考,但是我不敢保证,哈哈还是都看看吧,然后就是第二个,依赖注入明明也是有两种方式可以考的,但是老师已明确说明,程序修改题不考依赖注入,ok 跳过,但是程序修改题不考依赖注入,其他地方一定会考哦,第三,Bean 的三种装配方式,嗯这个考的可能性很大,依然是我个人猜测,考完别真实我,欢迎评论区留言。
文章目录
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实体类publicUser(String username,Integer password,List<String> list){super();this.username = username;this.password = password;this.list = list;}
<!-- ApplicationContext.xml 配置文件 --><beanid="user2"class="com.tyut.xml.User"><constructor-argindex="0"value="lisi"></constructor-arg><constructor-argindex="1"value="123456"></constructor-arg><constructor-arg><!-- 注入list --><list><value>listvalue1</value><value>listvalue1</value><value>listvalue1</value></list></constructor-arg></bean>
//Test.java 测试类packagecom.tyut.xml;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;publicclassXmlBeanTest{publicstaticvoidmain(String[] args){//获取配置文件路径String xmlpath ="com/tyut/xml/ApplicationContext.xml";//加载配置文件ApplicationContext applicationContext =newClassPathXmlApplicationContext(xmlpath);//输出有参构造方法注入的结果User user2 =(User) applicationContext.getBean("user2");System.out.println(user2);}}
② 设值注入,无参构造法和 setter 方法注入
//User实体类publicUser(){super();}publicvoidsetUsername(String username){this.username = username;}publicvoidsetPassword(Integer password){this.password = password;}publicvoidsetList(List<String> list){this.list = list;}
<!-- ApplicationContext.xml 配置文件 --><beanid="user1"class="com.liu.xml.User"><propertyname="username"value="zhangsan"></property><propertyname="password"value="123456"></property><propertyname="list"><!-- 注入list --><list><value>listvalue1</value><value>listvalue2</value><value>listvalue3</value></list></property></bean>
我这里只提供部分代码,对照两种方法各自的用法,怎么写,相同的无关代码就不往上放了,还有第二种方法的测试类和第一种也是一样的,所以就不重复了!
2.2 基于 Annotation 的装配
//UserDao.java 接口packageannotation;publicinterfaceUserDao{publicvoidsave();}
//UserDaoImpl.java 接口的实现类@Repository("userDao")publicclassUserDaoImplimplementsUserDao{@Overridepublicvoidsave(){// TODO Auto-generated method stubSystem.out.println("UserDao------save");}}
//UserService.java packageannotation;publicinterfaceUserService{publicvoidsave();}
//UserServiceImpl.java @Service("userService")publicclassUserServiceImplimplementsUserService{@AutowiredprivateUserDao userDao;@Overridepublicvoidsave(){// TODO Auto-generated method stubthis.userDao.save();System.out.println("UserSerevice-------save");}}
//UserController.java@Controller("controller")publicclassUserController{@AutowiredprivateUserService userService;publicvoidsave(){this.userService.save();System.out.println("UserController------save");}}
<!-- ApplicationContext.xml 配置文件 --><beanid="userDao"class="annotation.UserDaoImpl"></bean><beanid="userService"class="annotation.UserServiceImpl"></bean><beanid="userController"class="annotation.UserController"></bean>
//Test.java 测试类publicstaticvoidmain(String[] args){String xmlpath ="annotation/ApplicationContext.xml";ApplicationContext applicationContext =newClassPathXmlApplicationContext(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")publicclassUserServiceImplimplementsUserService{@AutowiredprivateUserDao userDao;publicvoidsetUserDao(UserDao userDao){this.userDao = userDao;}@Overridepublicvoidsave(){// TODO Auto-generated method stubthis.userDao.save();System.out.println("UserSerevice-------save");}}
UserServiceImpl.java 与注解装配相比这里也就是多了个构造,下面的 UserController.java 同样,不同的地方就是出题的点,需要你去修改替换的地方。
//UserController.java publicvoidsetUserService(UserService userService){this.userService = userService;}
前、后与 Annotation 相同的部分省略!
<!-- ApplicationContext.xml 配置文件 --><beanid="userDao"class="auto.UserDaoImpl"></bean><beanid="userService"class="auto.UserServiceImpl"autowire="byName"></bean><beanid="userController"class="auto.UserController"autowire="byName"></bean>
程序修改题当然不用把整个代码过程都写出来,它让替换成另一种方式,而替换的点就是这几种方式有差异的地方,直接记不同的地方就好了对吧,没必要全记。
版权归原作者 栈老师不回家 所有, 如有侵权,请联系我们删除。