Mybatis总结

Mybatis的一般步骤

  1. 导入相关的jar包
  2. 配置核心XML配置文件
  3. 编写工具类
  4. 编写相关的接口
  5. 配置相关Mapper.xml
  6. 通过工具类获取SqlSession来执行接口方法
  7. 提交事物,关闭SqlSession
导入相关的jar包
导入Jar包,我们使用的是Maven,Maven仓库的地址是

https://mvnrepository.com/

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中文文档中去获得

中文文档:https://mybatis.org/mybatis-3/zh/getting-started.html

配置核心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/>

就可以了。

注解的话比较简单,可以通过中文文档去自行学习,中文文档上方已经给出。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值