1、目的:把mybatis框架和spring框架集成在一起, 像一个框架一样使用。
2、用的技术是:spring中ioc的思想
3、为什么要用ioc?
能把mybatis和spring集成在一起, 像一个框架,是因为ioc能创建对象。
可以把mybatis框架中的对象交给spring统一创建, 开发人员从spring容器中获取对象。开发人员就不用同时面对两个或多个框架了,就面对一个spring即可
1、大体思路:
(1)定义dao接口,如:studentDao;
(2)定义mapper文件studentDao . xml;
(3)定义mybatis的主配置文件mybatis.xml;
(4)创建dao的代理对象。
studentDao dao = Sq1Session . getMapper (studentDao.class) ;
List
2、要使用dao对象,需要使用getMapper ()方法,怎么能使用getMapper()方法,需要哪些条件呢?
(1)获取sqlSession对象,需要使用sqlSessionfactory的opensession()方法;
(2)创建SqlSessionFactory对象。通过读取mybatis的主配置文件,能创建sq1SessionFactory对象;
(3)需要sqlSessionFactory对象,使用Factory能 获取sqlSession,有了sqlSession就能有dao,目的就是获取dao对象Factory创建需要读取主配置文件。
小结:想获得dao对象 --> sqlSession对象 --> sqlSessionFactory对象调用opensession()方法 --> 读取mybatis的主配置文件
3、主配置文件:
(1)数据库信息
(2)mapper文件的位置
4、通过以上的说明,我们需要让spring创建以下对象
(1)独立的连接池类的对象,使用阿里的druid连接池
(2)SqlSessionFactory对象
(3)创建出dao对象
1、引入依赖
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--spring-test(对JUnit的封装)-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.8.RELEASE</version>
<scope>test</scope>
</dependency>
<!--ioc核心-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<!--德鲁伊连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.23</version>
</dependency>
<!--驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<!--事务-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<!--事务相关-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!--mybatis与spring集成的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
2、在pom.xml中加入以下插件和扫描properties、xml(这一点很重要)
<build>
<!--目的是把src/main/java目录中的xml文件包含到输出结果中。输出到classes目录中-->
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录 -->
<includes>
<!--包括目录下的.properties、.xml文件都会扫描-->
<include>**/*.properties
**/ *.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<!--指定jdk版本-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</build>
1、目录结构(dao层、service层、三个配置文件(mapper、mybatis配置文件、spring配置文件)):
配置文件关系:spring配置文件中包含mybatis配置文件,mybatis配置文件中包含mapper配置文件
2、BookDao接口(充当持久层,里面有操作数据库的方法,供BookService调用)
package com.mybatis.dao;
import com.mybatis.domain.Book;
import java.util.List;
public interface BookDao {
//添加书籍的方法
int addBook(Book book); // 演示
//查询所有书籍的方法
List<Book> findAllBook(); // 演示
}
3、BookService接口(充当业务层)
package com.mybatis.service;
import com.mybatis.domain.Book;
import java.util.List;
public interface BookService {
List<Book> findAllBook();
int addBook(Book book);
}
4、BookServiceImpl实现类(创建了一个BookDao,并调用了BookDao中的方法)
package com.mybatis.service;
import com.mybatis.dao.BookDao;
import com.mybatis.domain.Book;
import java.util.List;
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
@Override
public List<Book> findAllBook() {
List<Book> allBook = bookDao.findAllBook();
return allBook;
}
@Override
public int addBook(Book book) {
int nums = bookDao.addBook(book);
return nums;
}
}
5、Book实体类与数据库表字段一一对应
package com.mybatis.domain;
public class Book {
private int book_id;
private String name;
private double price;
public Book() {
}
public Book(int book_id, String name, double price) {
this.book_id = book_id;
this.name = name;
this.price = price;
}
public int getBook_id() { return book_id;}
public void setBook_id(int book_id) {this.book_id = book_id; }
public String getName() {return name;}
public void setName(String name) { this.name = name;}
public double getPrice() { return price;}
public void setPrice(double price) {this.price = price; }
@Override
public String toString() {
return "Book1{" +
"book_id=" + book_id +
", name='" + name + '\'' +
", price=" + price +
'}';
}
}
1、mapper配置文件(与BookDao接口名要一致)
<?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.mybatis.dao.BookDao">
<insert id="addBook">
insert into book values (#{book_id},#{name},#{price})
</insert>
<select id="findAllBook" resultType="com.mybatis.domain.Book">
select * from `book`
</select>
</mapper>
2、mybatis配置文件(连接mapper文件)
<?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>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--设置别名-->
<typeAliases>
<!--name:实体类所在的包名-->
<package name="com.mybatis.domain.Book"/>
</typeAliases>
<!--sql mapper(sql映射文件的位置 -->
<mappers>
<!--name:是包名,这个包中的所有mapper.xml一次都能加载-->
<package name="com.mybatis.dao"/>
</mappers>
</configuration>
3、spring配置文件(连接mybatis文件)
<?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:util="http://www.springframework.org/schema/util"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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/util http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 开启组件扫描(全包扫描的方式)-->
<context:component-scan base-package="com.mybatis"></context:component-scan>
<!--引入外部属性文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--声明数据源,配置连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<!-- driverClassName可以不要(官方明确说明)-->
<!-- <property name="driverClassName" value="${prop.driverClass}"></property>-->
<property name="url" value="${prop.url}"></property>
<property name="username" value="${prop.userName}"></property>
<property name="password" value="${prop.password}"></property>
<property name="maxActive" value="${prop.maxActive}"></property>
</bean>
<!--声明的是mybatis中提供的SqlSessionFactoryBean类,这个类内部创建SqlSessionFactory的-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--set注入,把数据库连接池赋给dataSource属性-->
<property name="dataSource" ref="dataSource"/>
<!--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">
<!--指定SqlSess ionFactory对象的-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!--指定包名,包名是dao接口所在的包名。
MapperScannerConfigurer会扫描这个包中的所有接口, 把每个接口都执行
一次getMapper()方法,得到每个接口的dao对象。
创建好的dao对象放入到spring的容器中的。-->
<property name="basePackage" value="com.mybatis.dao"/>
</bean>
<!--声明Service-->
<bean id="bookServiceImpl" class="com.mybatis.service.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
</bean>
</beans>
4、jdbc配置文件(修改为你的数据库名和密码以及数据库名称)
prop.url=jdbc:mysql://localhost:3306/day17
prop.userName=root
prop.password=123456
prop.maxActive=10
这些配置文件可以设置为模板文件,下次可以直接简单修改使用,作法见下链接:
另外:新版IDEA创建各种模板文件(下次new新建时直接使用)包括修改自带的文件模板
2、sql
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for book
-- ----------------------------
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
`book_id` int(255) NOT NULL AUTO_INCREMENT,
`name` varchar(80) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`price` double(10, 2) NOT NULL,
PRIMARY KEY (`book_id`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 53 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of book
-- ----------------------------
INSERT INTO `book` VALUES (1, 'Java基础', 55.55);
INSERT INTO `book` VALUES (2, '深入理解JVM', 69.85);
INSERT INTO `book` VALUES (3, '数结构与算法', 47.31);
INSERT INTO `book` VALUES (4, 'Redis进阶', 78.92);
INSERT INTO `book` VALUES (5, 'sql优化++', 82.31);
SET FOREIGN_KEY_CHECKS = 1;
3、复制 > 新建文本文档 > 粘贴 > 另存为sql类型
4、运行刚刚另存的sql文件
测试类(我全部使用的是注解)
package mybatis;
import com.mybatis.domain.Book;
import com.mybatis.service.BookServiceImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class) //单元测试框架
@ContextConfiguration("classpath:applicationContext.xml") //加载配置文件
public class BookTest {
@Autowired //注入
private BookServiceImpl bookService;
@Test //查询所有数据
public void findAll() {
List<Book> list = bookService.findAllBook();
for (Book book : list) {
System.out.println(book);
}
}
@Test //添加一条数据
public void addBook() {
Book book = new Book();
book.setBook_id(6);
book.setName("spring全家桶");
book.setPrice(109.73);
int num = bookService.addBook(book);
System.out.println(num);//返回影响的行数
}
}
连接数据库开始测试查询所有数据方法:
测试添加数据方法:
其中有些注意事项:你要报org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)请看这篇文章
有问题请留言哦
有用点个关注,手留余香!