mybatis是用Java编写的一个持久层框架,它封装了JDBC操作的很多细节,使开发者只需要关注sql语句本身,并且使用了ORM(对象关系映射)思想实现了结果集的封装。
一、mybatis基于xml的基本使用:
1、导入mybatis和数据库驱动jar包,以及log4j的jar包(记录日志,非必须);
2、创建实体类和dao接口,实体类中的属性需要与数据库列名严格对应;
3、创建mybatis的主配置文件和mybatis的映射配置文件,并导入log4j.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">
<!--mybatis的主配置文件-->
<configuration>
<!--配置环境-->
<environments default="mysql">
<!--配置mysql的环境-->
<environment id="mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源-->
<dataSource type="POOLED">
<!--配置连接数据库的4个基本信息-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/mydb1?serverTimezone=GMT%2B8"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
<mappers>
<mapper resource="com/itmao/dao/IUserDao.xml"></mapper>
<!--可以通过package标签指定dao接口所在的包,
当指定后就不需要写mapper标签了,两者作用相同
<package name="com.itmao.dao"></package>-->
</mappers>
</configuration>
PS:
1)其中关于数据库连接的信息可以单独写一个properties配置文件存储,这样在配置环境之前可以先写一个properties标签引用:
<!--配置外部properties文件,resource用于指定配置文件的位置,
是按照类路径的写法来写,并且也必须存在于类路径之下--->
<properties resource="jdbcConfig.properties"></properties>
然后在配置数据库连接信息时通过el表达式获取:
<property name="driver" value="${jdbc.driver}"></property>
2)在使用dataSource 标签配置数据源时,其属性type表示是否使用连接池,有三个值:POOLED:表示采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对此规范的实现(不是DBCP或C3P0连接池,而是mybatis自定义的连接池);UNPOOLED:采用传统的获取连接的方式,虽然也实现了javax.sql.DataSource接口,但是并没有使用池的思想;JNDI:采用服务器提供的JNDI技术实现,来获取DataSource对象,不同服务器拿到的DataSource是不一样的。通常使用POOLED。
3)在最后指定配置文件位置时,可以使用package标签,这样主配置文件就能得到所提供路径下的所有映射配置文件:
<package name="com.itmao.dao"></package>
因为实际开发中不止一个实体类,也就不止一个dao接口,也就不止一个映射配置文件,这时用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.itmao.dao.IUserDao" >
<!--配置查询所有-->
<select id="findAll" resultType="com.itmao.model.User">
select * from user
</select>
</mapper>
4、测试类中的代码:
public static void main(String[] args) throws Exception {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession创建dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理对象执行方法
List<User> list = userDao.findAll();
for(User user : list){
System.out.println(user);
}
//6.释放资源
session.close();
in.close();
}
测试类中的代码分析 :
1、读取配置文件:不能使用绝对路径和相对路径,而是使用类加载器,因为它只能读取类路径下的配置文件,或者使用ServletContext对象的getRealPath()方法获取文件真实路径。
2、创建工厂使用了构建者模式,即把创建对象的细节隐藏,让使用者直接调用方法即可拿到对象。
3、生产SqlSession使用了工厂模式,可以降低类之间的依赖关系(解耦)。
4、创建dao接口实现类使用了代理模式,使得在不修改源码的基础上就对方法增强。
环境搭建的注意事项:
1.创建IUserDao.xml和IUserDao.java时名称是为了和之前的知识保持一致。在mybatis中,它把持久层的操作接口名称和映射文件都叫做:mapper,所以IUserDao和IUserMapper是一样的。
2.在idea中创建包和目录是不一样的:
创建包使用:com.itmao.dao是三级目录;
创建目录使用:com.itmao.dao是一级目录。
3.mybatis的映射配置文件位置必须和dao接口的包结构相同,所以在创建映射配置文件的目录时,必须在resource文件夹中将com/itmao/dao逐个创建。
4.映射配置文件的mapper标签的namespace属性值必须是dao接口的全限定类名。
5.映射配置文件的操作配置(如select标签)的id属性值必须是dao接口的方法名,并且需要在resultType属性中指定实体类的全限定类名,否则mybatis不知道封装到哪里会报错。
当我们遵从了3、4、5事项后,我们在开发中就无需再写dao的实现类。
二、mybatis基于注解的基本使用:
1、在基于xml使用的基础上,删除映射配置文件,在dao接口的方法上使用相应注解(@Select,@Update,@Insert,@Delete),并且在注解中指定sql语句:
@Select("select * from user")
List<User> findAll();
2、在主配置文件中的mapper标签中,使用class属性指定dao接口的全限定类名:
<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件
如果是用注解来配置的话,此处应该使用class属性指定被注解的dao全限定类名-->
<mappers>
<!--<mapper resource="com/itmao/dao/IUserDao.xml"></mapper>-->
<mapper class="com.itmao.dao.IUserDao"></mapper>
</mappers>
虽然mybatis是支持写dao实现类的,但是写实现类反而会增加代码量。我们在实际开发中,都是越简便越好,所以不管使用xml还是注解配置,都是采用不写dao实现类的方式。