Java EE 程序修改题【太原理工大学】

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

程序修改题就是让你以不同的形式或方法实现相同的功能之前说过第一个就是动态 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 或 orwhere 元素也会自动地将它们去除。 除了 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, List<String> list) {
		super();
		this.username = username;
		this.password = password;
		this.list = list;
	}
<!-- ApplicationContext.xml 配置文件 -->
<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 -->
        		<list>
        			<value>listvalue1</value>
        			<value>listvalue1</value>
        			<value>listvalue1</value>
        		</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(List<String> list) {
		this.list = list;
	}
<!-- ApplicationContext.xml 配置文件 -->
<bean id = "user1" class = "com.liu.xml.User">
			<property name="username" value = "zhangsan"></property>
			<property name="password" value = "123456"></property>
			<property name="list" >
			<!-- 注入list -->
				<list>
					<value>listvalue1</value>
					<value>listvalue2</value>
					<value>listvalue3</value>
				</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");
	}

}
<!-- ApplicationContext.xml 配置文件 -->
<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 相同的部分省略

<!-- ApplicationContext.xml 配置文件 -->
<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>

程序修改题当然不用把整个代码过程都写出来它让替换成另一种方式而替换的点就是这几种方式有差异的地方直接记不同的地方就好了对吧没必要全记。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java