文章目录
一、MyBatis的定义
MyBatis源自Apache的iBatis开源项目, 从iBatis3.x开始正式更名为MyBatis。它是一个优秀的持久层框架。
二、使用MyBatis的优点
为了和数据库进行交互,通常的做法是将SQL语句写在Java代码中,SQL语句和Java代码耦合在一起不利于后期维护修改,而MyBatis能够帮助我们将SQL语句和Java代码分离,方便了后期因需求变动而对SQL语句进行修改。
三、MyBatis的使用及分析
①创建java项目mybatis
②拷入相应的jar包
③在com.zzu.area包下创建IArea接口,代码如下:
package com.zzu.area;
public interface IAreaDao {
String getName(String code);
}
④在src下创建名为mybatis-config.xml的xlm文件,用于全局配置,代码如下:
<?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="dev">
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
<environment id="final">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="..."/>
<property name="url" value="..."/>
<property name="username" value="..."/>
<property name="password" value="..."/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="area.xml"/>
</mappers>
</configuration>
分析:
- environments元素节点可以配置多个environment子节点, 理解:假如我们系统的开发环境和正式环境所用的数据库不一样, 那么可以设置两个environment, 两个id分别对应开发环境(dev)和正式环境(final),那么通过配置environments的default属性就能选择对应的environment了, 例如,我将environments的deault属性的值配置为dev, 那么就会选择dev的environment。
- environment:配置数据库连接信息
- 事务管理器的配置(比如:type=”JDBC”)
- 数据源的配置(比如:type=”POOLED”)
- <property name="driver" value="com.mysql.jdbc.Driver"/>:配置数据库驱动
- <property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>:配置数据库路径
- <property name="username" value="root"/>:配置数据库用户名
- <property name="password" value="root"/>:配置数据库密码
注意:上述property标签中name值是固定的
- Mapper 标签:注册Mapper xml文件,resource中是Mapper xml文件路径
⑤在src下创建名为area.xml的xlm文件,用于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.zzu.area.IAreaDao">
<select id="getName" resultType="java.lang.String">
select name from area where code=#{code}
</select>
</mapper>
分析:
- namespace:为接口的全类名,说明此例中mapper中的sql语句全是IAreaDao接口在方法的sql语句
- id:接口中定义的抽象方法名,说明此例中的select语句是用于IAreaDao接口中getName方法的sql语句
- resultType:sql语句的返回值类型,此例中name为String类型,所以resultType为String类全名java.lang.String
- #{id}:从传递过来的参数中取出id值
⑥.在com.zzu.test包创建Test类,代码如下:
package com.zzu.test;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.zzu.area.IAreaDao;
public class Test {
public static void main(String[] args) throws Exception {
InputStream inputStream=Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
IAreaDao areaDao=sqlSession.getMapper(IAreaDao.class);
System.out.println(areaDao.getClass().getName());
System.out.println(areaDao.getName("410000"));
sqlSession.close();
}
}
执行结果:
com.sun.proxy.$Proxy8
河南省
分析:
- InputStream inputStream=Resources.getResourceAsStream("mybatis-config.xml"):加载mybatis-config.xml资源,将其变成输入流
- SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream):基于这个流文件创建SqlSession工厂即获取SqlSessionFactory对象,生产SqlSession
- SqlSession sqlSession=sqlSessionFactory.openSession():生产SqlSession,代表与数据库的一次会话
- IAreaDao areaDao=sqlSession.getMapper(IAreaDao.class):产生实现相应接口的动态对象areaDao
- System.out.println(areaDao.getClass().getName()):输出产生的动态对象areaDao,即com.sun.proxy.$Proxy8
- System.out.println(areaDao.getName("410000")):调用动态对象areaDao的getName方法,返回以410000为code的name即河南省
- sqlSession.close():关闭资源
总结:这种方法彻底实现了SQL语句的分离,使代码各模块功能更清晰