项目中,DAO是用mybatis来处理mysql数据库访问的,总结一下
思想
mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql语句本身, 而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。
mybatis通过xml 或注解的方式将要执行的各种statement配置起来,并通过java对象和statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。
采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc进行了封装,屏蔽了 jdbc api 底层访问细节,使我 们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。
ORM(Object Relation Mapping)对象关系映射:把数据库表和实体类的属性一一对应起来,使我们操作实体类即可操作数据库表
mybatis是mysql的ORM
Mybatis原理
参考链接:
【】mybatis工作原理:https://blog.csdn.net/u014745069/article/details/80788127
【】Mybatis的sqlsession是如何做到线程隔离的:https://www.cnblogs.com/yougewe/p/10072740.html
Mybatis的SQLSession工具类使用ThreadLocal来对线程中的Session来进行管理
环境搭建(映射关系的XML配置)
导入
创建DAO接口和实体类(访问数据库的类)
创建Mybatis的主配置xml文件
在
<configuration>
里写上数据库环境、数据源、数据库配置信息、事务类型等主配置文件中要写上mapper映射配置xml文件
<mappers> <mapper resource="com.aisaka.myDaoMapper.xml"></mapper> </mappers>
创建映射配置xml文件
注意:①mybatis的映射配置文件必须为之和dao接口的包结构相同
②映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
③映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名
遵循了这三点,以后开发中就无须在写dao的实现类(mybatis实现)
环境搭建(映射关系的注解配置)
导入
创建DAO接口和实体类(访问数据库的类)
创建Mybatis的主配置xml文件
在
<configuration>
里写上数据库环境、数据源、数据库配置信息、事务类型等主配置文件中使用class属性指定被注解的DAO接口全限定类名
<mappers> <mapper class="com.aisaka.myDao"></mapper> </mappers>
直接在DAO接口的方法中进行注解配置
public interface myDao{ //为DAO接口方法直接写Select注解,内容为sql语句 @Select("select * from user") List<myObj> findAll(); }
不需要指定封装对象等东西了,很方便
环境搭建(Gradel导入Mybatis)
用mybatis-generator
https://blog.csdn.net/qq_36666651/article/details/79560228
然后就直接在gradel.build里的task里加载mybatis的配置文件(InputStream)
使用(No Spring)
读取配置文件到InputStream中
InputStream in = Resources.getResourceAsStream("Mybatis主配置文件.xml");
根据配置文件和SqlSessionFactoryBuilder ,创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
使用SqlSession创建Dao接口的代理对象
MyDaoInterface MyDao = session.getMapper(MyDaoInterface.class);
MyDaoInterface
是我定义的DAO的接口,MyDao
即为Mybatis帮我们创建的DAO代理对象执行Dao代理对象的方法
List<resObj> = myDao.findAll()
返回查询结果findAll()
是在mapper中定义的数据库操作方法,其中定义了具体的查询语句和返回对象类型的全限定包名resObj
即为数据库操作的返回值封装到的对象释放资源
session.close();
in.close();
(注意,也可以自己写DAO实现类,这样就不用mybatis为我们创建代理对象,而是我们自己搞,但这样就比较复杂了。因为mybatis是自动用我们写的DAO接口和mapper中的方法对应的sql语句,给我们创建了DAO代理对象)
Spring整合Mybatis:mybatis-spring
mybatis-spring包:在 mybatis-spring 中 SqlSessionFactory 的创建交给了 SqlSessionFactoryBean
由 Spring 最终创建的 bean 不是 SqlSessionFactoryBean 本身,而是工厂类的 getObject()返回的方法的结果。也就是说,我们可以直接将与数据库操作的mapper类注入DAO
在Spring主配置文件中配置SqlSessionFactoryBean和MapperScannerConfigurer:
<!-- 这和mybatis无关,只是mybatis为我们生成的mapper实体类要注入这些提供给service业务层的实体类中-->
<context:component-scan base-package="com.appsec.system.persistence.mybatis.xdao">
<!-- 这和mybatis无关,配置数据源,数据源的内容可以单独写在db.propertipes里 -->
<bean name="dataSource" class="org.apache.commons.dbcp.BasicDataSource" init-method="init" destroy-method="close">
<property name="url" value="jdbc:mysql://localhost:3306/xx"></property>
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="username" value="root"></property>
<property name="password" value="1234"></property>
<!--由于使用第三方的dbcp连接池获得DataSource,要写下这些连接池配置-->
<property name="maxIdle" value="30"></property>
<property name="maxWait" value="10"></property>
<property name="defaultAutoCommit" value="false"></property>
</bean>
<!-- 配置 SqlSessionFactoryBean ,Spring为我们自动获取SqlSessionFactory对象 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- mybatis 配置文件位置(默认配置的话,可以不用)-->
<property name="configLocation" value="classpath:conf/mybatis/mybatis-config.xml"></bean>
<!-- DAO接口所在包名(映射接口扫描包),Spring会自动查找其下的DAO接口并创建mapper对象 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.appsec.system.persistence.mybatis.mapper" />
<!-- 这里的需要配置sqlSessionFactoryBean属性,就是前面配置的那个,Spring为我们用它来自动获取sqlSession对象 -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
然后就可以把mapper(DAO的数据库直接操作接口)写在com.appsec.system.persistence.mybatis.mapper目录下,然后在com.appsec.system.persistence.mybatis.xdao目录下,直接用@Autowired将mapper目录下的mapper注入进xdao的实体类里啦!这些实体类就提供给service层直接访问(在这些实体类中,可以加各种控制,比如数据校验等等,数据再处理等等)
mybatis工作流程
通过Reader对象读取Mybatis映射文件
通过SqlSessionFactoryBuilder对象创建SqlSessionFactory对象
获取当前线程的SQLSession
事务默认开启
通过SQLSession读取映射文件中的操作编号,从而读取SQL语句
提交事务
关闭资源
sqlsession用mapper接口生成mapper动态代理对象,再调用该对象对应的方法完成sql语句执行
Mybatis事务管理
mybatis可以不进行事务管理,直接用spring事务管理
也可以用mabatis的事务管理:https://blog.csdn.net/andamajing/article/details/72026693
几个注解
@result:在使用mybatis注解开发的时候,数据库返回的结果集和实体类字段不对应,我们就需要手动指定映射关系
@SelectProvider:可以不直接@Select(SQL语句),而是右Provider来提供SQL语句,做到SQL语句与DAO的分离
https://blog.csdn.net/qq_38353578/article/details/72621783
如果方法有@Param参数,那Provider指定的类的方法就要用Map来接受Param
@Param 用来在DAO层中声明方法参数
即select等语句注释某方法,该方法传入一个参数如@Param(“thisA”) int a,那么就可以在注释的sql语句中用${thisA}来将这个参数放入SQL语句里
3306是mysql的默认端口