Mybatis:是一个持久层框架是用来和关系型数据库进行交互的,java和数据库交互使用jdbc驱动进行连接Mybatis对jdbc进行了封装以便我们更加方便的使用.使用jdbc来进行数据库交互需要创建驱动,建立连接connect,创建statement,参数设置,结果检索等.Mybatis对这些进行了封装其核心为Sqlsession会话,只需要通过sqlsession就可以进行数据库操作.一般sqlsession的创建我们使用sqlsessionFactory会话工厂来产生,而sqlsessionfactory的产生需要通过SqlSessionFactoryBuilder().build(inputStream),inputStream输入流里面是创建连接池所需要的参数,而这些参数是保存在SqlMapConfig.xml中,所以我们需要通过Resources.getResourceAsStream(source)来传入配置文件从而产生inputstream输入流,这样就可以产生一个会话用来进行数据库交互.sqlsession在交互时所需要的sql语句和参数都是用mapper.xml来进行注入的,mapper.xml是映射在sqlmapconfig.xml中的所以sqlsession可以获得所需要的sql语句和参数.
Mybatis优化:因为会话工厂在一个程序中只需要一个所以我们可以将会话工厂设置成单例模式所以写成工具类方便调用
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
public static SqlSessionFactory newInstance(){
if(sqlSessionFactory == null){
synchronized (MybatisUtils.class) {
if(sqlSessionFactory == null){
try {
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//产生sqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
return sqlSessionFactory;
}
}
Mybatis的使用:一共有两种方法,原始dao方法,mapper代理开发.
原始dao:
原始方法我们需要创建dao接口,并提供dao实现类并将sqlsessionfactory通过参数注入到实现类中.实现类如下:
public class MybatisDaoImpl implements MybatisDao {
//sqlsessionfactory工厂
private SqlSessionFactory sqlSessionFactory;
public MybatisDaoImpl(SqlSessionFactory sqlSessionFactory){
//通过构造传入sqlsessionfactory工厂
this.sqlSessionFactory = sqlSessionFactory;
}
public User findById(Integer id) throws Exception {
//产生sqlsession会话
SqlSession sqlSession = sqlSessionFactory.openSession();
//sqlsession进行数据库交互
User user = sqlSession.selectOne("user.findById", id);
//关闭会话
sqlSession.close();
return user;
}
}
public void test() throws Exception {
//创建实现类
MybatisDaoImpl mybatisDaoImpl = new MybatisDaoImpl(MybatisUtils.newInstance());
//调用方法
User user = mybatisDaoImpl.findById(30);
System.out.println(user);
}
Mapper代理: 原始dao开发中会话在进行数据库交互时存在硬编码和模板代码,所以为了解耦和简化代码我们使用mapper代理进行开发,mapper代理开发原理是只需要接口不需要实现类将交互所需要的参数通过接口中方法的参数来进行传入从而进行解耦和简化代码,而程序又是怎么知道没有实现类的接口中是怎么和数据库进行交互的是添加还是删除或者修改的并且又怎么知道传入的参数是什么意思,mapper代理是通过mapper.xml来告诉程序接口中的方法干了什么.首先mapper.xml中的namespace的值要是该接口的全类名,这个接口中方法的方法名必须是mapper.xml中statement的id一致,该方法的参数必须和这个statement的parameterType的参数类型一致,该方法的返回值类型必须和resultType的参数类型一致这样通过方法和statement的一一对应程序就知道该方法到底要干什么.
public void test() throws Exception {
//获得mapper代理对象
MybatisDao2mybatis= MybatisUtils.newInstance().openSession().getMapper(MybatisDao2.class);
//调用方法
User user = mybatis.findById(10);
System.err.println(user);
}
Mybatis和Spring整合:前面的两种方法无论哪一种我们都需要手动去创建对象实例,这必不能完全的实现解耦和,所以我们使用spring来整合Mybatis从而将对象的实例化交给Spring容器去处理实现解耦合.主要是将sqlsessionfactory工厂的实例化交给了spring,并且将sqlsessionfactory注入到dao中.而与spring的整合也分为原始dao和mapper代理
Mybatis和hibernate的区别:
mybatis:学习成本低,入门门槛低,mybatis需要程序员自己写sql,对sql修改和优化就比较灵活。mybatis是不完全的 ORM,mybatis需要程序员编写sql,但是mybatis也存在映射(输入映射、输出映射)
hibernate:学习成本高,入门门槛高,hibernate是ORM框架,不需要程序员编写sql,自动根据对象映射生成sql。
Mybatis和Spring整合mapper代理的配置文件:
SqlMapConfig.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>
<!-- 通过setting配置mybatis的运行参数注意,设置运行参数会影响 mybatis的运行,一定要注意!-->
<settings>
<!-- 延迟加载的总开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 设置为false实现按需求加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
<!-- 定义别名 -->
<typeAliases>
<!-- 单个别名定义
type:类路径
alias:别名
-->
<!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> -->
<!-- 批量配置
指定pojo所在包路径,自动扫描包下的pojo定义别名,别名为类名(首字母小写或大写都可以)
-->
<package name="全类名"/>
<!-- 如果扫描多个包中的pojo,就写多个 package-->
<!-- <package name=""/> -->
</typeAliases>
</configuration>
mapper.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="接口的全类名">
<!-- 查询statement -->
<select id="和接口的方法名一致" parameterType="和方法的参数类型一致" resultType="和方法的返回值类型一致">
sql语句
</select>
</mapper>
applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!-- 配置数据源dataSource -->
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxActive" value="10"/>
<property name="maxIdle" value="5"/>
</bean>
<!-- 配置sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 配置数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 加载mybatis的配置文件 -->
<property name="configLocation" value="classpath:SqlMapConfig.xml"/>
</bean>
<!-- mapper代理配置 -->
<!-- <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
指定mapper接口
<property name="mapperInterface" value="cn.itcast.mybatis.mapper.UserMapper"/>
注入SqlSessionFactory
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean> -->
<!-- 使用mapper扫描器创建mapper代理对象
扫描器把自动将包下边的mapper扫描出来创建代理对象在spring容器注册,bean的id为类名(首字母小写)
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定要扫描的包路径,如果要扫描多个包,中间使用半角逗号分隔
注意:如果使用扫描器,不需要在sqlMapConfig.xml中加载mapper,要将mapper.xml和mapper.java放在同一个目录且同名
-->
<property name="basePackage" value="cn.itcast.mybatis.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
</beans>