1. 编写一个程序,采用JdbcTemplate创建一个数据表student,有一下字段: stuno(学号,主键,设为数据库自增),stuname(姓名),birthday(生日),gender(性别),score(成绩)。 2. 向student表中插入5条记录,记录数据自定,数据要合理、正确。 3. 将student表中最后一条记录的score的值改为377。 4. 查询出性别是女的生日在7月份的同学。 5. 分别采用基于XML的和基于Annotation方式的声明式事务管理,删除student表中所有score大于200的记录。若人为加入异常,查看student表中记录情况;若没有发生异常,观察student表中数据情况。
时间: 2024-03-23 16:41:16 浏览: 45
由于这是一个较为复杂的问题,需要涉及到数据库的创建、插入、修改、查询以及事务管理等多个方面的知识。我将大致地给出实现方案,具体的实现方法可以根据你的具体情况进行调整。
1. 创建student表
```sql
CREATE TABLE student (
stuno INT PRIMARY KEY AUTO_INCREMENT,
stuname VARCHAR(20),
birthday DATE,
gender CHAR(1),
score INT
);
```
2. 向student表中插入5条记录
```java
public class StudentDAO {
private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public void insertStudents() {
String sql = "INSERT INTO student (stuname, birthday, gender, score) VALUES (?, ?, ?, ?)";
Object[] params1 = {"张三", Date.valueOf("2000-01-01"), "男", 80};
Object[] params2 = {"李四", Date.valueOf("2001-02-02"), "女", 90};
Object[] params3 = {"王五", Date.valueOf("2002-03-03"), "男", 85};
Object[] params4 = {"赵六", Date.valueOf("2003-04-04"), "女", 95};
Object[] params5 = {"钱七", Date.valueOf("2004-05-05"), "男", 88};
jdbcTemplate.update(sql, params1);
jdbcTemplate.update(sql, params2);
jdbcTemplate.update(sql, params3);
jdbcTemplate.update(sql, params4);
jdbcTemplate.update(sql, params5);
}
}
```
3. 将student表中最后一条记录的score的值改为377
```java
public void updateStudentScore() {
String sql = "UPDATE student SET score = ? WHERE stuno = (SELECT MAX(stuno) FROM student)";
jdbcTemplate.update(sql, 377);
}
```
4. 查询出性别是女的生日在7月份的同学
```java
public List<Student> queryFemaleStudentsBornInJuly() {
String sql = "SELECT * FROM student WHERE gender = ? AND MONTH(birthday) = ?";
return jdbcTemplate.query(sql, new Object[]{"女", 7}, new StudentMapper());
}
public class StudentMapper implements RowMapper<Student> {
@Override
public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
Student student = new Student();
student.setStuno(rs.getInt("stuno"));
student.setStuname(rs.getString("stuname"));
student.setBirthday(rs.getDate("birthday"));
student.setGender(rs.getString("gender"));
student.setScore(rs.getInt("score"));
return student;
}
}
```
5. 分别采用基于XML的和基于Annotation方式的声明式事务管理,删除student表中所有score大于200的记录
基于XML的声明式事务管理
```xml
<bean id="studentDAO" class="com.example.StudentDAO">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="deleteStudents"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.example.StudentDAO.deleteStudents())"/>
</aop:config>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
```
```java
public void deleteStudents() {
String sql = "DELETE FROM student WHERE score > ?";
jdbcTemplate.update(sql, 200);
}
```
基于Annotation的声明式事务管理
```java
public class StudentService {
private StudentDAO studentDAO;
@Transactional
public void deleteStudents() {
String sql = "DELETE FROM student WHERE score > ?";
studentDAO.delete(sql, 200);
}
public void setStudentDAO(StudentDAO studentDAO) {
this.studentDAO = studentDAO;
}
}
```
```xml
<bean id="studentService" class="com.example.StudentService">
<property name="studentDAO" ref="studentDAO"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
```
注意:需要在Spring配置文件中配置数据源(dataSource)和JdbcTemplate对象(jdbcTemplate)。此外,使用Spring进行声明式事务管理时,需要在配置文件中配置事务管理器(transactionManager)。