大家好,欢迎来到IT知识分享网。
在看公司项目的时候看到了XXX.javad的一个dao类接口对应的resource同名文件夹下有着XXXmapper.xml 和XXX.xml两个文件,当时就蒙了,于是赶紧又找资料来复习下这两种实现方式,并记之
(当然还有第三种方式通过开启注解扫描器然后通过@select等等注解直接加在java/dao接口的方法上,这里就不扩展来分享了)
目录
基础概念
mapper和dao都是数据层进行crud的实现方式(Dao还有层持久层的意思,常见于web开发模型中),它们的本质在我理解上来看就是对jdbc进行了一层封装,屏蔽了底层的加载数据库驱动的重复的操作,让我们把更多的时间用在关注写和实现
SSM中的代码实现
SSM中mybatis的实现和springboot中mybatis的实现最大的不同也就是它们的maven依赖有所不同(其实底层基本一样,只是封装层略有不同)
以下是ssm中需要导入的依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
方式一 mapper
首先来看看文件目录
先来看看IUserDao.java接口(原代码中方法很多,本文只通过查来介绍mapper和dao的区别)
public interface IUserDao {
/**
* 查询所有用户
* @return
*/
List<User> findAll();
}
再来看看IUserDao.xml,最明显的区别就是xml中使用了<mapper namespace=“”>,需要注意以下两点
-
namespace命名空间,作用就是对sql进行分类化管理
-
在mapper代理方法开发的中,namespace=mapper接口地址
<?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.itheima.dao.IUserDao">
<!-- 配置 查询结果的列名和实体类的属性名的对应关系 -->
<resultMap id="userMap" type="uSeR">
<!-- 主键字段的对应 -->
<id property="userId" column="id"></id>
<!--非主键字段的对应-->
<result property="userName" column="username"></result>
<result property="userAddress" column="address"></result>
<result property="userSex" column="sex"></result>
<result property="userBirthday" column="birthday"></result>
</resultMap>
<!-- 查询所有 -->
<select id="findAll" resultMap="userMap">
<!--select id as userId,username as userName,address as userAddress,sex as userSex,birthday as userBirthday from user;-->
select * from user;
</select>
那么仅仅是在.xml写好<mapper namespace=“”>程序就可以自动扫描并在调用dao接口的适合成功执行吗,当然不是的,还需要配置映射文件位置SqlMapConfig.xml,这里的${jdbc.driver}的取值来源于jdbcConfig.properties,其实也可以直接写真实值
<?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>
<!--配置环境-->
<environments default="mysql">
<!-- 配置mysql的环境-->
<environment id="mysql">
<!-- 配置事务 -->
<transactionManager type="JDBC"></transactionManager>
<!--配置连接池-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
</environment>
</environments>
<!-- 配置映射文件的位置 -->
<mappers>
<!--<mapper resource="com/itheima/dao/IUserDao.xml"></mapper>-->
<!-- package标签是用于指定dao接口所在的包,当指定了之后就不需要在写mapper以及resource或者class了 -->
<package name="com.itheima.dao"></package>
</mappers>
</configuration>
最后在执行的适合加载配置文件,并调用方法,这里使用junit单元测试来实现
public class MybatisTest {
private InputStream in;
private SqlSession sqlSession;
private IUserDao userDao;
@Before//用于在测试方法执行之前执行
public void init()throws Exception{
//1.读取配置文件,生成字节输入流
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.获取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.获取SqlSession对象
sqlSession = factory.openSession();
//4.获取dao的代理对象
userDao = sqlSession.getMapper(IUserDao.class);
}
@After//用于在测试方法执行之后执行
public void destroy()throws Exception{
//提交事务
sqlSession.commit();
//6.释放资源
sqlSession.close();
in.close();
}
@Test
public void testFindAll(){
//5.执行查询所有方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
}
}
方式二 dao
最明显的区别就是增加了一步<bean id = “”>需要注入spring容器,原因如下
通过dao方式开发的话,dao的实现类在实现接口的同时,需要继承SqlSessionDaoSupport类,这个类中有获取SqlSession的方法,因为sqlSessionFactory已经在beans.xml文件中配置好了(下面有写),spring会自动注入进去,继承了SqlSessionDaoSupport类就可以直接通过getSqlSession()方法来获取sqlSession。然后就可以操作数据库了。
上面也说了,要获取sqlSession必须得有sqlSessionFactory才行啊,这就需要spring来注入了,所以我们在beans.xml中配置一下该dao
<!-- 原始dao方法 -->
<bean id="userDao" class="ssm.dao.impl.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
这段话为转载https://blog.csdn.net/eson_15/article/details/51684968
本文主要目的为大致复习区别,由于dao方式开发在目前基本用不到,想深刻理解其区别的同学直接点击进入大佬链接
springboot中代码的实现
与ssm区别,取mybatis包而代之的是springboot有自己的整合包mybatis-spring-boot-starter,封装了很多扫描的配置简化了开发
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
方式一 mapper
mapper文件配置一样,区别在于少了繁琐的SqlMapConfig.xml和单独的数据库配置文件jdbcConfig.properties
代替它们的是springboot启动默认扫描的配置文件application.properties
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db_library
spring.datasource.username=root
spring.datasource.password=4008
mybatis.type-aliases-package=com.example.entity
mybatis.mapperLocations=classpath:mappers/*.xml
而最重要的mapper扫描在springboot也被浓缩成了一个注解@Mapper()加在主启动类上
/**
* 指定所扫的包,会自动扫描指定包下的全部标有@Component的类,并注册成bean,
* 当然包括@Component下的子注解@Service,@Repository,@Controller。
* @author 85060
*
*/
@SpringBootApplication(scanBasePackages={"com.itheima.*"})
@MapperScan("com.itheima.dao")
public class SpringBootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}
}
复制代码
方式二 dao
暂时空着,2021年springboot+dao的组合感觉比较少见了,如果遇到再来填坑
菜鸟复习文,如果有什么意见欢迎评论提出哟
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/21612.html