一、简介
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); } }