SSM框架-MyBatis2
目录
一、MyBatis使用的简单原理
二、日志LOG4J
三、MyBatis中的其他标签
四、通过接口绑定映射文件
五、动态SQL
一、MyBatis使用的简单原理
1.需要加入mybatis的核心包和连接数据库的驱动包。
2.写一个配置文件,这个文件配置了连接数据库的相关参数和关联了一个专门用来写sql语句的映射文件。
3.需要将这个配置文件加载到程序中,转换为一个流对象,并创建SqlSessionFactory对象。
4.因为SqlSessionFactory对象是一个接口,所以不能直接new对象,需要使用SqlSessionFactoryBuilder里面的build方法去间接的创建一个SqlSessionFactory对象。
5.这个build方法会调用一个重载的build方法,这个重载的build方法里面会将这个传入的流对象使用XMLConfigBuilder对象封装。
6.在XMLConfigBuilder对象中会有一个XpathParser类型的属性,这个XpathParser类型的属性是用来解析XML文件的一个对象。
7.也就是说,我们配置文件中的值都被封装到一个对象中当作属性来保存了,也就是这个对象保存了我们配置文件中的所有数据,包括关联的映射文件中的数据。
8.new一个XMLConfigBuilder对象之后,会调用这个对象的parse方法,然后将结果传入到SqlSessionFactoryBuilder类中的一个重载build方法里面。
9.这个XMLConfigBuilder对象的parse方法的返回值是一个Configuration的配置对象,这个方法中拿到了了一个/configuration,这个configuration是我们配置文件中的根标签,通过这个根标签开始一层一层的解析,去获取到我们配置文件中的每一个值。
10.也就是说,这个XMLConfigBuilder对象的parse方法会把我们的配置文件中的所有数据全部取到,然后传入到一个返回值为SqlSessionFactory类型的build方法中去构建一个SqlSessionFactory对象。
11.然后,会通过SqlSessionFactory对象去调用openSession方法,这个方法里面又会调用一个openSessionFromDataSource方法,这个openSessionFromDataSource方法会传入三个参数,第一个参数拿到的是我们配置文件里面解析后的所有数据,第二个参数是控制事务的传播方式的,第三个参数使用控制事务的提交方式的。
12.接下来会在这个openSessionFromDataSource方法中,使用传过来的配置文件中的查询数据库的语句去构建一个Executor对象,这个对象是用来执行已经提交的线程任务对象的。
13.最后,会返回一个SqlSession对象,然后使用这个对象去执行一些sql语句,也就是说把这些所有数据放到了线程池里面去,如果要执行sql语句的话,就会把配置文件里面对应id的sql语句放到这个执行器里面去执行,执行后就可以拿到我们想要的结果。
14.图解MyBatis框架原理:

