一、MyBatis简介
MyBatis是一种基于SQL语法的开源项目,它能够将SQL语句封装在配置文件中,便于统一的管理和维护,能够降低代码的耦合度,且方便的代码调试。下面直接进入MyBatis的环境搭建。
二、MyBatis环境搭建
打开idea后,首先要配置jar文件,我们所需要的jar文件有如下几个,将其添加到Modules中的Dependencies中。添加完后不要忘记将Problems的提示Fix掉。
添加完jar文件,再把Tomcat配置一下。
配置完成后下面进入文件的配置。
三、配置Mybatis文件
首先建两个文件夹,一个是resources,将其类型设置成Resources,里面放一些配置文件;另一个是test文件夹,将其类型设置成Tests,里面放一些测试类。如图所示,在Modules中设置。
在resources文件夹中需要建三个文件,一个是db.propertites,里面是连接数据库的地址和用户名密码,和jdbc的数据库配置文件一样(这里可以不进行配置,可以在mybatis文件夹中配置也是可以的);一个是log4j.properties文件,用于保存日志;还有一个是mybatis.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>
<properties resource="db.properties">
</properties>
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<typeAliases>
<typeAlias type="cn.kgc.entity.Provider" alias="provider"/>
<typeAlias type="cn.kgc.entity.User" alias="user"/>
</typeAliases>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${pwd}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="cn/kgc/dao/ProviderMapper.xml"/>
<mapper resource="cn/kgc/dao/UserMapper.xml"/>
</mappers>
</configuration>
xml头基本上都是一致的;
properties里放置的是数据库配置文件;
settings中设置的是log4j日志;
typeAliases中是取别名,便于后面导入类名的时候提供方便;
environment中前四行都是一致的,下面的数据库配置中name的参数是固定的,value的值与db.properties保持一致;
mappers中是引入的DAO层-SQL层的映射文件,这个文件要在会放在dao层进行配置,下面会提到映射文件的配置。
这样MyBatis配置文件就设置ok了。
四、实现DAO层与SQL层连接
在src文件夹中新建UserMapper接口和UserMapper.xml文件放在dao文件中;UserMapper接口中放要实现的功能方法,这里直接上较为复杂的多个参数的方法;
我们先从UserMapper.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">
这个文件头和mybatis.xml不同之处是将mybatis.xml中的config及configuration替换成mapper;
<!--namespace指定关联的接口-->
<mapper namespace="cn.kgc.dao.UserMapper">
<select id="getUserCNT" resultType="int">
<!--id对应接口的方法名-->
select count(1) from tb_user_info;
</select>
</mapper>
下面重点提两个比较复杂的;
一个是带有两个相同数据类型的参数的方法;
下面这个是.xml文件中的语句:
<select id="queryUserByNameAndPwd" resultType="user" parameterType="java.lang.String">
select * from tb_user_info where uname=#{name} and password=#{pwd};
</select>
这里的id是UserMapper中的方法名,resultType是之前使用typeAliases取的别名就等于是 cn.kgc.dao.UserMapper,paramterType是参数的类型;
下面是UserMapper中的方法名:
User queryUserByNameAndPwd(@Param("name") String name,@Param("pwd") String pwd);
由于方法的参数是两个String类型,所以参数必须要用@Param注解来声明参数,然后sql语句的引用要用#{}的形式;
还有一个是不同数据类型参数的方法;
下面这个是.xml文件中的语句:
<select id="queryTest" resultType="user" parameterMap="idAndName">
select * from tb_user_info where uname=#{name} and uid=#{id};
</select>
<parameterMap id="idAndName" type="Object">
<parameter property="id" javaType="int"/>
<parameter property="name" javaType="string"/>
</parameterMap>
下面是UserMapper中的方法名:
User queryTest(@Param("name") String name,@Param("id") int id);
不同参数类型,.xml文件中要用parameterMap来取一个数据类型的别名,然后在对此进行分别设置,type类型选择Object;
五、测试类Test
在进行使用Junit进行测试之前,为了防止代码的耦合,为mybatis中读取配置文件创建SqlSession对象的方便调用,这里直接采用提取方法的方式;先建一个util包,里面建一个工具类MapperConfig类;
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 java.io.IOException;
import java.io.InputStream;
public class MapperConfig {
private static SqlSessionFactory factory;
static {
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
try {
InputStream is= Resources.getResourceAsStream("mybatis-cfg.xml");
factory=builder.build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSession(){
//非事务情况下,开启自动提交
return factory.openSession(true);
}
public static void closeSession(SqlSession session){
if(session!=null){
session.close();
}
}
}
为了防止多个线程同时对系统同时操作,这里采用单例模式,使用静态代码块来创建工厂;
每一个类的导入要正确
主要有两个方法:一个是获取SqlSession的session对象,还有一个就是关闭session;
接下来就可以直接使用Junit进行测试:
import cn.kgc.entity.User;
import cn.kgc.util.MapperConfig;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.Test;
import java.io.IOException;
public class UserMapperTest {
Logger logger=Logger.getLogger(UserMapperTest.class);
@Test
public void queryUserByNameAndPwd() {
SqlSession session=MapperConfig.getSession();
User user=session.getMapper(UserMapper.class).queryUserByNameAndPwd("admin","admin");
logger.info(user);
MapperConfig.closeSession(session);
}
}
这里面使用Logger来打印信息,同时保存日志;
六、结束语
这里只走了一遍流程,只实现了一个简单的查询功能,下面的增删改应该都难不倒小伙伴们吧;后面搭配上Tomcat与web进行连接和使用jdbc连接基本一致,这里就不多做介绍,相信你们jdbc已经练习的滚瓜烂熟了。