Spring框架注解讲解+SpringJDBC讲解与使用
注解方式实现
注解开发准备工作
注解需要的 jar 包 注解功能封装在 AOP 包中,导入 Spring aop jar
<!--开启spring注解扫描 -->
<context:component-scan base-package="com.qn.spring"/>
spring作用在类上的注解有@Component、@Responsity、@Service以及@Controller;
@Autowired和@Resource是用来修饰字段、构造函数或者设置方法,并做注入的。
Spring中包含4个主要的组件添加注解:
1. @Controller:控制器,推荐给controller层添加此注解
2. @Service:业务逻辑,推荐给业务逻辑层添加此注解
3. @Repository:仓库管理,推荐给数据访问层添加此注解
4. @Component:给不属于以上基层的组件添加此注解 作用
@Component(value = "user") //<bean id="user" class="com.qn.spring.model.User"></bean>
注意:我们虽然人为的给不同的层添加不同的注解,但是在spring看来,可以在任意层添加任意注解
当注解作用在类上时,表明这些类是交给spring容器进行管理的,而当使用@Autowired和@Resource时,表明我需要某个属性、方法或字段,但是并不需要我自己去new一个,只需要使用注解, spring容器会自动的将我需要的属性、方法或对象创造出来。这就是通常所说的依赖注入和控制反转。
注解方式注入属性
@Autowired
@Autowired 是 Spring 提供的注解,可以写在字段和 setter 方法上。如果写在字段上,那么就不需要再写 setter 方法。默认情况下它要求依赖对象必须存在,如果允许 null 值,可以设置它的 required 属性为 false
注入的两种方式
1.byType 自动注入 "该注解默认使用按类型自动装配 Bean 的方式
@Autowired//自动注入
private Userdao userdao;
//自动寻找该类型进行自动注入
2.byName 自动注入
如果我们想使用按照名称(byName)来装配,可以结合@Qualifier 注解一起使用。
需要在引用属性上联合使用注解@Autowired 与@Qualifier。@Qualifier 的value 属性用于指定要匹配的 Bean 的 id 值
@Autowired//自动注入
@Qualifier(value = "userdao")
private Userdao userdao;
3.JDK 注解@Resource 自动注入
Spring 提供了对 jdk 中@Resource 注解的支持。@Resource 注解既可以按名称匹配 Bean,也可以按类型匹配 Bean。默认按照 ByType 自动
@Resource(name = "userdao")
private Userdao userdao;
注解与 XML 的对比
注解优点: 方便,直观,高效(代码少,没有配置文件的书写那么复杂)。
注解缺点:以硬编码的方式写入到 Java 代码中,修改是需要重新编译代码的。
xml 优点是: 配置和代码是分离的,在 xml 中做修改,无需编译代码,只需重
启服务器即可将新的配置加载。
xml 的缺点是:编写麻烦,效率低,大型项目过于复杂。
Spring JDBC
Spring 是个一站式框架:Spring 自身也提供了控制层的 SpringMVC 和 持久层的 Spring JdbcTemplate
开发步骤
1.下载 Spring JdbcTemplate 的 jar包
<!-- 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>
2.导入属性文件
<!--spring读入属性文件-->
<context:property-placeholder location="config.properties"></context:property-placeholder>
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mybatis_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
uame=root
pwd=root
config.properties配置如上
3.管理数据源对象
spring 管理与数据库链接 (数据源)
<!-- 配置druid数据库连接对象-->
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${driverClassName}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${uame}"></property>
<property name="password" value="${pwd}"></property>
<!-- <property name="initialSize" value="${initialSize}"></property>
<property name="maxActive" value="${maxActive}"></property>-->
</bean>
<!-- spring提供jdbcTempate封装-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="druidDataSource"></property>
在类中获得 JdbcTemplate
@Repository(value = "userDao")
public class Userdao {
@Autowired
JdbcTemplate jdbcTemplate;
}
JdbcTemplate 中常用的方法
execute:无返回值,可执行 ddl,增删改语句
update:执行新增、修改、删除语句;
queryForXXX:执行查询相关语句;
package com.qn.spring.dao;
import com.qn.spring.model.Admin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
@Repository(value = "userDao")
public class Userdao {
@Autowired
JdbcTemplate jdbcTemplate;
@Transactional(propagation = Propagation.REQUIRED)//传播行为
public void save(){
//使用spring对jdbc进行的封装类, 默认自动提交事务
jdbcTemplate.update("insert into admin(account,password,sex)values (?,?,?)","jim","111","男");
System.out.println("保存用户");
//用于执行ddl语句对表结构操作的语句
/* jdbcTemplate.execute("create table test(id int)");*/
//查询
//jdbcTemplate.queryForObject("select count(*) from admin",Integer.class);
//按照序号查询
Admin admin=jdbcTemplate.queryForObject("select * from admin where id=?", new Object[]{4}, new RowMapper<Admin>() {
@Override
public Admin mapRow(ResultSet resultSet, int i) throws SQLException {
Admin admin1=new Admin();
admin1.setId(resultSet.getInt("id"));
admin1.setAccount(resultSet.getNString("account"));
return admin1;
}
});
System.out.println(admin);
//集合查询
List<Map<String,Object>> list=jdbcTemplate.queryForList("select *from admin");
List<Admin> list1=jdbcTemplate.query("select * from admin", new RowMapper<Admin>() {
@Override
public Admin mapRow(ResultSet resultSet, int i) throws SQLException {
Admin admin1=new Admin();
admin1.setId(resultSet.getInt("id"));
admin1.setAccount(resultSet.getNString("account"));
return admin1;
}
});
}
}