博客引用处(以下内容在原有博客基础上进行补充或更改,谢谢这些大牛的博客指导):
Mybatis入门&配置文件&映射文件
1.配置环境
首先得现在相应的jar包,点击这里下载,下载好后,进行解压,建议把源码包一起下载,因为里面不止有源码,还有配置文件和映射文件的模板,到时我们可以直接拷贝进项目。
解压出来后,目录如下
把jar包导入相应的目录结构下就可以进行开发了。
2.配置文件
配置文件的目录结构如下
这里我就记录一下environments的配置,因为其他的我还没用到。
在我们解压出来的源码包里,mybatis-3-mybatis-3.4.6-source\src\test\java\org\apache\ibatis\submitted\complex_property目录下有一个Configuration.xml,我们把它拷贝进项目中。
environments主要配置的就是连接的数据库,比如我连接的MySQL数据库。配置如下
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="" value=""/>
</transactionManager>
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="1311664842"/>
</dataSource>
</environment>
</environments>
这个总的配置文件应该就和Hibernate的hibernate.cfg.xml作用大概类似,和数据库进行连接,加入映射文件等。
3.映射文件
映射文件的目录结构如下
一个项目中可以有好多映射文件,映射文件的主要作用就是配置JavaBean实体类和数据库表的对应关系以及定义一些SQL语句。
我先定义一个Message类
public class Message implements Serializable{
private static final long serialVersionUID = 1L;
private int id;
private String command;
private String description;
private String content;
public Message() {}
}
该类中有四个属性,分别对应我数据库中message表的四个属性。
接着我们来配置该实体类的映射文件Message.xml。同样在mybatis-3-mybatis-3.4.6-source\src\test\java\org\apache\ibatis\submitted\complex_property目录下有一个User.xml,我们把它拷贝进项目,修改一下。
<!-- 一个名字空间 -->
<mapper namespace="Message">
<!-- 和数据库的表字段相对应 ,type表示相应的实体类-->
<resultMap type="com.codeliu.bean.Message" id="MessageResult">
<!-- 主键 column表示数据库中的字段,property表示实体类对应的属性-->
<id column="id" jdbcType="INTEGER" property="id"/>
<result column="command" jdbcType="VARCHAR" property="command"/>
<result column="description" jdbcType="VARCHAR" property="description"/>
<result column="content" jdbcType="VARCHAR" property="content"/>
</resultMap>
<!-- 同一个命名空间下的id要唯一 -->
<select id="getList" resultMap="MessageResult" parameterType="com.codeliu.bean.Message">
select id,command,description,content from message
<where>
<if test="command != null and !"".equals(command.trim())">
and command = #{command}
</if>
<if test="description != null and !"".equals(description.trim())">
and description like '%' #{description} '%'
</if>
<where>
</select>
</mapper>
上面的Message.xml配置了实体类和数据库表的对应关系,同时还有一条Select语句。在select语句中,我们用了where标签,如果where后面的条件都不成立,则直接输出where前的语句,这样就消除了动态拼接SQL的很多麻烦。
这里还用到了OGNL表达式,Mybatis中的OGNL表达式的规则如下
同时我们还看到在if标签中,我们可以像写Java语句一样,进行条件的判断,只是记得特殊符号要进行转义,比如双引号写成" OGNL表达式我也是第一次听,所以了解不是太多,恩只能写这么多。
当然,在该配置文件中还可以写delete,insert和update。写完该映射文件之后,还有一件重要的事,那就是在配置文件中进行配置。
<mappers>
<!-- 可以配置多个 -->
<mapper resource="com/codeliu/config/sqlxml/Message.xml"/>
</mappers>
配置完之后,我们就可以试试从数据库中取数据了。
4.log4j日志文件
学习过程中,我还学到了log4j日志文件的一些简单配置和应用,在进行取数据之前,我再总结一下log4j的配置。
首先还是得导入jar包,在我们下载的Mybatis里的lib目录下,就包含了这个jar包,把它导进项目即可。
log4j很强大,可以输出信息到日志文件中等等,但我现在只会一点点,那就是按格式输出到控制台。
还是在Mybatis源码文件中的mybatis-3-mybatis-3.4.6-source\src\test\java目录下,有一个log4j.properties,我们把它考皮进来,修改一下。
#日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG,定义低的优先级则高的也会显示
log4j.rootLogger=DEBUG, Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
#%d:产生日志的时间;
#%t:线程名称;
#%p:日志级别,DEBUG;
#-5:至少占5位字符,不够的话用空格补齐,放在右边
#%c:输出日志的类的全名,包括包名
#%m:附加信息
#%n:换行
log4j.appender.Console.layout.ConversionPattern=%d[%t] %-5p[%c]-%m%n
log4j.logger.org.apache=INFO
具体可以看看这篇文章http://www.codeceo.com/article/log4j-usage.html
做完这些,我们就可以开始从数据库读数据了。
5.使用Mybatis从数据库读文件
public class DBAccess {
public SqlSession getSqlSession() throws IOException {
// 读取配置信息里的数据库连接
Reader reader = Resources.getResourceAsReader("com/codeliu/config/Configuration.xml");
// 获取sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
// 获取sqlSession SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
}
上面的代码先读取配置文件中的配置,然后获取一个sqlSession,SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
接下来,我们就看看怎么使用sqlSession执行映射文件中的sql语句。
Message message = new Message();
List<Message> messages = null;
message.setCommand(command);
message.setDescription(description);
// 读取Message.xml中的sql语句
messages = sqlSession.selectList("Message.getList", message);
sqlSession.commit();
还记得我上面映射文件中写的select语句,上面的代码执行的就是Message.xml中的查询语句。selectList函数中传入了两个参数,第一个是查询语句的id,这个在一个名字空间中是唯一的。第二个是Message类的实例,通过它,我们就可以把它的两个属性传入sql语句中。最后记得commit,因为Mybatis默认是不自动提交的。同时还要记得关闭sqlSession。
sqlSession.close();
启动tomcat,然后在网页中运行(当然,这里我省略了很多比如相关的Servlet,大家自己补充)。
2018-05-09 09:45:21,094[http-bio-8080-exec-9] DEBUG[Message.getList]-==> Preparing: select id,command,description,content from message where 1=1 and command = ? and description like '%' ? '%'
2018-05-09 09:45:21,097[http-bio-8080-exec-9] DEBUG[Message.getList]-==> Parameters: 查看(String), 精彩(String)
2018-05-09 09:45:21,340[http-bio-8080-exec-9] DEBUG[Message.getList]-<== Total: 1
上面是控制台输出的日志,这是log4j的效果,通过这个,我们就可以看得清清楚楚了。首先Mybatis先把映射文件中的OGNL表达式替换成?,然后使用我们的输入条件把?进行替换,最后输出查询结果。