JDBCTempLate
- 添加数据
@Test
public void test(){
String sql = "insert into student values(?,?,?)";
//这里是不需要提交事务的直接就可以
jdbcTemplate.update(sql,null,"赵例",99);
}
- 修改数据
/**
* 修改都是在update这个方法中实现前面是sql后面是一个参数的列表
*/
@Test
public void test_one(){
String sql = "update t_book set book_name=?,price=?,stock=? where book_id=? ";
jdbcTemplate.update(sql,"平凡的一生",90,110,1);
}
- 删除数据
@Test
public void test_two(){
String sql="delete from student where id=?";
jdbcTemplate.update(sql,43);
System.out.println("删除成功!");
}
- 查询一行数据
/**
*查询的方法是queryForObject
*设置映射关系BeanPropertyRowMapper
*传入的参数是实体类的对象,这是查询一行的
*这里的实体类对象就是需要查询的表的名字,并且这里的泛型可以不写
*/
@Test
public void test_select(){
String sql ="select * from t_book where book_id=?";
t_book t_book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<t_book>(t_book.class), 1);
System.out.println(t_book.toString());
}
- 查询多行数据
/**
* 查询多行数据集合里面的泛型为数据库的实体表
* 返回值是list集合,且泛型也是表类型
* query方法是查询多条数据的,new BeanPropertyRowMapper这个需要传入一个表对象
* 最后一个参数照样是参数传入的参数按照占位符来匹配
*/
@Autowired
private JdbcTemplate jdbcTemplate;
public List<t_book> selectAll(){
String sql = "select * from t_book";
List<t_book> t_book = jdbcTemplate.query(sql, new BeanPropertyRowMapper(t_book.class), null);
return t_book;
}
结合aop在这里面加入通知
- 加入依赖坐标,xml文件配置
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.9</version>
</dependency>
spring_jdbctmplate.xml
<!--开启基于注解的aop-->
<aop:aspectj-autoproxy/>
- 编写cn/zt/proxy/ascoptProxy.class
/**
** cn.zt.Dao.jdbcdao.*(..) 表示实现到jdbcdao的所有方法下
* 获取的bean实例只能是在调用方法的时候才能实现通知所以去调用测试方法是不可取的行为
* 我在这里犯了错误把他放在需要传入的类对象的代码放在一起所以注意就行了
*/
@Component
@Aspect
public class tongzhi {
@Pointcut("execution(* cn.zt.Dao.jdbcdao.*(..))")
public void cut(){}
// @Order(0)
// @AfterReturning(value = "cut()",returning = "returning_test")
// public void returning(Object returning_test){
// System.out.println("执行成功方法名为:"+returning_test.getClass());
// }
@Around(value = "cut()")
public Object around(ProceedingJoinPoint joinPoint){
Object proceed =null;
try {
System.out.println("这里是一个sql方法");
proceed = joinPoint.proceed();
System.out.println("返回值类型为:"+proceed.getClass());
} catch (Throwable e) {
System.out.println("出现异常!");
e.printStackTrace();
}
return proceed;
}
- 实现类cn/zt/Service/service.java
/**
* 前面是老两样就是获取配置文件在获取对应类型的bean
* 这里本来应该是接口的但是我是直接放在dao层的所以
* 直接给他对象就可以了,还有就是他返回值的类型是list的t_book
* 的数组所以在foreach中他承接列表的变量也得是t_book类型的
*/
@Component
public class service {
public static void main(String[] args) {
ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("spring_jdbc.xml");
jdbcdao bean = ioc.getBean(jdbcdao.class);
List<t_book> t_books = bean.selectAll();
for (t_book t:t_books) {
System.out.println(t.toString());
}
}
}
有一点忘记写了前面的增删改查这四个是在jdbctmplate封装的jiunt里面写的,代码贴在下面
//@RunWith是配置环境,@ContextConfiguration获取配置文件
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring_jdbc.xml")
@Component
public class JDBCTempLateTest {
//自动装配jdbctemplate的数据需要开启自动装配
@Autowired
private JdbcTemplate jdbcTemplate;
// ApplicationContext iop = new ClassPathXmlApplicationContext("spring_jdbc.xml");
@Test
public void test(){
String sql = "insert into student values(?,?,?)";
//这里是不需要提交事务的直接就可以
jdbcTemplate.update(sql,null,"赵添",99);
}
}