一、简介
MyBatis是支持定制化SQL、存储过程以及高级映射的优秀持久层框架。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以对配置和原生Map使用简单的XML或注解,将接口和Java的POJO(Plain Old Java Object,普通的java对象)映射成数据库的记录。
二、入门
要使用MyBatis,只需要将mybatis-x.x.x.jar文件置于classpath中即可
如果使用的是Maven来构建项目,则需要在pom.xml文件中引入MyBatis的依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
此外还需要数据库驱动,这里以oracle数据库为例。
<!-- oracle驱动 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0</version>
</dependency>
三、实例
在此先给出具体实例,具体细节后续再讨论
1、创建以Maven管理的javaWeb项目,项目结构如下
2、创建数据库表和实体类
实体类
/**
* 管理员对象
*
* @author zqx
*
*/
public class Admin implements Serializable {
private static final long serialVersionUID = -8690258368771118331L;
private Integer id;
/* 登录名称 */
private String loginName;
private String password;
/* 用户名称 */
private String userName;
private String status;
private Date createDate;
private Date lastLoginDate;
public Admin() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public Date getLastLoginDate() {
return lastLoginDate;
}
public void setLastLoginDate(Date lastLoginDate) {
this.lastLoginDate = lastLoginDate;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
@Override
public String toString() {
return "Admin [id=" + id + ", loginName=" + loginName + ", password=" + password + ", userName=" + userName
+ ", status=" + status + ", createDate=" + createDate + ", lastLoginDate=" + lastLoginDate + "]";
}
}
3、MyBatis的配置文件
<?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>
<!-- 对事务的管理和连接池的配置 -->
<environments default="development"> <!-- 指定默认的数据库链接 -->
<environment id="development"> <!-- 配置一个数据库配置信息 -->
<transactionManager type="JDBC" /> <!-- 事务管理 -->
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@192.168.8.104:1521:orcl" />
<property name="username" value="wr_push" />
<property name="password" value="wr_push" />
</dataSource>
</environment>
</environments>
<!-- mapping 文件路径配置 -->
<mappers>
<mapper resource="data/adminMapper.xml" />
</mappers>
</configuration>
4、Mapper映射文件
<?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="data.mapping.adminMapper">
<resultMap type="com.batis.po.Admin" id="AdminResultMap">
<id property="id" column="ID" />
<result property="loginName" column="LOGIN_NAME" />
<result property="password" column="PASSWORD" />
<result property="userName" column="USER_NAME" />
<result property="status" column="STATUS" />
<result property="createDate" column="CREATE_DATE" />
<result property="lastLoginDate" column="LAST_LOGIN_DATE" />
</resultMap>
<!-- 查询管理员,根据id -->
<select id="getAdminByID" parameterType="Integer"
resultMap="AdminResultMap">
<![CDATA[
SELECT * from ADMIN a
WHERE a.ID = #{ID}
]]>
</select>
<!-- 查询管理员列表 -->
<select id="getAdmin"
resultMap="AdminResultMap">
<![CDATA[
SELECT * from ADMIN
]]>
</select>
<!-- 增加管理员 -->
<insert id="addAdmin" parameterType="com.batis.po.Admin">
<![CDATA[
insert into ADMIN(ID,LOGIN_NAME,PASSWORD,USER_NAME,STATUS) values (#{id},#{loginName},#{password},#{userName},#{status})
]]>
</insert>
<insert id="addAdminAuto" parameterType="admin">
<selectKey resultType="long" order="BEFORE" keyProperty="id">
SELECT SEQ_ADMIN_ID.NEXTVAL FROM DUAL
</selectKey>
<![CDATA[
insert
into ADMIN(
ID,
USER_NAME,
LOGIN_NAME,
PASSWORD,
STATUS,
CREATE_DATE)
values
(
#{id:NUMERIC},
#{userName},
#{loginName},
#{password},
#{status},
#{createDate})
]]>
</insert>
<!-- 更新管理员 -->
<update id="updateAdmin" parameterType="com.batis.po.Admin">
<![CDATA[
update ADMIN set USER_NAME = #{userName},LOGIN_NAME = #{loginName} where ID = #{id}
]]>
</update>
<delete id="deleteAdmin">
<![CDATA[
delete from ADMIN where id = #{id}
]]>
</delete>
</mapper>
5、Test类
这里测试类的只是测试基本功能,有很多可以优化和重构的地方,这里先不讨论,后续将会给出配合spring的使用的具体实例
</pre><pre name="code" class="java">/**
*
*/
package com.batis.test;
import java.io.IOException;
import java.io.Reader;
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 com.batis.po.Admin;
/**
* 测试类
*
* @author zqx
*
*/
public class BatisCRUDTest {
public static void main(String[] args) throws IOException {
//insert();
//getByID(100);
//update();
delete();
}
/**
* 获取SqlSession
*
*/
public static SqlSession getSqlSession(String resource) throws IOException {
// mybatis配置文件,如果把src/main/resources加入到classpath,并且配置文件放到src/main/resources目录下,则参数为mybatis-config.xml
resource = "mybatis-config.xml";
// 使用MyBatis提供的Resources类加载mybatis的配置文件(也加载关联的映射文件)
Reader reader = Resources.getResourceAsReader(resource);
// 构建sqlSession的工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
// 构建能执行映射文件中sql语句的sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
/**
* 根据ID查询管理员
*/
public static Admin getByID(int id) throws IOException {
// mybatis配置文件,如果把src/main/resources加入到classpath,并且配置文件放到src/main/resources目录下,则参数为mybatis-config.xml
String resource = "mybatis-config.xml";
//获取SqlSession
SqlSession sqlSession = getSqlSession(resource);
/*
* 映射sql的标识字符串,data.mapping.adminMapper.getAdmin中的data.mapping.
* adminMapper是adminMapper文件中的mapper标签的namespace属性的值
* getAdmin是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
*/
String statement = "data.mapping.adminMapper.getAdminByID";
Admin admin = sqlSession.selectOne(statement, id);
System.out.println(admin);
return admin;
}
/**
* 添加管理员
*
*/
public static void insert() throws IOException {
// mybatis配置文件,如果把src/main/resources加入到classpath,并且配置文件放到src/main/resources目录下,则参数为mybatis-config.xml
String resource = "mybatis-config.xml";
//获取SqlSession
SqlSession sqlSession = getSqlSession(resource);
/*
* 映射sql的标识字符串,data.mapping.adminMapper.getAdmin中的data.mapping.
* adminMapper是adminMapper文件中的mapper标签的namespace属性的值
* getAdmin是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
*/
String statement = "data.mapping.adminMapper.addAdmin";
Admin admin = new Admin();
admin.setId(100);
admin.setLoginName("zhangshu");
admin.setUserName("zhangshu");
admin.setPassword("zhangshu");
admin.setStatus("1");
int row = sqlSession.insert(statement, admin);
// 手动提交事务
sqlSession.commit();
// 使用sqlSession执行完SQL语句之后需要关闭SqlSession
sqlSession.close();
System.out.println(row);
}
/**
* 更新管理员
*/
public static void update() throws IOException {
// mybatis配置文件,如果把src/main/resources加入到classpath,并且配置文件放到src/main/resources目录下,则参数为mybatis-config.xml
String resource = "mybatis-config.xml";
//获取SqlSession
SqlSession sqlSession = getSqlSession(resource);
/*
* 映射sql的标识字符串,data.mapping.adminMapper.getAdmin中的data.mapping.
* adminMapper是adminMapper文件中的mapper标签的namespace属性的值
* getAdmin是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
*/
String statement = "data.mapping.adminMapper.updateAdmin";
Admin admin = getByID(100);
admin.setLoginName("zhangqingxiang");
admin.setUserName("zhangqingxiang");
int result = sqlSession.update(statement, admin);
sqlSession.commit();
sqlSession.close();
System.out.println(result);
}
/**
* 删除管理员
*/
public static void delete() throws IOException {
// mybatis配置文件,如果把src/main/resources加入到classpath,并且配置文件放到src/main/resources目录下,则参数为mybatis-config.xml
String resource = "mybatis-config.xml";
//获取SqlSession
SqlSession sqlSession = getSqlSession(resource);
/*
* 映射sql的标识字符串,data.mapping.adminMapper.getAdmin中的data.mapping.
* adminMapper是adminMapper文件中的mapper标签的namespace属性的值
* getAdmin是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
*/
String statement = "data.mapping.adminMapper.deleteAdmin";
int result = sqlSession.delete(statement, 100);
sqlSession.commit();
sqlSession.close();
System.out.println(result);
}
}