文章目录
一.案例 : 未使用 spring 控制 mybaits
domain
@Setter@Getter
public class Counter {
private Integer id;
private String cname;
private Integer cmany;
public Counter() {
}
public Counter(Integer id, String cname, Integer cmany) {
this.id = id;
this.cname = cname;
this.cmany = cmany;
}
@Override
public String toString() {
return "Counter{" +
"id=" + id +
", cname='" + cname + '\'' +
", cmany=" + cmany +
'}';
}
}
mapper
ICounterMapper
public interface ICounterMapper {
List<Counter> selectCounters();
}
ICounterMapper.xml
<?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.zhj.mapper.ICounterMapper">
<select id="selectCounters" resultType="com.zhj.domain.Counter">
select *
from counter
</select>
</mapper>
dao
public interface ICounterDao {
List<Counter> selectCounters();
}
Component("getCountDao")
public class CounterDao implements ICounterDao {
private SqlSessionFactory sqlSessionFactory;
// 获取 SqlSession对象
public CounterDao() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
this.sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Override
public List<Counter> selectCounters() {
SqlSession sqlSession = this.sqlSessionFactory.openSession();
ICounterMapper mapper = sqlSession.getMapper(ICounterMapper.class);
return mapper.selectCounters();
}
}
service
public interface ICounterService {
void selectCounters();
}
@Service("getCounterService")
public class CounterService implements ICounterService {
@Resource(name = "getCountDao")
private ICounterDao counterDao;
@Override
public void selectCounters() {
List<Counter> counters = counterDao.selectCounters();
System.out.println(counters);
}
}
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>
<!--mybatis.xml 文件加入日志配置,可以在控制台输出执行的 sql 语句和参数-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--
配置 mybatis 环境:数据库的连接信息
default:必须和某个environment标签中的id值一样。
告诉mybatis使用哪个数据库的连接信息。也就是访问哪个数据库
-->
<environments default="mysql">
<!--id:数据源的名称,一个唯一值,可自定义,用来表示环境的名称-->
<environment id="mysql">
<!--
配置事务类型:
使用 JDBC 事务(使用 Connection 的提交和回滚)
type:JDBC(表示使用jdbc中的Connection对象的commit,rollback做事务处理)
-->
<transactionManager type="JDBC"/>
<!--数据源 dataSource:创建数据库 Connection 对象
type: POOLED 使用数据库的连接池
-->
<dataSource type="POOLED">
<!--
连接数据库的四个要素:driver,user,username,password名字是固定的,不能自定义
-->
<!--数据库的驱动类名-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--连接数据库的url字符串-->
<property name="url"
value="jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf-8"/>
<!--访问数据库的用户名-->
<property name="username" value="root"/>
<!--密码-->
<property name="password" value="034312"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--
告诉 mybatis 要执行的 sql 语句的位置
sql mapper(sql映射文件)的位置
一个mapper标签指定一个文件的位置。
位置是从类路径开始的路径信息。类路径:target/classes(类路径)
-->
<mapper resource="com/zhj/mapper/ICounterMapper.xml"/>
</mappers>
</configuration>
<!--
mybatis的主配置文件:主要定义了数据库的配置信息,sql映射文件的位置。
1.约束文件
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
mybatis-3-config.dtd:约束文件的名称
2.configuration 根标签
-->
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"
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
http://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描组件-->
<context:component-scan base-package="com.zhj" />
</beans>
测试
@RunWith(SpringRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class MyTest {
@Resource(name = "getCounterService")
private CounterService counterMapper;
@Test
public void test1(){
counterMapper.selectCounters();
}
}
二.使用Spring创建SqlSessionFactory 对象
修改 applicationContext.xml
<!--导入jdbc.properties-->
<context:property-placeholder location="jdbc.properties" />
<!--创建数据源对象-->
<bean id="getDataSourcePool" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--创建 SqlSessionFactory-->
<bean id="getSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="getDataSourcePool"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
@Component("getCountDao")
public class CounterDao implements ICounterDao {
@Resource(name = "getSqlSessionFactory")
private SqlSessionFactory sqlSessionFactory;
// 获取 SqlSession对象
// public CounterDao() throws IOException {
// String resource = "mybatis-config.xml";
// InputStream inputStream = Resources.getResourceAsStream(resource);
// this.sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// }
@Override
public List<Counter> selectCounters() {
SqlSession sqlSession = this.sqlSessionFactory.openSession();
ICounterMapper mapper = sqlSession.getMapper(ICounterMapper.class);
return mapper.selectCounters();
}
}
三.spring 负责创建dao 层 (去掉原来手动创建dao的操作)
<!--去掉dao层-->
<!--扫描mapper文件 生成对象 替代之前的dao层操作-->
<bean id="getDao" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.zhj.mapper"/> <!--读取mapper层的文件-->
</bean>
@Service("getCounterService")
public class CounterService implements ICounterService {
// @Resource(name = "getCountDao")
// private ICounterDao counterDao;
@Resource
private ICounterMapper counterMapper;
@Override
public void selectCounters() {
List<Counter> counters = counterMapper.selectCounters();
System.out.println(counters);
}
}
四.整理spring-mybatis步骤
-
创建项目导入相关jar 包
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <!-- <scope>test</scope>--> </dependency> <!-- spring-core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.2.4.RELEASE</version> </dependency> <!-- spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.4.RELEASE</version> </dependency> <!-- spring-beans --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.2.4.RELEASE</version> </dependency> <!--spring-context-support --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>5.2.4.RELEASE</version> </dependency> <!-- spring-expression --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>5.2.4.RELEASE</version> </dependency> <!-- spring-test --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.2.4.RELEASE</version> </dependency> <!-- spring-aop --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.2.4.RELEASE</version> </dependency> <!-- spring-aspects --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.2.4.RELEASE</version> </dependency> <!--spring-tx 事务--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.2.4.RELEASE</version> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> <scope>provided</scope> </dependency> <!-- cglib-nodep --> <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version>2.2</version> </dependency> <!--mybatis依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.1</version> </dependency> <!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.9</version> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>RELEASE</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>RELEASE</version> <scope>compile</scope> </dependency> <!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency> <!-- c3p0 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <!-- spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.8</version> </dependency> <!-- mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> </dependencies>
-
搭建 项目架构
java目录
domian
mapper
Imapper.java
mapper.xml
service
Iservice.java
impl
service
resource目录
applicationContext.xml
jdbc.properties
mybatis-config.xml
-
spring替代dao层的具体工作
<!--导入jdbc.properties--> <context:property-placeholder location="jdbc.properties" /> <!--创建数据源对象--> <bean id="getDataSourcePool" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driver}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!--创建 SqlSessionFactory--> <bean id="getSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="getDataSourcePool"/> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean> <!--去掉dao层--> <!--扫描mapper文件 生成对象 替代之前的dao层操作 生成mapper接口的代理对象--> <bean id="getDao" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.zhj.mapper"/> <!--读取mapper层mapper.xml的文件--> </bean>
然后 直接在 创建mapper 代理对象 即可使用
@Resource private ICounterMapper counterMapper;
以后只需要主要负责写sql 就 OK 了