spring注解方式实现配置
注解:java中的注释方式,可以理解为是一个java标签,说明,配置一些用途信息。在运行时可以根据标签的内容进行执行。
- 通过注解标签进行依赖注入时,POJO类中属性可以不写set方法
- 对编写的代码在编译时或运行时进行检测
java注解(Annotation)
- 是 JDK5.0 引入的一种注释机制。
- java的内置注解
- @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
- @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。例如:date.getYear()
- @SuppressWarnings - 指示编译器去忽略注解中声明的警告。例如:List list = new ArrayList();
注解标签
在spring配置文件中引入context
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
在spring配置文件中开启注解扫描功能
<!-- 开启Spring的注解扫描功能 -->
<context:component-scan base-package="com.wenhua.spring"/>
Component、Repository,Service能有创建对象的功能,
bean类 数据持久层
@Component(value="user")
@Scope(value="prototype")//默认单例 singleton
Dao类 数据访问层
@Repository(value="userDao")
service类 服务层
@Service(value="userService")
Attribute 属性
@Autowired
spring-JDBC
- 原始获得数据库连接,都是自己new对象
// 原始的数据库连接 import java.sql.Connection;
Connection connection = DriverManager.getConnection("驱动包","账号","密码");
// spring自带jdbc
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("");
// 使用第三方的数据库连接管理组件(数据库连接池技术,dbcp,c3p0,jndi(tmcat),阿里巴巴)
DruidDataSource dataSource2 = new DruidDataSource();
dataSource2.setDriverClassName("");
spring的jdbc管理
- 在pom.xml文件中导入jar包
<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- spring JDBC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- 阿里数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
- 创建properties文件
# jdbc config
# mysql
jdbc.driverName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_db?characterEncoding=utf-8
jdbc.userName=root
jdbc.passWord=123456
jdbc.initialSize=10
jdbc.minIdle=5
jdbc.maxActive=15
- 创建db.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启Spring的注解扫描功能 -->
<context:component-scan base-package="com.wenhua.spring"/>
<!-- 加载配置文件 -->
<context:property-placeholder location="config.properties"/>
<!-- 相当于new了一个对象 Spring管理阿里数据源对象的创建,由此数据源对象管理创建数据库连接对象(Connection) -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driverName}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.userName}"></property>
<property name="password" value="${jdbc.passWord}"></property>
<property name="initialSize" value="${jdbc.initialSize}"></property>
<property name="minIdle" value="${jdbc.minIdle}"></property>
<property name="maxActive" value="${jdbc.maxActive}"></property>
</bean>
<!-- 配置JDBC模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
- 需要使用数据库连接时,自需在类中注入JDBC模板即可
@Autowired
private JdbcTemplate jdbcTemplate;
- spring中的语句
- jdbcTemplate.execute(""); ddl语句创建修改数据库
- jdbcTemplate.update(""); 更新数据库信息,用于增删改语句
- jdbcTemplate.query(psc, rse); 查询数据库信息
- 返回一条记录
- jdbcTemplate.queryForObject(sql, requiredType);
- jdbcTemplate.queryForMap(sql, args);
- 返回多条记录
- jdbcTemplate.query(psc, rowMapper);
- jdbcTemplate.queryForList(sql);
- 统计数据记录
- jdbcTemplate.queryForObject(sql, requiredType);
- 返回一条记录
可以通过在POJO类中的无参构造方法中添加输出语句,查看原型还是单例模式
// 添加修改表结构
// jdbcTemplate.execute(sql);
String sql = "insert into t_user(name,sex,age) values(?,?,?)";
int row = jdbcTemplate.update(sql,
user.getName(),user.getSex(),user.getAge());
System.out.println(row);
//查询 指定条件查询返回一条记录 列表查询返回多条记录 统计查询,最大值,最小值,返回整数
// 返回一条记录
// jdbcTemplate.queryForObject
String sql = "select * from t_user where id = 2";
User user = jdbcTemplate.queryForObject(sql,(resultSet, rowNum) -> {
User us = new User();
us.setId(resultSet.getInt("id"));
us.setName(resultSet.getString("name"));
us.setSex(resultSet.getString("sex"));
us.setAge(resultSet.getInt("age"));
us.setOper(resultSet.getDate("oper"));
return us;
});
System.out.println(user);
// jdbcTemplate.queryForMap(sql, args);
int elem = 2;
String sql = "select * from t_user where id = ?";
Map<String, Object> list = jdbcTemplate.queryForMap(sql,elem);
System.out.println(list);
// 返回多条语句
//以前用法 import org.springframework.jdbc.core.RowMapper;
String sql = "select * from t_user";
public void find(){
List<User> users = jdbcTemplate.query(sql,new RowMapper<User>() {
@Override
public User mapRow(ResultSet resultSet, int rowNum) throws SQLException {
// 注意此处应该用原型模式,也就是多例模式
User user = new User();
user.setUserId(resultSet.getInt("id"));
user.setUserAge(resultSet.getInt("age"));
user.setUserName(resultSet.getString("name"));
user.setUserSex(resultSet.getString("sex"));
user.setPerTime(resultSet.getDate("oper"));
return user;
}
});
System.out.println(users);
// 最新表示方法
String sql = "select * from t_user";
@SuppressWarnings("unchecked")
List<User> list = jdbcTemplate.query(sql,(resultSet, rowNum) -> {
User user = new User();
user.setId(resultSet.getInt("id"));
user.setName(resultSet.getString("name"));
user.setSex(resultSet.getString("sex"));
user.setAge(resultSet.getInt("age"));
user.setOper(resultSet.getDate("oper"));
return user;
});
System.out.println(list);
// jdbcTemplate.queryForList(sql, args);
int age = 21;
String sql = "select * from t_user where age = ?";
List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, age);
System.out.println(list);
//返回整数 jdbcTemplate.queryForObject(sql, requiredType);
String sql = "select count(*) from t_user";
int count = jdbcTemplate.queryForObject(sql,Integer.class);
System.out.println(count);
spring的事务管理
spring的事务管理可以说就是在aop思想的基础上实现的,
-
作用:确保调用方法时要么执行成功,要么回滚到原始状态.
-
**位置:**一般将spring的事务管理机制放在service层,是因为直接在dao层时,是单独的操作,而service层才是一系列操作,是一个完整的业务。
-
配置:在需要spring事务管理的配置文件中添加响应的tx约束
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
通过xml配置实现
- 第一步:配置spring事务管理类,并注入数据源
<!-- 第一步:配置jdbc事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
- 第二步:基于xml配置文件的方式实现事务管理
<!-- 第二步:基于xml配置文件的方式实现事务管理 -->
<tx:advice id="txadvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<!-- 为dao层方法添加事务管理
<tx:method name="insert*" propagation="REQUIRED"/> -->
</tx:attributes>
</tx:advice>
- 第三步:用xml方式配置事务到具体类中方法
<aop:config>
<!-- 配置在Dao层 -->
<aop:pointcut expression="execution(* com.wenhua.spring.dao.UserDao.insert(..))" id="insert"/>
<aop:advisor advice-ref="txadvice" pointcut-ref="insert"/>
<!-- <aop:pointcut expression="execution(* com.wenhua.spring.service.UserService.save(..))" id="save"/>
<aop:advisor advice-ref="txadvice" pointcut-ref="save"/> -->
</aop:config>
通过注解标签实现
- 第一步:配置jdbc事务管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
- 第二步:开启事务注解
<tx:annotation-driven transaction-manager="transactionManager"/>
- 在需要控制事务的类或方法进行注解
@Transactional