创建JdbcTemplate对象
不过没有配置数据源 所以操作不了(可以用set方法设置数据源 也可以直接用构造方法)
这样配置就写死了 这些信息 以及new产生依赖
可以用xml配置
1.JdbcTemplate对象(注入dataSource)
2.数据源dataSource
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
配置完 实现类就可以用获得IOC容器 再得到实例化
获取完对象就可以开始其他的增删改查操作
其中查询所有的方法 query的参数有三个
1.sql语句
2.RowMapper< T >对象
3.sql所需的参数
返回值是一个List
我们根据这几个条件 , 可以在提示中排除找到这两条语句
他们的区别就是一个任意版本都可以用,一个要在jdk1.5以上
然后在需要RomMapper对象时我们可以创建一个得到RomMapper对象的类来返回一个对象给他
这样就可以得到查询所有的值
但在实际开发中 我们不用自己去创建RomMapper方法来获得这个对象,而是用下面这个Spring提供了的方法BeanPropertyRomMapper< T >(T.class)
(T是泛型)
同理这个查询一个的也是用这个方法 只是要把条件改成id=?
返回一列的方法queryForObject 中间那个参数是 转换返回值的类型 如果想得到int型就用Integer.class,long型就用Long.class
在我们测试完这些增删改查方法后(在测试类里)后,实际上我们开发中这些方法都是封装在Dao层的而不是测试类这里,所以我们要创建Dao层
Dao接口
Dao实现层
其中这些查询方法和之前测的都差不多
不过在查询id和查询name的时候有不同
id:用正则表达式 如果有返回,没有返回null
name:如果为空返回null;如果size大于1,因为name唯一所以报异常;否则(即只有一个时)返回name;
这时候配完了Dao层 里面只有一个JdbcTemplate要注入,我们再往xml里面添加
到这一步没我们就可以改回测试类了
就可以运行了
现在在Dao层其实还有一个问题:Dao层如果不知有一个Dao的实现类(操作用户的Dao,操作商品的Dao等等)
而他们中每次要进行数据库操作 都要注入
这里就造成了重复代码
那么我们要怎么让每个类可以不在一直重复写呢
每个类都有这个对象———>继承
我们只需要写一个公共的Jdbc父类——用于获得JdbcTemplate(通过注入),然后定义一个返回jdbcTemplate方法
然后Dao实现类的方法里就不用成员变量了 直接调用父类的getJdbcTemplate方法获得JdbcTemplate,这样每个Dao都不用重复注入JdbcTemplate
只需要继承这个父类
然后这个父类只注入了JdbcTemplate,(默认是在其他地方建立了JdbcTemplate放在了SpringIOC容器里,然后这时候拿出来注入)实际上我们甚至可以把DataSource也注入进来(即可以在没有JdbcTemplate的情况下,直接用注入进来的DataSource立刻创建JdbcTemplate)
根据上面的在Jdbc类里面创建了注入DataSource来创建JdbcTemplate方法(原本是在JdbcTemplate里面做的),所以原来在xml配置的JdbcTemplate以及被代替了,已经可以不用了,我们只需要把DataSource直接注入到Dao层就可以了
最后实际上我们写的这个Jdbc父类,Spring已经帮我们写好了 就叫
功能就是不用我们在xml配置JdbcTemplate,直接把DataSource和JdbcTemplate注入到Dao层即可,而且每个Dao的实现类只需要继承这个父类就不用重复注入JdbcTemplate
但这个方式 和我们之前虽然重复注入有什么区别呢
区别在于之前手动注入里面 成员变量是JdbcTemplate 所以可以用注解的方式@Autowired
而父类这种已经没有成员变量了 所以不能用注解(因为是Spring编写的无法修改)