一、 回顾Mybatis
1. 创建实体类(POJO)
2. 核心配置文件mybatis-config.xml
- 起别名
- 配置数据源
mybatis-config.xml:
<?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>
<typeAliases>
<!--typeAlias :为特定全类名起别名;-->
<!--typeAlias必须在package前面-->
<typeAlias type="com.luo.pojo.User" alias="uuu"/>
<!--为指定包下所有类起别名(别名就是类名)-->
<package name="com.luo.pojo"/>
</typeAliases>
<!-- environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个-->
<environments default="mysql">
<!--environment配置数据库环境 id属性唯一标识-->
<environment id="mysql">
<!-- transactionManager事务管理。 type属性,采用JDBC默认的事务-->
<transactionManager type="JDBC"/>
<!-- dataSource数据源信息 type属性,连接池-->
<dataSource type="POOLED">
<!-- property获取数据库连接的配置信息 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/school?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<!--使用class的前提是Mapper接口和Mapper映射文件同名且在同一个包下-->
<mapper class="com.luo.mapper.UserMapper"/>
</mappers>
</configuration>
3. 创建Mapper接口:XXMapper.java
```java
public interface UserMapper {
public List<User> selectUser();
}
```
4. 配置Mapper映射文件
Mapper.xml :
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--绑定接口-->
<mapper namespace="com.luo.mapper.UserMapper">
<!--id="方法名"-->
<select id="selectUser" resultType="user">
select * from studb.student;
</select>
</mapper>
⚠️:必须和Mapper接口同名且在同一路径下;
5. 在Mybatis配置文件中注册Mapper映射文件
<mappers>
<!--使用class属性进行设置的前提是Mapper接口和Mapper映射文件同名且在同一个包下-->
<mapper class="com.luo.mapper.UserMapper"/>
</mappers>
6. 测试
@Test
public void test01() throws IOException {
/*从Mybatis配置文件中读取数据源(数据库)和映射文件,获取流*/
String resource="mybatis-config.xml";
InputStream in = Resources.getResourceAsStream(resource);
/*SqlSessionFactoryBuilder->SqlSessionFactory->SqlSession*/
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = sessionFactory.openSession(true);
/*获得具体的某个映射*/
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
/*调用具体的sql方法*/
List<User> users = mapper.selectUser();
for (User user : users) {
System.out.println(user);
}
}
7. Mapper映射文件读取异常问题
- Invalid bound statement (not found): com:.luo.mapper.UserMapper.selectUser
- 检查语法(映射文件与实体类是否对应、Mybatis配置文件中注册映射文件是否正确)
- 检查输出了Mapper映射文件的class
- 如果没有输出class文件,则在pom.xml中进行额外配置使用Maven静态资源过滤 :
注:有时还需重启idea或编辑映射配置文件,才能生效;<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build>
二、 Mybatis-Spring整合
- 整合后能够做到的:
- MyBatis参与到Spring的事务管理之中;
- 创建映射器 mapper 和 SqlSession 并注入到 bean 中;
- 将 Mybatis 的异常转换为 Spring 的 DataAccessException;
- 导入相关jar包
参考:mybatis-spring官方文档<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.9</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.7</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.9</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.17</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.9</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactid>lombok</artifactid> <version>1.16.10</version> </dependency>
- 整合方式一:sping.xml方式
- Mybatis使用mybatis-config.xml配置数据源和注册Mapper.xml:
Spring在applicationContext.xml中用bean创建数据源:<environments default="mysql"> <!--environment配置数据库环境 id属性唯一标识--> <environment id="mysql"> <!-- transactionManager事务管理。 type属性,采用JDBC默认的事务--> <transactionManager type="JDBC"/> <!-- dataSource数据源信息 type属性,连接池--> <dataSource type="POOLED"> <!-- property获取数据库连接的配置信息 --> <property name="driver" value="com.mysql.cj.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/studb?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root" /> <property name="password" value="123456" /> </dataSource> </environment> </environments> <mappers> <!--使用class的前提是Mapper接口和Mapper映射文件同名且在同一个包下--> <mapper class="com.luo.mapper.UserMapper"/> </mappers>
<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/studb?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean>
- Mybatis中要在使用时获取SqlSessionFactory和SqlSession:
而Spring在applicationContext.xml中使用org.mybatis.spring.SqlSessionFactoryBean创建SqlSessionFactory,并在其中绑定mybatis-config.xml核心配置文件,以及注册Mapper.xml,使用org.mybatis.spring.SqlSessionTemplate创建SqlSession:String resource="mybatis-config.xml"; InputStream in = Resources.getResourceAsStream(resource); //build出SqlSessionFactory SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in); /*获得具体的某个映射*/ UserMapper mapper = sqlSession.getMapper(UserMapper.class); /*调用具体的sql方法*/ List<User> users = mapper.selectUser(); for (User user : users) { System.out.println(user); }
创建Mapper的实现类:<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="datasource"/> <!--绑定Mybatis核心配置文件--> <property name="configLocation" value="classpath:mybatis-config.xml"/> <property name="mapperLocations" value="classpath:com/luo/mapper/UserMapper.xml"/> </bean> <!--SqlSessionTemplate相当于SqlSession--> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean>
并在spring中托管,注入SqlSession:public class UserMapperImpl implements UserMapper{ SqlSessionTemplate sqlSession; public void setSqlSession(SqlSessionTemplate sqlSession) { this.sqlSession = sqlSession; } @Override public List<User> selectUser() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); return mapper.selectUser(); } }
最后在使用的时候,只需要从SpringIOC容器中获取Mapper实现类对象:<bean id="userMapper" class="com.luo.mapper.UserMapperImpl"> <property name="sqlSession" ref="sqlSession"/> </bean>
@Test public void test02() throws IOException { ApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml"); List<User> users = context.getBean("userMapper",UserMapper.class).selectUser(); for (User user : users) { System.out.println(user.toString()); } }
-
整合方式二:
因为一次使用最好创建一个私有的SqlSession,使用完立刻关闭,在SpringIOC容器托管,可以做到让Spring负责SqlSession的创建,但需要一个SqlSession就要<bean>一个,十分不方便;所以还可以在需要使用SqlSession时通过继承SqlSessionDaoSupport,就可以通过getSqlSession()直接获得一个可以使用的SqlSession:
绝对不要忘记要在SpringIOC容器中托管,并注入SqlSessionFactory:public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper{ @Override public List<User> selectUser() { UserMapper mapper = getSqlSession().getMapper(UserMapper.class); return mapper.selectUser(); } }
使用:<beans> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="datasource"/> <property name="configLocation" value="classpath:mybatis-config.xml"/> <property name="mapperLocations" value="classpath:com/luo/mapper/UserMapper.xml"/> </bean> <bean id="userMapper2" class="com.luo.mapper.UserMapperImpl2"> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean> </beans>
@Test public void test03() throws IOException { ApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml"); List<User> users = context.getBean("userMapper2",UserMapper.class).selectUser(); for (User user : users) { System.out.println(user.toString()); } }
三、完整过程
- pom.xml 中导入依赖:
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.9</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.17</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.9</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.7</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> </dependency> </dependencies>
- 写pojo实体类:
@Data @AllArgsConstructor @NoArgsConstructor public class User { private int id; private String name; private int tid; }
- 写Mapper接口:
public interface UserMapper { public List<User> selectUser(); }
- 写Mapper.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.luo.dao.UserMapper"> <select id="selectUser" resultType="user"> select * from school.student; </select> </mapper>
- 编写mybatis-config.xml,进行基础配置(其他交给spring配置文件进行)
<?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="STDOUT_LOGGING"/> <setting name="cacheEnabled" value="ture"/> </settings> <typeAliases> <package name="com.luo.pojo"/> </typeAliases> </configuration>
-
编写spring-dao.xml(任意名):
配置数据源、SqlSessionFactory、绑定mybatis-config.xml、注册Mapper.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:aop="http://www.springframework.org/schema/aop" 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/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- <context:component-scan base-package=""/>--> <context:annotation-config/> <aop:aspectj-autoproxy/> <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/school?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="datasource"/> <!-- 绑定mybatis-config.xml --> <property name="configLocation" value="classpath:mybatis-config.xml"/> <!-- 注册Mapper.xml --> <property name="mapperLocations" value="classpath:com/luo/dao/*.xml"/> </bean> </beans>
-
编写applicationContext.xml整合spring-dao.xml等其他的xml
applicationContext.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" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <import resource="spring-dao.xml"/> </beans>
- 编写接口实现类
public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper{ @Override public List<User> selectUser() { return getSqlSession().getMapper(UserMapper.class).selectUser(); } }
- 在spring-dao.xml中托管MapperImpl,并注入SqlSessionFactory
<bean id="userMapperImpl" class="com.luo.dao.UserMapperImpl"> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean>
- 在service中使用:
public class MyTest { @Test public void test01(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserMapperImpl userMapperImpl = context.getBean("userMapperImpl", UserMapperImpl.class); List<User> users = userMapperImpl.selectUser(); for (User user : users) { System.out.println(user); } } }
四、其他
前置阅读1 —— Spring开发:https://blog.csdn.net/qq_38107282/article/details/123853828
前置阅读2 —— Spring事务:https://blog.csdn.net/qq_38107282/article/details/124569918
前置阅读3 —— Mybatis开发:https://blog.csdn.net/qq_38107282/article/details/124535569