Spring注解与JDBC
ref和value的区别
指 Spring 创建对象的过程中,将对象依赖属性(简单值,集合,对象)通 过配置设置给该对象。
注入的方式:
- set 方法注入
- 构造方法注入(相对较少)
<!--1.构造方法-->
<!--<bean id="user" class="com.ffyc.spring.model.User">
<constructor-arg name="name" value="张三"></constructor-arg>
<constructor-arg name="age" value="20"></constructor-arg>
</bean>-->
<bean id="user" class="com.ffyc.spring.model.User">
<constructor-arg type="java.lang.String" value="李四"></constructor-arg>
<constructor-arg type="java.lang.Integer" value="21"></constructor-arg>
</bean>
<!--2.set方法-->
<bean id="user1" class="com.ffyc.spring.model.User">
<property name="name" value="张三"></property>
<property name="age" value="21"></property>
</bean>
<bean id="userDao" class="com.ffyc.spring.dao.UserDao"></bean>
<bean id="userService" class="com.ffyc.spring.service.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
<!--value注入的是具体的值(张三、21),ref注入的是userDao的bean-->
注解方式实现
pom:需要配置一些jar包和依赖jar包**。注解功能封装在 AOP 包中,导入 Spring aop jar 包即可**
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
是spring本身依赖的jar包AOP功能已经封装在里面
开启注解扫描
<!--这个报名是最大的包名,也是项目名,意味着此项目的所有包都开启了注解扫描-->
<context:component-scan base-package="包名"> </context:component-scan>
注解创建对象
开启注解扫描后,就不用再spring.xml的bean里面在进行注入,直接用注解标签的方法依赖注入
• 注解创建对象
@Component(value=“user”)等于 <bean id=“user” class=“”></bean>
@@Service(value="userService")
@@Repository(value="userDao") 这都是类型注入,可以不用写value
以上注解都可以实现创建对象功能,只是为了后续扩展功能,在不同的层 使用不同的注解标记
@Scope(value=“prototype”) 原型
@Scope(value=“ singleton ”) 单例
注解方式注入属性
@Autowired
@Autowired 是 Spring 提供的注解,可以写在字段和 setter 方法上。如果写在 字段上,那么就不需要再写 setter 方法。默认情况下它要求依赖对象必须存在, 如果允许 null 值,可以设置它的 required 属性为 false。
byType 自动注入
该注解默认使用按类型自动装配 Bean 的方式
byName 自动注入
如果我们想使用按照名称(byName)来装配,可以结合@Qualifier 注解一起使用。
需要在引用属性上联合使用注解@Autowired 与@Qualifier。@Qualifier 的 value 属性用于指定要匹配的 Bean 的 id 值。
JDK 注解@Resource 自动注入
Spring 提供了对 jdk 中@Resource 注解的支持。@Resource 注解既可以按名 称匹配 Bean,也可以按类型匹配 Bean。默认按照 ByName 自动注入
byName 注入引用类型属性
@Resource 注解指定其 name 属性,则 name 的值即为按照名称进行匹配 的 Bean 的 id。
/**
* @Autowired(required = true) 默认 注入值不能为空
* @Autowired是根据属性的类型自动注入(根据属性的类型在spring容器中查找) byType
*
* 也可以通过对象名查找注入,需要结合@Qualifier(value="userDao") byName
* @Autowired
* @Qualifier(value="userDao")
* private UserDao userDao;
*
* @Resouece(name="userDao")是JDK自身提供的注解标签,也指出byName和byType两种注解方式
* name="userDao" 指定注入的对象
*/
/**
* 注解:
* 创建对象
* 1.@Component(value="user")
* 2.@Scope(value="singleton")
* 3.@Repository(value="userDao")
* 4.@Service(value="userService")
* 5.@Controller
*
* 注入对象:
* @Autowired(required=true) 添加在属性,set方法,构造方法 是spring提供的注解标签 支持byName,byType
* @Qualifier(value="userDao") byName
* @Resouece(name="userDao")是JDK自身提供的注解标签
*/
注解与 XML 的对比
注解优点: 方便,直观,高效(代码少,没有配置文件的书写那么复杂)。
**注解缺点:**以硬编码的方式写入到 Java 代码中,修改是需要重新编译代码的。
xml 优点是: 配置和代码是分离的,在 xml 中做修改,无需编译代码,只需重 启服务器即可将新的配置加载。
xml 的缺点是: 编写麻烦,效率低,大型项目过于复杂。
Spring JDBC
Spring 是个一站式框架:Spring 自身也提供了控制层的 SpringMVC 和 持久 层的 Spring JdbcTemplate。
首先导入Spring JdbcTemplate 的 jar 包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
在db.xml导入属性文件
<context:property-placeholder location="config.properties"></context:property-placeholder>
算上mybatis的log4j,一共需要配置6个属性文件,当然也可以写在一个xml属性里面,只不过这样会有点乱
- comfig.properties配置的是JDBC连接数据库的别名和里面的内容:
Driver=com.mysql.cj.jdbc.Driver
Url=jdbc:mysql://127.0.0.1:3306/mybatis_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
Uname=root
PSD=wang666
initialSize=5
maxActive=10
- db.xml里面配置约束、spring的读取文件、与数据库的连接、spring提供JdbcTemplate封装类和配置事务管理器
<?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
https://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:property-placeholder location="config.properties"></context:property-placeholder>
<!--配置与数据库的连接-->
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${Driver}"></property>
<property name="url" value="${Url}"></property>
<property name="username" value="${Uname}"></property>
<property name="password" value="${PSD}"></property>
<property name="initialSize" value="${initialSize}"></property>
<property name="maxActive" value="${maxActive}"></property>
</bean>
<!--spring提供JdbcTemplate封装类-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="druidDataSource"></property>
</bean>
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="druidDataSource"></property>
</bean>
</beans>
- log4j不必多说,从tomcat里面下载一份即可,内容仅需改动存放日志的地址
- mybatis-config.xml配置的是一些mybatis的配置开、关,比如驼峰、懒加载、二级缓存等等
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="logImpl" value="LOG4J"/>
<!--是否开启驼峰自动映射 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--懒加载-->
<setting name="lazyLoadTriggerMethods" value="true"/>
<!--二级缓存,默认为开启状态-->
<setting name="cacheEnabled" value="true"/>
</settings>
<typeAliases>
<package name="com.ffyc.ssm.model"/>
</typeAliases>
</configuration>
spring_mybatis.xml需要配置其管理生成的sqlSessionFactory和生成指定包下面的接口代理对象
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
">
<!--spring管理生成SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="druidDataSource"></property>
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<property name="mapperLocations" value="classpath:mapper/*Mapper.xml"></property>
</bean>
<!--生成指定包下面的借口代理对象-->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ffyc.ssm.dao"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
</beans>
最后一个spring.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
https://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.ffyc.ssm"></context:component-scan>
<import resource="db.xml"></import>
<import resource="spring_mabatis.xml"></import>
</beans>
然后再dao包中导入JdbcTemplate,注入对象
package com.ffyc.spring.dao;
import com.ffyc.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.Transactional;
import java.beans.Transient;
@Repository(value = "userDao")
public class UserDao {
@Autowired
JdbcTemplate jdbcTemplate;
public void save() {
jdbcTemplate.update("insert into admin(account,password,sex) values(?,?,?)","admin1","111","男");
}
public void save1(){
jdbcTemplate.update("insert into admin(account,password,sex) values(?,?,?)","admin2","222","男");
}
}
在类中获得 JdbcTemplate 对象,就可以直接使用。
JdbcTemplate 中常用的方法
execute:无返回值,可执行 ddl,增删改语句
update:执行新增、修改、删除语句;
queryForXXX:执行查询相关语句;
service:
import com.ffyc.spring.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
@Service(value = "userService")
public class UserService {
@Resource(name="userDao")
private UserDao userDao;
@Transactional//添加事务管理
public void saveUser(){
userDao.save();
System.out.println(10/0);
userDao.save1();
}
}
最后在test中运行即可
import com.ffyc.spring.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test1 {
public static void main(String[] args){
ApplicationContext app = new ClassPathXmlApplicationContext("spring.xml");
UserService userService = app.getBean("userService",UserService.class);
userService.saveUser();
}
}