Spring之JDBC的連接與注解的使用


JDBC連接

1、配置連接池時,需要為連接數據庫的連接設置四要素,可以直接寫死,也可以使用properties文件引入

2、在引入前要注意:

  首先應該引入命名空間context

    配置maven依賴

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>

  配置連接池

<?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">
    <!--配置德魯伊-->
    <bean id="dateSource" class="com.alibaba.druid.pool.DruidDataSource"
     init-method="init" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql:///mybatis"/>
        <property name="username" value="root"/>
        <property name="password" value="1234"/>
    </bean>
</beans>

  使用占位符及引入配置文件后

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

    <!--引入屬性配置文件,location:從什么位置加載屬性配置文件
       默認情況下是從classes路徑開始尋找
    -->
    <context:property-placeholder location="classpath:db.properties" system-properties-mode="NEVER"/>

    <!--配置德魯伊-->
    <bean id="dateSource" class="com.alibaba.druid.pool.DruidDataSource"
     init-method="init" destroy-method="close">
        <property name="driverClassName" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
    </bean>
</beans>

  db.properties內容如下

driver=com.mysql.jdbc.Driver
url=jdbc:mysql:///mybatis
username=root
password=1234

綜合案例

1、代碼結構

  2、代碼內容

@Setter@Getter@AllArgsConstructor@NoArgsConstructor@ToString
public class User {
    private String id;
    private String username;
    private String password;
    private String date;
    private String salary;
}
User
@Controller
public class UserController {
    @Autowired
    private IUserService userService;