二、日志LOG4J
1.log4j简介:http://logging.apache.org
(1)log4j是Apache提供的一款记录日志的工具。
(2)log4j的API与实现是分开的,从而使应用程序开发人员可以清楚地知道他们可以使用哪些类和方法。
(3)log4j既可以将日志信息打印在控制台,也可以打印输出到一个日志文件中。
(4)log4j可以定制日志的输出格式。
(5)log4j可以定制日志级别。
2.日志的作用
(1)让我们在写代码报错的时候,可以通过日志去跟踪到这个错误出现在哪里。
3.日志的配置文件解析(log4j.properties)
(1)log4j.rootCategory=DEBUG, CONSOLE, LOGFILE:设置日志级别
- DEBUG:调试级别,这个级别是最详细的
- CONSOLE:代表日志可以往控制台中输出
- LOGFILE:表示向文件中写入日志信息
- FATAL:致命的,表示非常严重的错误,一般是系统错误
- ERROR:错误,表示代码错误,比较严重
- WARN:警告,不影响程序的运行,但是可能存在风险
- INFO:信息,表示一个普通的输出信息
- 级别的大小:FATAL<ERROR<WARN<INFO<DEBUG
- 注意:这个日志的级别越大越详细
(2)log4j.appender.CONSOLE.layout.ConversionPattern=- %m %c %l %d{yyyy-MM-dd HH:mm:ss}%n:设置日志在控制台输出的格式
(3)设置将日志保存在本地文件中
- log4j.appender.LOGFILE.File=E:/log4j.log:指定日志文件存放路径
- log4j.appender.LOGFILE.Append=true:设置向文件中写入日志信息的模式是追加
- log4j.appender.LOGFILE.Threshold=DEBUG:设置往文件中存放日志的级别
- log4j.appender.LOGFILE.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m %d{yyyy-MM-dd HH:mm:ss}%n:设置往文件中存放日志的格式
(4)案例:
#设置日志级别
# Set root category priority to INFO and its only appender to CONSOLE.
log4j.rootCategory=DEBUG, CONSOLE, LOGFILE
#log4j.rootCategory=INFO, CONSOLE LOGFILE
#局部调整日志级别
#log4j.logger.com.mapper.UserMapper.selAll=DEBUG# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL
#日志打印到控制台上的相关信息设置
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=- %m %c %l %d{yyyy-MM-dd HH:mm:ss}%n
#日志存储到硬盘上的相关信息设置
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
#指定日志存放的文件路径
log4j.appender.LOGFILE.File=E:/log4j.log
#Append追加信息,和StringBuffer类的中的功能一样,就是我那个日志文件中继续追加新的内容
log4j.appender.LOGFILE.Append=true
#调整往日志文件中存入日志信息的级别
log4j.appender.LOGFILE.Threshold=DEBUG
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m %d{yyyy-MM-dd HH:mm:ss}%n
三、MyBatis中的其他标签
1.properties:用于加载外部的properties文件,通过${}的方式获取
(1)如果想要在配置文件中使用外面文件中的值,需要将文件加载进来。
(2)格式:<properties resource="db.properties"></properties>。
(3)案例:
- db.properties文件内容:
-
driver = com.mysql.jdbc.Driver url = jdbc:mysql://localhost:3306/xiangxue?serverTimeZone=CST&characterEncoding=utf-8 username = root password = 123456 - application-dao.xml文件内容:
-
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><!--从外面src目录下加载db.properties文件--><properties resource="db.properties"></properties><environments default="development"> <!--代表默认使用哪个数据源环境,数据源可以有多个,每个数据源可以对应不同的数据库--><environment id="development"><transactionManager type="JDBC"/> <!--表示沿用JDBC的事务逻辑--><dataSource type="POOLED"> <!--表示使用连接池技术--><property name="driver" value= "${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><!--这个是用来指定使用的sql语句文件的路径,这个sql语句文件叫映射文件--><mapper resource="com/mybatis/mapper/UserMapper.xml"/></mappers> </configuration>
2.typeAliases:配置简化返回值类型
(1)这个可以简化映射文件中的resultType的值,为这个值取一个别名。
(2)格式:<typeAliases><typeAlias type="包名加类名" alias="别名,随便取"></typeAlias></typeAliases>。
(3)案例:
- application-dao.xml文件内容:
-
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><!--从外面src目录下加载db.properties文件--><properties resource="db.properties"></properties><typeAliases><!--给**mapper.xml文件中resultType值取别名--><typeAlias type="com.mybatis.pojo.Users" alias="Users"></typeAlias></typeAliases><environments default="development"> <!--代表默认使用哪个数据源环境,数据源可以有多个,每个数据源可以对应不同的数据库--><environment id="development"><transactionManager type="JDBC"/> <!--表示沿用JDBC的事务逻辑--><dataSource type="POOLED"> <!--表示使用连接池技术--><property name="driver" value= "${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><!--这个是用来指定使用的sql语句文件的路径,这个sql语句文件叫映射文件--><mapper resource="com/mybatis/mapper/UserMapper.xml"/></mappers> </configuration> - 映射文件中的内容:
-
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.mybatis.example.BlogMapper"><select id="selAll" resultType="Users">select * from users</select><select id="selOne" resultType="Users">select * from users where uid = 9;</select> </mapper>
四、通过接口绑定映射文件
1.接口中定义方法:
(1)映射文件中提供对应的标签,此时,SQL语句中获取方式通过#{param+数字}的方式。
2.将映射文件和接口关联起来:
(1)将映射文件中的根标签里面namespace的值改为包名加接口名。
(2)格式:<mapper namespace="com.mybatis.mapper.UserMapper"></mapper>。
3.使用:
(1)声明一个与映射文件中sql语句的id名一模一样的方法,id名与方法名必须一模一样。
(2)在其他类中使用SqlSession对象.getMapper(接口名.class)去获取到接口的对象。
- 接口名.class是接口的字节码文件。
(3)使用获取到的接口对象去调用里面的方法执行sql语句就可以了。
4.案例:
(1)映射文件中的内容
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--通过接口的全路径名与当前的映射文件关联起来-->
<mapper namespace="com.mybatis.mapper.UserMapper"><select id="selBy" resultType="Users">select * from users where username = #{param1}</select><insert id="add">insert into users values (null ,#{username},#{password},#{city})</insert><update id="update">update users set city = #{city} where username = #{username}</update><delete id="deleteBy">delete from users where uid = #{param1}</delete>
</mapper>
(2)接口中的内容
package com.mybatis.mapper;import com.mybatis.pojo.Users;public interface UserMapper {Users selBy(String username);//注意:当前抽象方法的方法名selBy要与映射文件中的id名一致int add(Users users);int update(Users users);int deleteBy(int uid);
}
(3)具体的使用
package com.mybatis.test;import com.mybatis.mapper.UserMapper;
import com.mybatis.pojo.Users;
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 org.junit.Test;import java.io.IOException;
import java.io.InputStream;public class Demo2 {SqlSession session;UserMapper userMapper;public Demo2(){//加载application-dao.xml文件String resource = "application-dao.xml";try {//将application-dao.xml文件转换为流对象InputStream resourceAsStream = Resources.getResourceAsStream(resource);//获取SqlSessionFactory对象SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);//获取发送sql语句的对象session = sqlSessionFactory.openSession();//通过session获取UserMapper接口的对象userMapper = session.getMapper(UserMapper.class);} catch (IOException e) {e.printStackTrace();}}/*** 查询*/@Testpublic void sel(){Users users = userMapper.selBy("小丽");System.out.println(users);}/*** 新增*/@Testpublic void add(){Users users = new Users();users.setUsername("马云");users.setPassword("321");users.setCity("杭州");int n = userMapper.add(users);System.out.println(n == 1 ? "新增成功" : "新增失败");session.commit();}/*** 修改*/@Testpublic void update(){Users users = new Users();users.setCity("北京");users.setUsername("马云");int n = userMapper.update(users);System.out.println(n == 1 ? "修改成功" : "修改失败");session.commit();}/*** 删除*/@Testpublic void delete(){int n = userMapper.deleteBy(33);System.out.println(n == 1 ? "删除成功" : "删除失败");session.commit();}
}
5.注意:这个方法更加灵活,开发中推荐使用这种方式,比session中提供的方法更方便。
五、动态SQL
1.概念
(1)根据条件的不同,SQL语句也会随之动态的改变。MyBatis中,提供了一组标签用于实现动态SQL。
2.<if>标签
(1)用于进行条件判断,test属性用于指定判断条件。为了拼接条件,在SQL语句后强行添加1=1的恒成立条件。
3.<where>标签
(1)用于sql语句中判断是否带有条件,如果有条件,那么where语句会自动加上,如果没有条件,那么where语句就不会加,sql语句没有条件就是去查询所有数据,where标签主要是用来搭配上面的if标签的,用来去除1=1的恒成立条件。
4.案例:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--通过接口的全路径名与当前的映射文件关联起来-->
<mapper namespace="com.mybatis.mapper.UserMapper"><!--where 1=1 是一个恒成立的条件,目的是把where语句用完,因为sql语法中我们想要使用and接条件,where必须在前面,当前这个where有点鸡肋,不需要它,但它又必须出现在and前面,所以要使用这种方式消费掉它--><select id="selBy" resultType="Users">select * from users where 1 = 1<if test="uid != 0">and uid = #{uid}</if><if test="username != null and username != ''">and username = #{username}</if><if test="password != null and password != ''">and password = #{password}</if><if test="city != null and city != ''">and city = #{city}</if></select><select id="selBy2" resultType="Users">select * from users<where><if test="uid != 0">and uid = #{uid}</if><if test="username != null and username != ''">and username = #{username}</if><if test="password != null and password != ''">and password = #{password}</if><if test="city != null and city != ''">and city = #{city}</if></where></select>
</mapper>