什么是MyBatis
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息。
MyBatis的作用
平时我们都用JDBC访问数据库,除了需要自己写SQL之外,还必须操作Connection, Statement, ResultSet 这些其实只是手段的辅助类。 不仅如此,访问不同的表,还会写很多雷同的代码,显得繁琐和枯燥。那么用了Mybatis之后,只需要自己提供SQL语句,其他的工作,诸如建立连接,Statement, JDBC相关异常处理等等都交给Mybatis去做了,那些重复性的工作Mybatis也给做掉了,我们只需要关注在增删改查等操作层面上,而把技术细节都封装在了我们看不见的地方。
JAR包下载
使用
创建数据库
CREATE DATABASE mydatabase;
创建表
USE mydatabase;
CREATE TABLE users(
id int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
name varchar(32) DEFAULT NULL,
PRIMARY KEY (id)
)CHARSET=utf8;
插入数据
USE mydatabase;
INSERT INTO users(name) VALUES('小明');
INSERT INTO users(name) VALUES('小红');
创建一个实体类(bean)
package com.my.bean.User
public class User{
private Integer id;
private String name;
.
.
//Getter and Setter
//Override toString()
}
配置Configration.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--MyBatis的核心配置文件-->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--配置JDBC的加载驱动、url、用户名、密码-->
<environments default="JDBC">
<environment id="JDBC">
<transactionManager type="JDBC"/>
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mydatabase?serverTimezone=GMT"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--加载配置SQL语句的配置文件-->
<mappers>
<!--文件路径从src下开始-->
<mapper resource="com/my/config/sqlxml/User.xml"/>
</mappers>
</configuration>
配置SQL语句的User.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">
<!--命名空间,防止id冲突-->
<mapper namespace="User">
<!--自动存入类对象,执行时直接返回一个装载着数据的对象,type是类名-->
<resultMap type="com.my.bean.User" id="UserResult">
<!--主键用id标签,普通属性用result标签-->
<!--column对应数据库列名 property对应被装载对象的属性名-->
<id column="id" jdbcType="INTEGER" property="id"/>
<result column="name" jdbcType="VARCHAR" property="name"/>
</resultMap>
<!--定义常量,可用include标签进行引用-->
<sql id="colName">id,name</sql>
<!--parameterType用来指定传参的类型-->
<select id="getUserList" parameterType="com.my.bean.User" resultMap="UserResult">
SELECT <include refid="colName"/> FROM users
<!--使用OGNL表达式取user的属性和拼接sql语句-->
<!--"是"的转义字符–>-->
<!--where自动拼接成正确的sql语句-->
<where>
<if test="id != null and !"".equals(id.trim())">
AND id=#{id}
</if>
<if test="name != null and !"".equals(name.trim())">
AND name LIKE '%' #{name} '%'
</if>
</where>
</select>
<!--单个删除操作-->
<delete id="deleteOne" parameterType="int">
DELETE FROM users WHERE id=#{_parameter}
</delete>
<!--批量删除, 传入一个List作为参数-->
<delete id="deleteBatch" parameterType="java.util.List">
DELETE FROM users WHERE id in(
<!--Separator用于分割-->
<foreach collection="list" item="item" separator=",">
#{item}
</foreach>
)
</delete>
</mapper>
注:写在#{}中的表达式会被解析为预处理语句 如:DELETE FROM users WHERE id=?
而写在${}中的会直接写入 如 DELETE FROM users WHERE id=0
<where>
和<set>
标签内写入的sql语句会自动拼接,省去了写WHERE 1=1的麻烦
<result>
中的column属性要根据查询语句的列名填写,可以为列名起别名,较为灵活
<if>
中的test属性可以书写java语句,有些字符需要转义
需要在Configration.xml中注册该文件,才能调用
OGNL表达式
用于从传入的对象参数中取值
从集合中取出数据和用<foreach>
循环历遍
加载Configration.xml,打开一个会话
package com.my.db;
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;
/*
*通过MyBatis配置文件访问数据库类
*/
public class DBAccess {
private static Reader reader;
private static SqlSessionFactory factory = null;
static{
try {
//通过配置文件获取连接数据库的信息,默认是resources目录下的
reader = Resources.getResourceAsReader("Configuration.xml");
}catch (IOException e){
e.printStackTrace();
}
}
//单例模式获取SqlSessionFactory
private static SqlSessionFactory getSqlSessionFactory(){
if(factory == null){
factory = new SqlSessionFactoryBuilder().build(reader);
}
return factory;
}
//获取SqlSession
public static SqlSession getSqlSession(){
return getSqlSessionFactory().openSession();
}
}
DAO层
package com.my.dao;
import com.my.bean.User;
import com.my.db.DBAccess;
import org.apache.ibatis.session.SqlSession;
import java.io.IOException;
import java.util.List;
/*
*从数据库查询
*/
public class UserDao {
//查询
public List<User> getUserList(Integer id, String name){
SqlSession sqlSession = null;
List<Message> messageList = null;
try {
//封装查询条件的对象,负责传入查询语句
User user = new User();
user.setId(id);
user.setName(name);
//获取sqlSession
sqlSession = DBAccess.getSqlSession();
//通过id找到配置文件里的SQL语句并执行,第二个参数是传入的对象
messageList = sqlSession.selectList("User.getUserList", user);
} catch (IOException e) {
e.printStackTrace();
}finally {
//回收资源
if(sqlSession != null)
sqlSession.close();
}
return messageList;
}
//通过id删除数据
public void deleteOne(int id){
SqlSession sqlSession = null;
try{
sqlSession = DBAccess.getSqlSession();
//SqlSession的删除方法,参数是需要传入的数据
sqlSession.delete("User.deleteOne", id);
//增删改需要手动提交
sqlSession.commit();
}catch (IOException ex){
ex.printStackTrace();
}finally {
//回收资源
if(sqlSession != null)
sqlSession.close();
}
}
//通过id数组批量删除数据
public void deleteBatch(List idList){
SqlSession sqlSession = null;
try{
sqlSession = DBAccess.getSqlSession();
//调用删除SQL语句
sqlSession.delete("User.deleteBatch", idList);
//手动提交
sqlSession.commit();
}catch (IOException ex){
ex.printStackTrace();
}finally {
if(sqlSession != null)
sqlSession.close();
}
}
}
测试类
public class TestMyBatis{
@Test
public void testUser(){
UserDao dao = new UserDao();
List<User> userList = dao.getUserList(null, null);
for(User user : userList){
System.out.println(user);
}
}
}