Mybatis的一般步骤
- 导入相关的jar包
- 配置核心XML配置文件
- 编写工具类
- 编写相关的接口
- 配置相关Mapper.xml
- 通过工具类获取SqlSession来执行接口方法
- 提交事物,关闭SqlSession
导入相关的jar包
导入Jar包,我们使用的是Maven,Maven仓库的地址是Maven中相关的gav是
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.8</version>
</dependency>
导入jar包后我们在项目目录中的resources文件夹下创立一个XML文件,文件的名字是没有硬性的要求的,不过一般的命名为mybatis-config.xml。
里面写好相关的XML的约束,相关的约束可以从Mybatis中文文档中去获得
配置核心XML配置文件
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>
</configuration>
接下来我们就来配置核心的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>
<environments default="development">
<!--这个标签是选择当前的环境-->
<environment id="development">
<!--这个标签是配置一个数据库环境-->
<transactionManager type="JDBC"/>
<!--这个其实是配置事物管理器,一共有两个选项一个是JDBC,另一个是MANAGED不过MANAGED什么都没干,所以一般用JDBC-->
<dataSource type="POOLED">
<!--这个标签是选择数据源有三个选项-->
<!--POOLED 通过连接池的方式去创立-->
<!--UNPOOLED 通过无池的方式去创立-->
<!--JNID 是为了可以在EJB中去使用,已经不怎么用了-->
<!--下面这些属性的用变量的形式要先导入.properties文件或者标签配置-->
<property name="driver" value="${driver}"/>
<!--驱动:com.mysql.jdbc.cj.Dirver-->
<property name="url" value="${url}"/>
<!--jdbc:mysql://ip地址:端口号/数据库名称-->
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<!--以上这些内容,和我们使用JDBC建立连接是传入的参数-->
<!--分别是驱动、数据库的地址、数据库的用户名和密码-->
</dataSource>
</environment>
</environments>
</configuration>
这样就完成了一个最最简单的核心配置文件,接下来我们来完善它,但是首先我们要先认识其中的几个常用的标签配置
<!--常用的我会给注释说明,不常用的我就不说明了-->
<!--一下都为案例,根据自己的需求去配置,不是必要的都-->
<properties resource="org/mybatis/example/config.properties">
<!--这个是将.properties文件载入到XML之中-->
<!--下面的这些property是对properties内容的补充,可以没有-->
<!--property的型式是键值对的型式和.properties文件内部一致-->
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</properties>
<settings>
<!--这个标签是用来进行设置的里面可以进行的设置如下-->
<setting name="cacheEnabled" value="true"/>
<!--是否开启二级缓存,这个的话等到后面说到缓存的时候再说-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
<setting name="logImpl" value="LOG4J"/>
<!-- 这个是用来确定使用什么日志,这里用的是LOG4J-->
<!----------------------分割线--------------------------------------------------------------->
<!--是不是感觉超级多,但是常用的不多,也没有必要死记,需要的时候到中文文档中去取好了-->
<!--中文文档的网址上面给过了-->
<settings>
<typeAliases>
<!--这个标签是起别名用的,在后面配置Mapper.xml时会方便一点,后面会解释-->
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
<!--以上的就是其别名的方式,给对应的实体类去取一个别名,方便操作-->
</typeAliases>
<plugins>
<!--这个标签的作用是安装插件的,不是必要的-->
<plugin interceptor="org.mybatis.example.ExamplePlugin">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
<mappers>
<!--每次实现完对应接口的Mapper.xml后要在这里注册才能生效-->
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
我们来接着在之前的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>
<!--这里导入一个配置文件db.properties-->
<properties resource="resources/db.properties"/>
<settings>
<setting name="logImpl" value="LOG4J"/>
<!--使用LOG4J时注意要导入LOG4J的jar包,可以去Maven仓库里去找-->
<setting name="cacheEnabled" value="true"/>
<!--开启一个二级缓存,是什么后面会解释-->
<setting>
</settings>
<environments default="development">
<!--这个标签是选择当前的环境-->
<environment id="development">
<!--这个标签是配置一个数据库环境-->
<transactionManager type="JDBC"/>
<!--这个其实是配置事物管理器,一共有两个选项一个是JDBC,另一个是MANAGED不过MANAGED什么都没干,所以一般用JDBC-->
<dataSource type="POOLED">
<!--这个标签是选择数据源有三个选项-->
<!--POOLED 通过连接池的方式去创立-->
<!--UNPOOLED 通过无池的方式去创立-->
<!--JNID 是为了可以在EJB中去使用,已经不怎么用了-->
<!--下面这些属性的用变量的形式要先导入.properties文件或者标签配置-->
<property name="driver" value="${driver}"/>
<!--驱动:com.mysql.jdbc.cj.Dirver-->
<property name="url" value="${url}"/>
<!--jdbc:mysql://ip地址:端口号/数据库名称-->
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<!--以上这些内容,和我们使用JDBC建立连接是传入的参数-->
<!--分别是驱动、数据库的地址、数据库的用户名和密码-->
</dataSource>
</environment>
</environments>
<mappers>
<!--这里现在还没有需要注册的Mapper.xml-->
</mappers>
</configuration>
到这里核心的XML配置文件,大概的配置就结束了,后面还会来在里面加东西,比如说是根据实体类来起一些别名,方便对应Mapper.xml的配置,还有注册一些Mapper.xml让其生效。
编写工具类
接下来我们来编写一个工具类,通过这个工具类来使核心配置XML生效,以及方便我们之后获取SqlSession来进行SQL的执行。public class MybatisUtil{
private SqlSessionFectory sqlSessionFectory;
//静态代码块先去建立sqlSessionFectory
static{
try{
String resource = "resources/mybatis-config.xml";
InputStream inputStream = Resource.getResourceAsStream(resource);
sqlSessionFectory = new SqlSessionFectoryBuilder.build(inputStream);
}catch (IOException e) {
e.printStackTrace();
}
}
//通过SqlSessionFectory来获得sqkSession
public static SqlSession GetSqlSession()
{
return sqlSessionFectory.openSession();
}
}
编写相关的接口
接下来我们就根据我们的需求来编写接口类吧,不过再这之前,我们先假定我们的数据库里有以下的内容(随便打的一张表,表名为userInfo)我们现在假如说需要查询这个表中的信息,我们建立这样一个对应这个表的实体类
public class User{
private String username;
private String password;
private String level;
//一个简单的实体类,实现了Get和Set方法,重写了toString
public User(){}
public User(String username,String password,String leveal)
{
this.username = username;
this.password = password;
this.leveal = level;
}
public void SetUsername(String username){
this.username = username;
}
public void SetPassword(String password){
this.password = password;
}
public void SetLevel(String level){
this.level = level;
}
public String GetUsername()
{
return this.username;
}
public String GetPassword()
{
return this.password;
}
public String GetLevel()
{
return this.level;
}
public String toString(){
return "User:username = "+this.username+" password = "+this.password+" level = "+this.level;
}
}
接下来让我们来对于需要的操作构建一个接口
public interface UserMapper{
//获取所有的用户的所有的信息
List<User> GetAllUserInfo();
//插入一个用户的信息
void SetUserInfo(User userinfo);
//删除一个用户的信息
void DelUserInfo(User userinfo);
//更改一个用户的信息
void UpdataUserInfo(User objectInfo,User updataInfo);
}
配置相关Mapper.xml
写好后,我们就需要去配置对应的Mapper.xml了,可以理解为通过XML来实现接口<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--写完以后记得去核心的XML文件中去进行注册-->
<mapper namespace="Dao.UserMapper">
<!--namespace里面输入的是要实现接口的路径-->
<select id="GetAllUserInfo" resultType="pojo.User">
<!--实现什么样的SQL就去使用什么样的标签-->
<!--id里面填写的是接口内不方法的名称-->
<!--resultType里面填写的是结果的类型-->
<!--如果你不起别名就要像现在一样把路径写完整-->
SELECT * FROM userinfo;
<!--其实这样写SQL是不好的,但是这里的重点不是SQL所以以好理解为主-->
</select>
<!--这里其实可以使用动态SQL插入,后面会提到-->
<insert id="SetUserInfo" parameterType="pojo.User">
INSERT INTO userinfo(username,passwrod,level) VALUES(#{username},#{password},#{level})
</insert>
<delete id="DelUserInfo" parameterType="pojo.User">
DELETE FROM userinfo WHERE username=#{username} AND password=#{password} AND level=#{level}
</delete>
<!--这里你会发现参数的部分你不知道该如何去写-->
<!--这里呢,我就介绍一下Map,把参数换成Map,这个东西很万能但是有个一对多和多对一的问题-->
<!--当然接口里的函数要改成下面的型式-->
<!--void UpdataUserInfo(User objectInfo,User updataInfo);-->
<!--那么下面的参数就可以随便写了,只要传入Map的键值对符合就行-->
<updata id="UpdataUserInfo" parameterType="Map">
UPDATA userinfo SET #{updataUsername},#{updataPassword},#{updataLevel} WHERE username = #{objectUsername}
AND password = #{objectPassword} AND level = #{objectLevel}
</updata>
</mapper>
通过工具类获取SqlSession来执行接口方法
配置完毕后,并且在核心的Mybatis-config.xml中完成配置了以后,接下来就可以使用了//以查找为例子
SqlSession sqlSession = MybatisUtill.GetSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> result = userMapper.GetAllUserInfo();
for(int i;i<result.size();i++)
{
System.out.println(result.get(i));
}
sqlSession.close();//使用完记得关掉
//如果是参数是Map的话,只需要,传入一个Map就行了,里面的内容可以自己添加
//注意:如果你没有再工具类中的openSqlSession()中设置为true,那么做修改时
//要记得提交事物,方式是sqlSession.commit();
动态SQL
动态SQL就是可以根据不同的条件,为我们拼接不同的SQL语句,如果有使用过JDBC的经验的话,就会知道,当我们在去拼接这些语句时候的痛苦,比如为了解决WHERE后面直接接一个AND,我们会用一个WHERE 1=1来做拼接,但是SET之后的每一个项后面的逗号呢,之类的又是新的问题,不过使用了Mybatis后,我们就可以比较轻松的解决这个问题。<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Dao.Temp">
<select>
<!--查询语句的拼接-->
<!--where,set两个标签的本质都是trim-->
SELECT * FORM userinfo
<where>
<if test="username != null">
username = #{username}
</if>
<if test="password != null">
AND password = #{password}
</if>
<if test="level != null">
AND level = #{level}
</if>
</where>
</select>
<updata>
UPDATA userinfo
<set>
<if test="username != null">
username = #{username}
</if>
<if test="password != null">
passowrd = #{password}
</if>
<if test="level != null">
level = #{level}
</if>
</set>
</updata>
<!--还有一类是choose、when、otherwise和上面差不多,很像Switch语句这里不浪费时间介绍了-->
<!--最难的是trim,它可以让你自定义拼接方法,但是最常用的where和set已经实现所以基本用不到-->
</mapper>
日志配置
日志配置主要用的是LOG4J,但是之前LOG4J出现过重大的漏洞,所以现在通过更新版本来修复漏洞 其GAV如下(2.15.0内部已经将漏洞修复)<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>2.15.0</version>
</dependency>
LOG4J的基本配置如下,写一个相关的.properties文件就行了
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/kuang.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
缓存
缓存的话分为一级缓存和二级缓存,一级缓存和二级缓存的区别最主要的就是其作用的范围不同。 一级缓存的缓存内容是在一个SqlSession内,而二级缓存的作用范围是一个namespace也就是一个Mapper。一级缓存的开启是默认开启的,二级缓存的开启只需要在对应的Mapper.xml文件里添加一个标签就行了,这个标签里面可以什么都不写, 就写一个
<cache/>
就可以了。
注解的话比较简单,可以通过中文文档去自行学习,中文文档上方已经给出。