HDU1560 DNA sequence(迭代加深搜尋)
Spring 整合 MyBatis
將 MyBatis與 Spring 進行整合,主要解決的問題就是將 SqlSessionFactory 物件交由 Spring來管理。所以,該整合,只需要將 SqlSessionFactory 的物件生成器 SqlSessionFactoryBean 註冊在 Spring 容器中,再將其注入給 Dao 的實現類即可完成整合。
實現 Spring 與 MyBatis 的整合常用的方式:掃描的 Mapper 動態代理 Spring 像插線板一樣,mybatis 框架是插頭,可以容易的組合到一起。插線板 spring 插上 mybatis,兩個框架就是一個整體。
1.1 MySQL 建立資料庫 springdb, 新建表 Student
1.2 maven 依賴 pom.xml
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!--spring核心ioc用到的--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.5.RELEASE</version> </dependency> <!--做spring事務用到的--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.1</version> </dependency> <!-- mybatis和spring整合的依賴--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.9</version> </dependency> <!-- 阿里的資料庫連線池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.12</version> </dependency>
外掛:
<resources> <resource> <directory>src/main/java</directory><!--所在的目錄--> <includes><!--包括目錄下的.properties,.xml 檔案都會掃描到--> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources>
1.3 定義實體類 Student
package com.g0rez.entity;
public class Student {
private Integer id;
private String name;
private String email;
private Integer age;
public Student(Integer id, String name, String email, Integer age) {
this.id = id;
this.name = name;
this.email = email;
this.age = age;
}
public Student() {
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", email='" + email + '\'' +
", age=" + age +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
1.4 定義 StudentDao 介面
package com.g0rez.dao;
import com.g0rez.entity.Student;
import java.util.List;
public interface StudentDao {
int insertStudent(Student student);
List<Student> selectStudents();
}
1.5 定義對映檔案 mapper
在 Dao 介面的包中建立 MyBatis 的對映檔案 mapper,命名與介面名相同,本例為
StudentDao.xml。mapper 中的 namespace 取值也為 Dao 介面的全限定性名。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.g0rez.dao.StudentDao">
<insert id="insertStudent">
insert into student values (#{id},#{name},#{email},#{age})
</insert>
<select id="selectStudents" resultType="com.g0rez.entity.Student">
select id,name,email,age from student order by id desc
</select>
</mapper>
1.6 定義 Service 介面和實現類
介面定義:
package com.g0rez.service;
import com.g0rez.entity.Student;
import java.util.List;
public interface StudentService {
int addStudent(Student student);
List<Student> queryStudents();
}
實現類定義:
package com.g0rez.service.impl;
import com.g0rez.dao.StudentDao;
import com.g0rez.entity.Student;
import com.g0rez.service.StudentService;
import java.util.List;
public class StudentServiceImpl implements StudentService {
private StudentDao studentDao;
//使用set注入
public void setStudentDao(StudentDao studentDao) {
this.studentDao = studentDao;
}
@Override
public int addStudent(Student student) {
int nums = studentDao.insertStudent(student);
return nums;
}
@Override
public List<Student> queryStudents() {
List<Student> students = studentDao.selectStudents();
return students;
}
}
1.7 定義 MyBatis 主配置檔案
在 src 下定義 MyBatis 的主配置檔案,命名為 mybatis.xml。
這裡有兩點需要注意:
(1)主配置檔案中不再需要資料來源的配置了。因為資料來源要交給 Spring 容器來管理了。
(2)這裡對 mapper 對映檔案的註冊,使用
所在的包即可。因為 mapper 的名稱與 Dao 介面名相同,可以使用這種簡單註冊方式。這種
方式的好處是,若有多個對映檔案,這裡的配置也是不用改變的。當然,也可使用原來的
<?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 控制mybatis全域性行為-->
<settings>
<!-- 設定mybatis輸出日誌-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- 設定別名-->
<typeAliases>
<package name="com.g0rez.entity" />
</typeAliases>
<mappers>
<package name="com.g0rez.dao"/>
</mappers>
</configuration>
1.8 修改 Spring 配置檔案
1.8.1. 資料來源的配置( 掌握)
使用 JDBC 模板,首先需要配置好資料來源,資料來源直接以 Bean 的形式配置在 Spring 配
置檔案中。根據資料來源的不同,其配置方式不同:
Druid 資料來源 DruidDataSource
Druid 是阿里的開源資料庫連線池。是 Java 語言中最好的資料庫連線池。Druid 能
夠提供強大的監控和擴充套件功能。Druid 與其他資料庫連線池的最大區別是提供資料庫的
官網:https://github.com/alibaba/druid
使用地址:https://github.com/alibaba/druid/wiki/常見問題
配置連線池:
<!-- 宣告資料來源DataSource 作用是連線資料庫的-->
<bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"
destroy-method="close">
<!--setter注入給DruidDataSource資料來源連線資料庫的資訊-->
<property name="url" value="${jdbc.url}" /><!--setUrl()-->
<property name="name" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="${jdbc.maxActive}" />
</bean>
Spring 配置檔案:
1.8.2. 從屬性檔案讀取資料庫連線資訊
為了便於維護,可以將資料庫連線資訊寫入到屬性檔案中,使 Spring 配置檔案從中讀取資料。屬性檔名稱自定義,但一般都是放在 src 下。
Spring 配置檔案從屬性檔案中讀取資料時,需要在
將在屬性檔案中定義的 key 括起來,以引用指定屬性的值。該屬性檔案若要被 Spring 配置檔案讀取,其必須在配置檔案中進行註冊。使用
context:property-placeholder/ 方式( 掌握)
該方式要求在 Spring 配置檔案頭部加入 spring-context.xsd 約束檔案
context:property-placeholder/標籤中有一個屬性 location,用於指定屬性檔案的位置。
<context:property-placeholder location="jdbc.properties" />
1.8.3. 註冊 SqlSessionFactoryBean
<!--宣告的是mybatis中提供的SqlSessionFactoryBean類 這個類內部建立的就是SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
<!-- set注入吧資料庫的連線池賦給了dataSource這個屬性-->
<property name="dataSource" ref="myDataSource" />
<!-- mybatis主配置檔案的位置
configLocation屬性是Resource型別,讀取配置檔案
它的賦值,使用value ,指定檔案的路怪,使用classpath:表示檔案的位置
-->
<property name="configLocation" value="classpath:mybatis.xml" />
</bean>
1.8.4. 定義 Mapper 掃描配置器 MapperScannerConfigurer
Mapper 掃描配置器 MapperScannerConfigurer 會自動生成指定的基本包中 mapper 的代
理物件。該 Bean 無需設定 id 屬性。basePackage 使用分號或逗號設定多個包。
<!--建立dao物件,使用sqlsession的getMapper ( StudentDao.class )
MapperScannerConfigurer:在內部呼叫getMapper()生成每個dao介面的代理物件。
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--指定SqlSessionFactory物件的id-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<!--指定包名
指定包名,包名是dao介面所在的包名。
MapperScannerConfigurer會掃描這個包中的所有介面,
把每個介面都執行一次getMapper()方法,得到每個介面的dao物件。
建立好的dao物件放入到spring的容器中的。
-->
<property name="basePackage" value="com.g0rez.dao" />
</bean>
1.9 向 Service 注入介面名
向 Service 注入 Mapper 代理物件時需要注意,由於通過 Mapper 掃描配置器
MapperScannerConfigurer 生成的 Mapper 代理物件沒有名稱,所以在向 Service 注入 Mapper
代理時,無法通過名稱注入。但可通過介面的簡單類名注入,因為生成的是這個 Dao 介面
的物件。
<bean id="studentService" class="com.g0rez.service.impl.StudentServiceImpl">
<property name="studentDao" ref="studentDao" />
</bean>
1.10 Spring 配置檔案全部配置
<?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 https://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="jdbc.properties" />
<!-- 宣告資料來源DataSource 作用是連線資料庫的-->
<bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"
destroy-method="close">
<!--setter注入給DruidDataSource資料來源連線資料庫的資訊-->
<property name="url" value="${jdbc.url}" /><!--setUrl()-->
<property name="name" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="${jdbc.maxActive}" />
</bean>
<!--宣告的是mybatis中提供的SqlSessionFactoryBean類 這個類內部建立的就是SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
<!-- set注入吧資料庫的連線池賦給了dataSource這個屬性-->
<property name="dataSource" ref="myDataSource" />
<!-- mybatis主配置檔案的位置
configLocation屬性是Resource型別,讀取配置檔案
它的賦值,使用value ,指定檔案的路怪,使用classpath:表示檔案的位置
-->
<property name="configLocation" value="classpath:mybatis.xml" />
</bean>
<!--建立dao物件,使用sqlsession的getMapper ( StudentDao.class )
MapperScannerConfigurer:在內部呼叫getMapper()生成每個dao介面的代理物件。
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--指定SqlSessionFactory物件的id-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<!--指定包名
指定包名,包名是dao介面所在的包名。
MapperScannerConfigurer會掃描這個包中的所有介面,
把每個介面都執行一次getMapper()方法,得到每個介面的dao物件。
建立好的dao物件放入到spring的容器中的。
-->
<property name="basePackage" value="com.g0rez.dao" />
</bean>
<bean id="studentService" class="com.g0rez.service.impl.StudentServiceImpl">
<property name="studentDao" ref="studentDao" />
</bean>
</beans>
本文來自部落格園,作者:g0rez,轉載請註明原文連結:https://www.cnblogs.com/g0rez/p/15379444.html