1.Mybatis的基本概念
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis可以使用简单的 XML或注解来配置和映射原生信息,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。(官方说明)
![](https://img.haomeiwen.com/i2909474/c89692f974787ede.png)
简单的来说就是对JDBC封装的框架,减少开发过程中的繁杂的劳动,灵活得获取数据库的信息。简而言之就是偷懒。
2.为什么要用Mybatis
- 行业需要
- 支持原生的sql,处理复杂业务的时候比hibernate方便
- 相对学习成本低
3.Mybatis入门
开发所需要的jar包:
- mybatis-3.1.1.jar
- commons-logging-1.1.1.jar
- log4j-1.2.16.jar
- cglib-2.2.2.jar
- asm-3.3.1.jar
1.创建数据表
CREATE TABLE `message` (
`ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`COMMAND` varchar(16) DEFAULT NULL COMMENT '指令名称',
`DESCRIPTION` varchar(32) DEFAULT NULL COMMENT '描述',
`CONTENT` varchar(2048) DEFAULT NULL COMMENT '内容',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
--插入数据
INSERT INTO `message` VALUES (1, '查看', '精彩内容', '精彩内容');
INSERT INTO `message` VALUES (2, '段子', '精彩段子', '如果你的月薪是3000块钱,请记得分成五份,一份用来买书,一份给家人,一份给女朋友买化妆品和衣服,一份请朋友们吃饭,一份作为同事的各种婚丧嫁娶的份子钱。剩下的2999块钱藏起来,不要告诉任何人');
INSERT INTO `message` VALUES (3, '新闻', '今日头条', '7月17日,马来西亚一架载有298人的777客机在乌克兰靠近俄罗斯边界坠毁。另据国际文传电讯社消息,坠毁机型为一架波音777客机,机载约280名乘客和15个机组人员。\r\n乌克兰空管部门随后证实马航MH17航班坠毁。乌克兰内政部幕僚表示,这一航班在顿涅茨克地区上空被击落。马来西亚航空公司确认,该公司从阿姆斯特丹飞往吉隆坡的MH17航班失联,并称最后与该客机取得联系的地点在乌克兰上空。图为马航客机坠毁现场。');
INSERT INTO `message` VALUES (4, '娱乐', '娱乐新闻', '昨日,邓超在微博分享了自己和孙俪的书法。夫妻同样写幸福,但差距很大。邓超自己都忍不住感慨字丑:左边媳妇写的。右边是我写的。看完我再也不幸福了。');
INSERT INTO `message` VALUES (5, '电影', '近日上映大片', '《忍者神龟》[2]真人电影由美国派拉蒙影业发行,《洛杉矶之战》导演乔纳森·里贝斯曼执导。 \r\n片中四只神龟和老鼠老师都基于漫画和卡通重新绘制,由动作捕捉技术实现。\r\n其中皮特·普劳泽克饰演达芬奇(武器:武士刀),诺尔·费舍饰演米开朗基罗(武器:双节棍),阿伦·瑞奇森饰演拉斐尔(武器:铁叉),杰瑞米·霍华德饰演多拉泰罗(武器:武士棍)。\r\n该片计划于2014年8月8日在北美上映。');
INSERT INTO `message` VALUES (6, '彩票', '中奖号码', '查啥呀查,你不会中奖的!');
2.创建实体类
public class Message {
private Integer id;
private String command;
private String description;
private String content;
//对应的get,set方法
}
3.配置文件的基本设置
<environments default="development">
<environment id="development">
<!--使用jdbc事务管理模式-->
<transactionManager type="JDBC">
<property name="" value=""/>
</transactionManager>
<!--使用连接池的方式获取数据库的连接-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="12345"/>
</dataSource>
</environment>
</environments>
4.写一个类测试能不能连接成功
public class DBUtil {
public static SqlSession getSqlSession() {
try {
// 通过配置文件获取数据库连接信息
Reader reader = Resources.getResourceAsReader("com/mybatis/config/Configuration.xml");
// 通过配置信息构建一个SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
//测试是否连接成功呢
Connection conn = DBUtil.getSqlSession().getConnection();
System.out.println(conn != null ? "连接成功" : "连接失败");
}
}
![](https://img.haomeiwen.com/i2909474/cbdc62c947aa7e63.png)
5.在mapper中配置查询的映射
创建一个Message.xml
<?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">
<!--namespace:命名空间 唯一-->
<mapper namespace="Message">
<!--
relultMap :和实体类的映射
id:唯一的标识,执行查询语句的时候做关联
type:实体类的路径
-->
<resultMap type="com.mybatis.entity.Message" id="MessageResult">
<!--
id:主键属性
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>
<select id="queryMessageList" parameterType="com.mybatis.entity.Message" resultMap="MessageResult">
SELECT ID,COMMAND,DESCRIPTION,CONTENT FROM message WHERE 1=1
</select>
</mapper>
咱们在这里配置后也要在mybatis的配置文件那加点东西
<mappers>
<mapper resource="com/mybatis/sqlxml/Message.xml"/>
</mappers>
好了在来测试一下:
package com.mybatis.dao;
import com.mybatis.db.DBUtil;
import com.mybatis.entity.Message;
import org.apache.ibatis.session.SqlSession;
import java.util.ArrayList;
import java.util.List;
/**
* 连接数据库获取Message表的数据
*/
public class MessageDao {
public List<Message> queryMessageList (String command, String description) {
//获得数据库的sqlsession,通过sqlsess进行数据库的操作
SqlSession sqlSession = DBUtil.getSqlSession();
List<Message> messageList;
messageList = sqlSession.selectList("queryMessageList");
sqlSession.close();
return messageList;
}
public static void main(String[] args) {
MessageDao md = new MessageDao();
List<Message> list = md.queryMessageList(null,null);
for (Message message : list) {
System.out.println(message.getCommand());
}
}
}
![](https://img.haomeiwen.com/i2909474/2d4c360d5d2b3b06.png)
![](https://img.haomeiwen.com/i2909474/bf1bf122567f8bf4.png)
看!数据都出来啦
总结Mybatis的工作流程(敲黑板!):
1.通过创建reader对象读取Mybatis的映射配置文件
2.通过SqlSessionFactoryBuilder对象获得SqlSession对像
3.获取SqlSession
4.事务默认开启
5.通过SqlSession读取映射文件(上文中的Message.xml)中的操作编号,执行sql语句
6.提交事务
7.关闭资源
6.动态SQL
上面都是静态的,要是用户想输入条件进行模糊查询呢?来,一起看怎么操作!
在操作之前先介绍一下在mygatis上的OGNL(具体介绍百度);
![](https://img.haomeiwen.com/i2909474/955831c3ffd4a2a0.png)
![](https://img.haomeiwen.com/i2909474/00312715393654d6.png)
另外还要再介绍一下log4J框架:
我们知道我们在xml中写SQL的时候无法调试的,连出错都不知道是什么原因;这个时候我们就要在我们的项目上加上这个框架,就可以在控制台看输出了。具体配置
导包,创建log4j.properties文件。文件的配置如下
log4j.rootLogger=DEBUG,Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.org.apache=INFO
效果图:
![](https://img.haomeiwen.com/i2909474/0265b5ceeb0650aa.png)
好了进入正题:
首先我们看一下改造以后的动态sql
<!--
parameterType :传入的变量类型
-->
<select id="queryMessageList" parameterType="com.mybatis.entity.Message" resultMap="MessageResult">
select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE
<where>
<if test="command != null and !"".equals(command.trim())">
and COMMAND like '%' #{command} '%'
</if>
<if test="description != null and !"".equals(description.trim())">
and DESCRIPTION like '%' #{description} '%'
</if>
</where>
</select>
我们可以看到传进来的参数是Message的对象类型,里面封装了传进来的条件包含了command和description数据。这个时候提一下:我们可以看到test中的判断条件有一些类似java中的方法。没错,这就是OGNL的强大之处,可以调用对象的方法,这给我们提供了很大的便利!
DAO层:
//获得数据库的sqlsession,通过sqlsess进行数据库的操作
SqlSession sqlSession = DBUtil.getSqlSession();
List<Message> messageList;
//调用Message.xml中的queryMessageList查询
messageList = sqlSession.selectList("Message.queryMessageList",message);
sqlSession.close();
return messageList;
7.删除(单条和批量)
单条删除:
XML配置
<delete id="deleteOne" parameterType="int">
delete from message where id = #{_parameter}
</delete>
DAO:
public void deleteOne(Integer id) {
SqlSession sqlSession = DBUtil.getSqlSession();
sqlSession.delete("Message,deleteOne",id);
//提交事务
sqlSession.commit();
sqlSession.close();
}
测试类调用后的结果:
![](https://img.haomeiwen.com/i2909474/8ba900dd03700498.png)
![](https://img.haomeiwen.com/i2909474/7ec8c14b2ffa6fd7.png)
批量删除:
public void deleteBath(List<Integer> ids) {
SqlSession sqlSession = DBUtil.getSqlSession();
sqlSession.delete("Message.deleteBath",ids);
//提交事务
sqlSession.commit();
sqlSession.close();
}
XML:
<delete id="deleteBath" parameterType="java.util.List">
delete from message where id in (
<foreach collection="list" item="item" separator=",">
#{item}
</foreach>
)
</delete>
![](https://img.haomeiwen.com/i2909474/8bc7aa86505068bc.png)
![](https://img.haomeiwen.com/i2909474/3328ed2c39f176b1.png)
8.增加
public void inertOne(Message message) {
SqlSession sqlSession = DBUtil.getSqlSession();
sqlSession.insert("Message.insertOne",message);
//提交事务
sqlSession.commit();
sqlSession.close();
}
XML:
<insert id="insertOne" parameterType="com.mybatis.entity.Message">
insert into message(id,command,description,content) values (#{id},#{command},#{description},#{content})
</insert>
结果:
![](https://img.haomeiwen.com/i2909474/47bb2e652f631e9c.png)
9.更新
public void updateOne(Message message) {
SqlSession sqlSession = DBUtil.getSqlSession();
sqlSession.update("Message.updateOne",message);
//提交事务
sqlSession.commit();
sqlSession.close();
}
XML:
<update id="updateOne" parameterType="com.mybatis.entity.Message">
update message set command = #{command} , description = #{description} ,content = #{content}
where id = #{id}
</update>
结果:
![](https://img.haomeiwen.com/i2909474/63a3738513963b6e.png)
网友评论