Mybatis框架搭建指南
前言:最近打算把SSM框架的搭建和使用都复习一遍,写写博客,加深记忆。
一.导入框架依赖包
使用maven管理依赖包,在maven仓库中找到Mybatis和Mysql的依赖包,加入到pom文件的依赖中。
二.配置Mybatis框架
Mybatis有两种配置方式,第一种是xml方式,第二种是java方式。下面我们先来讲一下第一种xml该如何配置。
.
xml配置Mybatis框架
- 创建配置文件,名称随意,但尽量规范起名,如Mybatis-config.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>
<property name="url" value="jdbc:mysql://localhost:3306/musicsite?characterEncoding=utf8&useSSL=true&serverTimezone=UTC"></property>
<property name="driver" value="com.mysql.cj.jdbc.Driver"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</properties>
<typeAliases>
<typeAlias type="FrameWork.bean.User" alias="User"></typeAlias>
<package name="FrameWork.bean"></package>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>//此处使用上面配置driver属性的值
<property name="url" value="${url}"/>//同上
<property name="username" value="${username}"/>//同上
<property name="password" value="${password}"/>//同上
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="FrameWork/Mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
- 加载mapper文件有三种方式:
(1) 使用mapper标签中的resource属性,使用这种方式配置,mapper文件和接口不需要在同一包下,只需要配置mapper文件的路径(相对于classpath),并确保mapper文件中的命名空间与mapper接口的路径一致即可。
(2) 使用mapper标签中的class属性,使用这种方式配置,mapper文件必须和mapper接口在同一包,并且mapper文件必须与mapper接口的名字相同,mapper文件的命名空间与接口的路径相同。class属性配置为mapper接口的路径(相对于classpath)。
(3) 使用package标签批量添加mapper文件,使用这种方式配置,mapper文件必须与接口在同一包下,mapper文件的名字与接口名相同,且mapper文件的命名空间为接口的路径。
PS:在IDEA中不会自动编译xml文件,因此,当你使用idea开发时,出现接口类与mapper文件没有映射对的情况时,你可以查看编译好的class目录里,查看是否有xml文件,如果没有可以添加在pom文件中添加以下代码,重新编译。<resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources>
- 配置数据源时应注意mysql8.0驱动的连接字符串必须加上时区。
- 配置事务管理器时可以选择JDBC/MANAGED。
(1) JDBC配置直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。利用java.sql.Connection对象完成对事务的提交。
(2) MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器(比如 tomcat,weblogic)来管理事务的整个生命周期。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。 - 使用typeAliases配置类型别名
(1) typeAlias标签用于配置单个bean,其中type属性为bean的全类名,alias属性为bean的别名。
(2) package标签可批量配置bean,name属性为bean所在的包名,Mybatis会自动扫描该包,寻找对应的bean。
java配置Mybatis
1.创建Mybatis配置类
public class MybatisConfig {
public void ConfigurationMybatis()
{
Properties properties=new Properties();
properties.setProperty("url","jdbc:mysql://localhost:3306/musicsite?characterEncoding=utf8&useSSL=true&serverTimezone=UTC");
properties.setProperty("driver","com.mysql.cj.jdbc.Driver");
properties.setProperty("username","root");
properties.setProperty("password","root");
PooledDataSourceFactory pooledDataSourceFactory = new PooledDataSourceFactory();
pooledDataSourceFactory.setProperties(properties);//配置数据源属性
DataSource dataSource=pooledDataSourceFactory.getDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();//事务管理器为JDBC
Environment environment = new Environment("development", transactionFactory, dataSource);//配置开发环境
Configuration configuration = new Configuration(environment);//将环境加入配置
configuration.getTypeAliasRegistry().registerAlias("userbase",userbase.class);
configuration.addMapper(UserDAO.class);//注册接口
configuration.addInterceptor(new SqlInvocation());//配置sql拦截器
}
}
2.加载mapper文件
1.使用Configuration对象的addMapper()方法,指定要添加的接口类型,一次注册一个接口,使用这个方法,同样需要接口名与mapper文件名称相同,mapper命名空间为接口的路径,接口与mapper文件在同一包下。
2. 使用Configuration对象的addMappers()方法,指定要扫描的mapper文件路径,与addMapper()方法相同,addMappers()方法也要求接口名与mapper文件名称相同,mapper命名空间为接口的路径,接口与mapper文件在同一包下。
3. 配置数据源时应注意mysql8.0驱动的连接字符串必须加上时区。需要切换其他数据源则使用其他的工厂类创建数据源对象(如UnpooledDataSourceFactory,JndiDataSourceFactory),然后加入到环境对象中。
4. 你可以通过创建不同的事务管理器工厂来切换事务管理器,例如你要切换为MANAGED 配置,则创建ManagedTransactionFactory对象,然后加入配置中。
5. 配置别名要先通过configuration对象的getTypeAliasRegistry方法获取TypeAliasRegistry对象,然后调用方法配置别名,注意配置别名的操作必须放在注册mapper接口的前面,否则mybatis解析mapper文件时会找不到别名对应的类。
三.配置Sql语句
在配置sql语句方面,Mybatis同样提供java配置和xml配置两种方式。
xml配置sql语句
<?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="FrameWork.DAO.UserMapper">
<select id="selectUser" resultType="user" parameterType="Long">
select * from user where id = #{id}
</select>
</mapper>
对于这种Mapper文件,Mybatis提供专门的xml语法。开发人员所有的配置都在mapper标签中进行。读者可以直接复制上方的代码到xml文件中,然后删除此处select标签,自行实现sql语句。mapper标签中关于描述sql语句的标签有select,insert,delete,update。
(1) select标签用于查询语句。其中id属性用于唯一标识,id名应与java接口的方法名一一对应,resultType属性用于确定将结果集转换为哪种类型的javabean,parameterType
代表传入的参数类型。
(2) insert标签用于插入语句。
(3) delete标签用于删除语句。
(4) update标签用于更新语句。
以上标签都有id,resultType,parameterType,parameterMap,resultMap属性.。id代表对应接口的方法名。resultType和resultMap都代表结果集的转换类型,前者只有在javabean的属性名与数据库列名相同时才能使用,后者则是在属性名与列名不同时使用,使用时还需要定义resultMap,在标签内定义好数据库字段与javabean属性的映射关系。parameterType和parameterMap的关系与resultType和resultMap相同,只不过这是两个控制输入类型的标签。
在上面的例子中,我们可以看到在select标签中有一个 #{id},这代表这条语句会获取一个名为id的输入参数,而这个输入参数正是我们在接口定义的入参。如果定义的是一个java bean作为输入参数,那么你可以用#{属性名}的形式获取参数中的值。
四.读取配置
使用xml配置框架和使用java配置框架,除了在读取配置时有些区别之外,在其他时候都相同的,下面我们先看看使用xml配置如何读取配置。
读取xml配置
package FrameWork.util;
import com.sun.imageio.plugins.jpeg.JPEGImageReaderResources;
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 sqlSessionUtil {
public static SqlSessionFactory getSqlSessionFactory() throws IOException {
InputStream inputStream= Resources.getResourceAsStream("Mybatis_Config.xml");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
}
public static SqlSession getSqlSession() throws IOException {
SqlSessionFactory sqlSessionFactory=sqlSessionUtil.getSqlSessionFactory();
return sqlSessionFactory.openSession();
}
}
可以看到这里直接通过Mybatis提供的Resource类读取Mybatis_Config.xml配置文件。而getResourceAsStream()方法是从classpath下寻找文件的。所以配置文件必须要加入到classpath路径下,才能读取到。接着使用这个流就可以创建SqlSessionFactory 对象,再通过该对象获取sqlSession对象。
读取java配置
public static SqlSession getSession(Configuration configuration)
{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);//根据配置生产SqlSessionFactory对象
return sqlSessionFactory.openSession();
}
configuration就是使用java配置出的最终配置对象,将对象传SqlSessionFactoryBuilder的build方法中就可以获得sqlSessionFactory对象,再使用sqlSessionFactory获取一个sqlSession对象。
五.测试框架
@Test
public void getUser() throws IOException {
SqlSession sqlSession= sqlSessionUtil.getSqlSession();
UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
List<user> list= userMapper.selectUser(1L);
for (user list) {
System.out.println(u);
}
}
不管是java配置还是xml配置的,在最终的使用上都是相同的。获取到SqlSession对象。然后调用getMapper方法获取userMapper接口的实例。这里实例是由Mybatis通过动态代理实例化得到的。得到接口的实例后就可以调用方法查询数据库了。