    public void service(){
        String username="rose";
        String password="123";
        String id =null;
        String date="2018-10-10";
        String salary ="2000";
        User user = new User(id,username,password,date,salary);
        userService.save(user);
    }
}
UserController
@Repository
public class UserDaoImpl implements IUserDao {
    @Autowired
    private DataSource dataSource;
    public void save(User user) {
        try {
            Connection connection = dataSource.getConnection();
            String sql = "insert into user values(null,?,?,?,?)";
            PreparedStatement ps = connection.prepareStatement(sql);
            ps.setString(1,user.getUsername());
            ps.setString(2,user.getPassword());
            ps.setString(3,user.getDate());
            ps.setString(4,user.getSalary());
            ps.execute();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
UserDaoImpl
public interface IUserDao {
    void save(User user);
}
UserDao
@Service
public class UserServiceImpl implements IUserService {
    @Autowired
    private IUserDao userDao;

    public void save(User user) {
        userDao.save(user);
    }
}
UserService
public interface IUserService {
    void save(User user);
}
IUserService
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class App {

    @Autowired
    private ApplicationContext context;
    @Test
    public void test(){
        UserController userController = context.getBean(UserController.class);
        userController.service();
    }
}
App測試類
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

    <!--引入屬性配置文件,location:從什么位置加載屬性配置文件
       默認情況下是從classes路徑開始尋找
    -->
    <context:property-placeholder location="classpath:db.properties" system-properties-mode="NEVER"/>

    <!--配置德魯伊-->
    <bean id="dateSource" class="com.alibaba.druid.pool.DruidDataSource"
     init-method="init" destroy-method="close">
        <property name="driverClassName" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
    </bean>

    <bean id="userController" class="com.test.test_anli.controller.UserController">
        <property name="userService" ref="userService"/>
    </bean>
    <bean id="userService" class="com.test.test_anli.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"/>
    </bean>
    <bean id="userDao" class="com.test.test_anli.dao.impl.UserDaoImpl">
        <property name="dataSource" ref="dateSource"/>
    </bean>
</beans>
applicationContext.xml

  這些代碼已經使用了注解模式,可以刪掉注解,將@autowired改為@setter,使用xml文件,使用注解模式時注意配置文件中應該

配置注解解析器<context:component-scan base-package="com.test.test_anli"/>

DI注解

1、在Spring中使用注解來完成DI操作,我們稱之為注解自動裝配,存在兩種用法.。

  一:使用Spring框架自身提供的注解:@Autowired

  二:使用JavaEE規范提供的注解:@Resource 功能完全一樣

2、Autowired和Qualifier標簽:

  1.通過@Autowired標簽可以讓Spring自動的把對象需要的屬性從Spring容器中找出來,並注入(設置)給該屬性。

  2.第三方程序:Spring3.0之前,需要手動配置@Autowired注解解析程序; <context:annotation-config />

    在Spring3.0開始,Spring就會自動的加入針對@Autowired標簽的解析程序。

  3.@Autowired標簽貼在字段或者setter方法上。

  4.@Autowired可以同時為一個屬性注入多個對象。

   public void setXxx(OtherBean1 other1,OtherBean2 other2) {}

  5.使用@Autowired標簽可以注入Spring內置的重要對象,比如BeanFactory,ApplicationContext。              

   @RunWith(SpringJUnit4ClassRunner.class)

   @ContextConfiguration public class SpringTest { @Autowired private ApplicationContext ctx; }

  6.默認情況下@Autowired標簽必須要能找到對應的對象,否則報錯。不過,可使用required=false來避免該問題:

   @Autowired(required=false)

  7.@Autowired找bean的方式:

   (1)首先按照依賴對象的類型找,如果沒有找到,默認會報錯;如果找到一個匹配的對象,直接注入;

   (2)如果在Spring上下文中找到多個匹配(2個或者2個以上)的類型,再按照名字去找,如果沒有匹配則報錯;

   (3)可以通過使用@Qualifier("otherBean")標簽來規定依賴對象按照bean的id+類型去找;

 3、@Resource標簽:

  1、@Resource標簽是JavaEE規范的標簽;

  2、@Resource標簽也可以作用於字段或者setter方法;

  3、也可以使用@Resource標簽注入一些spring內置的重要對象,比如BeanFactory.ApplicationContext;

  4、@Resource必須要求有匹配的對象;

  5、Spring容器自動加載了@Resource的注解解析器

  6、@Resource標簽找bean的方式:

   (1)首先按照名字去找,如果找到,就使用setter或者字段注入;

   (2)如果按照名字找不到,再按照類型去找,但如果找到多個類型匹配類型,報錯;

   (3)可以直接使用name屬性指定bean的名稱;但是,如果指定的name,就只能按照name去找,如果找不到,就不會再按照類型去找;

4、Resource和Autowired的區別

  相同點:

  1.都是貼在類中的屬性上,表示從容器中找到需要的屬性並自動給屬性注入值。

  2.都可以貼在setter方法上

  3.都可以注入容器對象

  4.都使用<context:annotation-config/>的解析器

  不同點:

  1.@Autowired可以同時為兩個屬性注入值,@Resource一次只能為一個屬性注入值

  2.@Resource要求容器中必須有匹配的對象;

    @Autowired默認要求容器中必須有匹配對象,但是可以通過"required=false"修改其默認設置。

  3.@Autowired首先首先通過類型尋找匹配對象,當有多個相同類型時再按照名字找;

   @Resource注解首先按照名字尋找匹配對象,沒有找到時在按照類型來找。

5、@Autowired和@setter方法的區別

  @setter注解:lombok包中的注解,只是為屬性添加一個setter方法。

  @Autowired注解:spring框架的注解,表示將容器中的對象自動的注入被貼的屬性中。

IoC注解

使用標簽簡化IoC:

1.使用標簽來完成IoC,就必須有IoC注解的解析器 
    使用context:component-scan來掃描spring需要管理的bean
    base-package就告訴spring,去哪些包及其子包里去掃描bean,如果有多個包需要被掃描;只需要用逗號隔開多個包即可
    <context:component-scan base-package="xxx.xxx.xxx" />

2.標注Bean的注解:@Component
  默認情況,直接使用類的名字(首字母小寫作為bean的名字)
  如果要修改bean的名稱;直接使用value屬性來重新定義bean的名稱
  @Component("otherbean")
  public class OtherBean {}

3.使用@Component的限制:
 對於沒有源代碼的類(框架內部的預定義類),只能用XML配置;比如DataSource就只能使用XML方式來做IOC.

4.bean組件版型標簽
 bean組件版型: @Service用於標注業務層組件、 @Controller用於標注控制層組件(如struts中的action)、 @Repository用於標注數據訪問組件,即DAO組件。 @Component泛指組件,當組件不好歸類的時候,我們可以使用這個注解進行標注。

5.指定bean的作用域:@Scope("prototype")

6.初始化和銷毀方法
  @PostConstruct
  public void init() {
  相當於<bean init-method="init" />

  @PreDestroy
  public void destory() {
  相當於<bean destroy-method="destory" />

7.選用xml還是注解:
  1)Annotation:使用方便,XML文件很小,但是,依賴關系又重新回到了代碼當中;
  2)XML:使用稍微復雜,但是,代碼很干凈,代碼不會很任何框架產生關系;XML安全;
  兩種方式都必須掌握;

javaConfig對配置類加注解

  @configuration:表示當前類是一個配置類

  @Bean:容器中創建出一個對象

  @PropertySource:尋找屬性配置文件

  @ImportResource:尋找xml配置文件

  @import注解:引入另位外一個配置文件

  @ComponentScan:掃描組件

@Configuration
@PropertySource("classpath:db.properties")
public class Config {

    @Value("${jdbc.driverClassName}")
    private String driverClassname;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;

    @Bean
    public DataSource dataSource(){
        DruidDataSource data = new DruidDataSource();
        data.setDriverClassName(driverClassname);
        data.setUrl(url);
        data.setUsername(username);
        data.setPassword(password);
        return data;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM