MyBatis 是一款优秀的持久层框架,通过它可以更加便捷地和JDBC进行交互,而不需要进行繁琐的数据库连接配置与结果集的获取。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。此外它还支持定制化 SQL、存储过程以及高级映射。
使用步骤
1、使用Mybatis首先需要引入jar包,从其GitHub网站https://github.com/mybatis/mybatis-3/releases获取其发布版。之后解压拷贝其jar包到所需的项目中,并添加为依赖。
2、配置数据库连接:接下来需要修改mybatis的配置文件,设置数据库连接的驱动、url、用户名和密码:
-
<?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>
-
<settings>
-
<!--设置控制台输出日志-->
-
<setting name="logImpl" value="STDOUT_LOGGING" />
-
</settings>
-
-
<!--数据库连接配置-->
-
<environments default="development">
-
<environment id="development">
-
<transactionManager type="JDBC">
-
<property name="" value=""/>
-
</transactionManager>
-
<dataSource type="UNPOOLED">
-
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
-
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
-
<property name="username" value="root"/>
-
<property name="password" value="1234"/>
-
</dataSource>
-
</environment>
-
</environments>
-
-
<!--注册映射配置-->
-
<mappers>
-
<mapper resource="com/dialogue/config/sql/Message.xml"/>
-
</mappers>
-
</configuration>
3、创建SqlSession:Mybatis对数据库的操作是通过一个SqlSession对象来实现的,因此需要先创建一个DBUtils类来生成该对象,该类实现了getSession()方法用于读取数据库的配置文件并创建会话对象并返回
-
package com.dialogue.utils;
-
-
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.Reader;
-
-
public
class DBUtils {
-
public static SqlSession getSession() throws IOException {
-
//读取配置文件中的数据库连接信息
-
Reader reader= Resources.getResourceAsReader(
"com/dialogue/config/Configuration.xml");
-
//构建SQLSessionFactory
-
SqlSessionFactory sqlSessionFactory=
new SqlSessionFactoryBuilder().build(reader);
-
//打开数据库会话
-
SqlSession sqlSession=sqlSessionFactory.openSession();
-
return sqlSession;
-
}
-
}
4、配置数据库操作文件:Mybatis将数据库所要执行的操作和操作之后的结果集映射的规则都写进了对应的xml文件,因此想要通过SqlSession进行数据库操作,首先需要配置对应的xml文件。例如希望从数据库中查询message表的信息,表的字段如下。相应地我们创建了对应的JavaBean类Message,我们希望查询表并返回所有Message对象的List
如下所示为配置文件Message.xml,<mapper>内定义数据表和数据库的映射关系,其中namespace类似于Java的package机制,用于防止命名冲突。<resultMap>标签内定义数据类型的映射,type字段指明映射的Java类,id为该映射的名。之后<id>和<result>标签内定义数据库的字段与Java类成员变量的映射,两者的区别在于如果是主键的话用id,普通字段用result。其中column为查询数据库的字段,如果select时起了别名,则按照别名来。jdbcType为该字段的类型,property为要映射到的Java类成员变量。
<select>标签定义的是数据库操作的配置,其id为了区分不同的操作,resultMap为刚才定义的类型映射的id,标签内为要执行的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="Message">
-
-
<!--数据库与Java类映射关系的配置-->
-
<resultMap type="com.dialogue.bean.Message" id="MessageResult">
-
<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>
-
-
<!--数据库操作的配置-->
-
<select id="getMessage" parameterType="long" resultMap="MessageResult">
-
SELECT ID,COMMAND,DESCRIPTION,CONTENT FROM message
-
</select>
-
</mapper>
将上面的配置文件Message.xml在主配置文件configuration.xml中进行注册:
-
<mappers>
-
<mapper resource="com/dialogue/config/sql/Message.xml"/>
-
</mappers>
5、使用Mybatis查询数据: 首先通过之前定义的DBUtils的getSession()获取SQL Session对象,之后通过该对象调用selectList()进行查询数据库操作并返回结果对象的List。selectList()可以传入参数"Message.getMessage"选择xml配置文件中namespace为Message中id为getMessage的<select>操作标签
-
public
class MessageList {
-
List<Message> messageList=
new ArrayList<>();
-
-
public MessageList() {
-
}
-
-
public List getMessageList() {
-
SqlSession sqlSession=
null;
-
-
try {
-
//获取会话对象
-
sqlSession= DBUtils.getSession();
-
//执行sql操作
-
messageList=sqlSession.selectList(
"Message.getMessage");
-
}
catch (IOException e) {
-
e.printStackTrace();
-
}
finally {
-
if (sqlSession!=
null)
-
sqlSession.close();
//关闭会话对象
-
}
-
return messageList;
-
}
-
}
条件查询
之前使用的select查询将所有结果都返回了,如果希望按条件进行查询,则需要在调用selectList()传入查询条件,但是该函数不支持传入多个查询参数,因此我们需要将查询条件组合为一个数据对象。在这里创建一个message对象并将查询条件command、description赋值给对象属性,
-
public List getMessageList(String command,String description) {
-
SqlSession sqlSession=
null;
-
-
//将查询条件赋给对象
-
Message m=
new Message();
-
m.setCommand(command);
-
m.setDescription(description);
-
-
try {
-
sqlSession= DBUtils.getSession();
-
//查询时传入参数条件
-
messageList=sqlSession.selectList(
"Message.getMessage",m);
-
......
那么将查询条件通过对象传给查询语句后,在xml文件中如何接收这些条件变量并拼接进查询语句呢?这就需要使用OGNL。
OGNL
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用特定的表达式去存取对象的属性。因为只能传入单个变量,所以在mybatis中的单个数据类型都用 _parameter 代替,而Java复合类型数据的获取如下所示:
如果是自定义的类型可以直接通过属性名获取对象的属性,例如下面的<select>查询中使用parameterType设置传入参数,之后可以在其中直接使用message对象的command、description属性。不仅如此,可以直接在OGNL表达式中直接使用Java中的对象和函数,例如在<if test="">标签中对查询字段进行判断,注意其中的符号&需要进行转义为XML标记&
Java中Prepare Statement通过?来进行占位符,之后填充变量,在OGNL中使用 #{ command } 将变量填充到对应位置。
因此在Message.xml文件中修改之后按command和description条件的查询<select>如下:
-
<select id="getMessage" parameterType="com.dialogue.bean.Message" resultMap="MessageResult">
-
SELECT ID,COMMAND,DESCRIPTION,CONTENT FROM message where 1=1
-
<if test="command !=null && ! command.isEmpty()">
-
AND COMMAND=#{command}
-
</if>
-
<if test="description !=null && ! description.isEmpty()">
-
AND DESCRIPTION like '%' #{description} '%'
-
</if>
-
</select>
打印SQL调试语句:Mybatis集成了sql语句的控制台日志输出,在Configuration.xml文件中设置如下可开启日志输出
-
<configuration>
-
<settings>
-
<!--设置控制台输出日志-->
-
<setting name="logImpl" value="STDOUT_LOGGING" />
-
</settings>
-
......
删除操作
如下记录一个删除操作从请求到完成的整个过程,以记录Java处理数据的文件结构
首先在jsp页面内向服务器deleteOne的servlet发起请求并附带要删除的条目id
<a href="<%=basePath%>deleteOne?id=${message.getId()}">删除</a>
接着请求到达DeleteOneServlet,在该servlet中接收前端传来的参数,之后调用相应的Service完成删除操作,最后再返回列表页面
-
@WebServlet(name =
"DeleteOneServlet",urlPatterns =
"/deleteOne")
-
public
class DeleteOneServlet extends HttpServlet {
-
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-
-
}
-
-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-
//接收参数
-
request.setCharacterEncoding(
"UTF-8");
-
String id=request.getParameter(
"id");
-
//调用service完成删除操作
-
MaintainService maintainService=
new MaintainService();
-
maintainService.deleteOne(id);
-
//删除之后再跳转到列表显示页面
-
request.getRequestDispatcher(
"/dialogueList").forward(request,response);
-
}
-
}
因此删除的操作指令来到了MaintainService类中,在Service中完成数据的处理和相关判断等操作,将处理好的数据传给对应的DAO层进行删除操作
-
public
class MaintainService {
-
public void deleteOne(String id){
-
if (id!=
null && !id.isEmpty()){
//数据判空
-
MessageDao messageDao =
new MessageDao();
-
//将id数据类型转换并传给dao层方法
-
messageDao.deleteOne(Integer.valueOf(id));
-
}
-
}
-
}
此时操作请求来到了MessageDao,在DAO层完成数据对象的具体操作--删除,这里使用sqlSession.delete()进行数据库的删除操作,对应是Message.xml中<delete>标签的deleteOne。由于其设置事务不自动提交,因此在操作完成后通过commit()将操作提交到数据库
-
public
class MessageDao {
-
public void deleteOne(int id){
-
SqlSession sqlSession=
null;
-
-
try {
-
sqlSession=DBUtils.getSession();
-
sqlSession.delete(
"Message.deleteOne",id);
//通过Mybatis完成删除操作
-
sqlSession.commit();
//提交事务
-
}
catch (IOException e) {
-
e.printStackTrace();
-
}
finally {
-
if (sqlSession!=
null)
-
sqlSession.close();
-
}
-
-
}
-
......
在Mybatis配置文件Message.xml中的删除操作定义如下,这样一个删除操作就真正交到了数据库中完成了删除操作。
-
<delete id="deleteOne" parameterType="int">
-
DELETE FROM message WHERE ID=#{_parameter}
-
</delete>
常用标签
在Mybatis的配置文件中的常用标签记录如下
<where>标签用于代替SQL语句中的WHERE关键字与查询条件的拼接,如果直接使用WHERE后面在加条件时会有AND关键字需要拼接,但是如果WHERE之后直接跟AND条件会报错,使用<where>标签帮我们进行这个处理
-
<select id="getMessage" parameterType="com.dialogue.bean.Message" resultMap="MessageResult">
-
SELECT ID,COMMAND,DESCRIPTION,CONTENT FROM message
-
<where>
<!--使用where标签接条件-->
-
<if test="command !=null && ! command.isEmpty()">
-
AND COMMAND=#{command}
-
</if>
-
<if test="description !=null && ! description.isEmpty()">
-
AND DESCRIPTION like '%' #{description} '%'
-
</if>
-
</where>
-
</select>
<sql>标签可以用于定义经常使用的常量,之后可以用<include>标签引入,这样代替经常出现的语句
-
<sql id="columns">ID,COMMAND,DESCRIPTION,CONTENT
</sql>
-
-
<select id="getMessage" parameterType="com.dialogue.bean.Message" resultMap="MessageResult">
-
SELECT
<include refid="columns">
</include> FROM message
-
</select>
<update>标签用于更新操作,对应在Java中通过update()调用该标签的方法。在update多个值时,要用逗号分割,如果是最后一个逗号不处理会报错,这里就需要用到<set>标签
-
<update id="update" parameterType="com.dialogue.bean.Message">
-
UPDATE message
-
<set>
-
<if test="command !=null && ! command.isEmpty()">
-
COMMAND=#{command},
-
</if>
-
<if test="description !=null && ! description.isEmpty()">
-
DESCRIPTION=#{description},
-
</if>
-
</set>
-
</update>
<trim>标签用于给SQL语句添加或者删除前后缀,prefix属性为要添加到前缀,suffix为后缀。prefixOverrides为要删除的内容,例如句子中如果有AND,则删除。suffixOverrides为要删除的后缀
-
<select id="mytrim">
-
<trim prefix="pre" suffix="after" prefixOverrides="AND" suffixOverrides=",">
-
......
-
</trim>
-
</select>
<choose>标签类似于switch case选择效果
-
<choose>
-
<when test="">
</when>
-
<when test="">
</when>
-
<otherwise>
</otherwise>
-
</choose>
转载:https://blog.csdn.net/theVicTory/article/details/104718085