spring DAO
常见三种方式
- xml配置
- 注解
- 纯java配置
xml 配置
数据源
spring 框架的数据源
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&userUnicode=true&charterEncoding=utf8&serverTimezone=UTC"/>
<property name="username" value="TR"/>
<property name="password" value="adminxhb"/>
</bean>
proxool 数据源
<bean id="dataSource_proxool"
class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
<property name="targetDataSource">
<bean class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="driver" value="${db.driver.class}" />
<property name="driverUrl" value="${db.url}" />
<property name="user" value="scott" />
<property name="password" value="tiger" />
<property name="maximumConnectionCount" value="10" />
<property name="minimumConnectionCount" value="5" />
<property name="statistics" value="${proxool.statistics}" />
<property name="simultaneousBuildThrottle" value="30" />
<property name="trace" value="true" />
</bean>
</property>
</bean>
Druid 数据源
<bean id="dataSource_druid"
class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
<property name="targetDataSource">
<bean class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="1" />
<property name="minIdle" value="10" />
<property name="maxActive" value="30" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="testWhileIdle" value="false" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="false" />
<property name="maxPoolPreparedStatementPerConnectionSize"
value="20" />
<property name="defaultAutoCommit" value="true" />
<property name="ValidationQueryTimeout" value="60000" />
<property name="validationQuery" value="select 1 from dual" />
<property name="filters" value="stat,wall,log4j2"/>
</bean>
</property>
</bean>
读取db.properties
配置文件
数据源中的 数据库信息(url,user,password)这些属性一般都是用db.properties
定义,所以就有了导入问题,
解决导入问题:两种方式
<!-- 自动读取配置文件 value 指定某一个配置文件-->
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:db.properties</value>
</list>
</property>
</bean>
<!--关联数据库配置文件-->
<context:property-placeholder location="classpath:database.properties"/>
注册bean
此处的 属性 dataSource
是继承了 JdbcDaoSupport
类才有属性,所以到时候java文件中要继承此类
ref="dataSource_proxool"
是上面注册的数据源。
<bean id="dao" class="com.trkj.dao.DeptDao">
<property name="dataSource" ref="dataSource_proxool"></property>
</bean>
JdbcDaoSupport
的 属性jdbcTemplate
就获取了与数据库的连接,能操作数据库对象了。
Dao类
this.getJdbcTemplate()
获取父类的方法,得到``jdbcTemplate对象
import org.springframework.jdbc.core.support.JdbcDaoSupport;
public class DeptDao extends JdbcDaoSupport {
public int addDept(Dept dept){
String sql="insert into dept(deptno,dname,loc) values(?,?,?)";
int count=this.getJdbcTemplate().update(sql,dept.getDeptno(),dept.getDname(),dept.getLoc());
return count;
}
}
事务
上面只是基本搭建了数据库访问。而没有涉及到事务,在项目业务中,一定一定一定是会有事务的。so copy…
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource_druid" />
</property>
</bean>
<ref bean="dataSource_druid" />
: 注入的属性依旧是数据源。
启用事务注解
<!-- 启用事务注解-->
<tx:annotation-driven transaction-manager="transactionManager" />
在方法上加上注解:@Transactional
即可支持事务。
注解配置
注册组件
<!-- 启用包扫描 -->
<context:component-scan base-package="com.trkj"></context:component-scan>
与此同时,要spring托管的类需要注册成组件
- dao 【
@Repository
】 - service 【
@Service
】 - controller【
Controller
】
意义都和 @Component
(作用在pojo层)一样,注册bean 在IOC容器中。
jdbcTemplate
<!-- 数据源注入到jdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource_druid"></property>
</bean>
dao层
JdbcTemplate
自动装配 (上面的jdbcTemplate已经链接数据源了,可以操作数据库的),
@Repository
public class AnDeptDao {
@Autowired
private JdbcTemplate template;
public int addDept(Dept dept){
String sql="insert into dept(deptno,dname,loc) values(?,?,?)";
int count=template.update(sql,dept.getDeptno(),dept.getDname(),dept.getLoc());
return count;
}
}
tips: 自动装配 默认按类型,有需要可以使用
@Qualifier
` 用名字装配(配合使用)
service层
同理,service 中的 deptDao 应该自动装配上 上面的dao
@Service
public class AnDeptServiceImpl implements AnDeptService {
@Autowired
private AnDeptDao deptDao;
@Transactional // 事务
public int addDept(Dept dept) {
return deptDao.addDept(dept);
}
}
同理 测试中也需要是 注册到spring容器中 service 对象
EmpService empService = context.getBean(EmpService.class);
Emp emp = empService.getEmpById(2);
yf03203