MyBatis(一):配置并使用
MyBatis具体是什么东东,这些在后边在研究吧,本文目的是为了记录如何使用MyBatis。
首先,需要下载MyBatis开发所需要文件。
通过github上可以找到MyBatis代码:https://github.com/mybatis/mybatis-3,在最新代码中可以下载具体的有代码包,也可以下载开发包。
解压MyBatis后把其中的Jar包引入工程中:
在工程下边添加配置文件:
mybatis-config.xml
- <?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>
- <!-- 引用db.properties配置文件 -->
- <properties resource="resources/db.properties"/>
- <typeAliases>
- <package name="com.xxx.entity"/>
- </typeAliases>
- <!-- 对事务的管理和连接池的配置 -->
- <environments default="mysql_jdbc">
- <environment id="oracle_jdbc">
- <transactionManager type="JDBC"/>
- <dataSource type="POOLED">
- <property name="driver" value="${driver}"/>
- <property name="url" value="${url}"/>
- <property name="username" value="${name}"/>
- <property name="password" value="${password}"/>
- </dataSource>
- </environment>
- <environment id="mysql_jdbc">
- <transactionManager type="JDBC"/>
- <dataSource type="POOLED">
- <property name="driver" value="${driver}"/>
- <property name="url" value="${url}"/>
- <property name="username" value="${name}"/>
- <property name="password" value="${password}"/>
- </dataSource>
- </environment>
- </environments>
- <mappers>
- <mapper resource="resources/mapper/TaskAutoExecutePlanMapper.xml"/>
- </mappers>
- </configuration>
log4j.properties
- # #define DEBUG priority, R
- # log4j.rootLogger = INFO, R
- # # configure log output type as file
- # log4j.appender.R = org.apache.log4j.DailyRollingFileAppender
- # #log filename
- # log4j.appender.R.file = ./logRecord.log
- # # append
- # log4j.appender.R.Append = true
- # log4j.appender.R.layout = org.apache.log4j.PatternLayout
- # log4j.appender.R.layout.ConversionPattern = %n%d%p[%l]%m%n
- #
- # log4j.appender.R.DatePattern='.' yyyy-MM-dd
- log4j.rootLogger=DEBUG, Console
- #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.java.sql.ResultSet=INFO
- log4j.logger.org.apache=INFO
- log4j.logger.java.sql.Connection=DEBUG
- log4j.logger.java.sql.Statement=DEBUG
- log4j.logger.java.sql.PreparedStatement=DEBUG
这里主要目的是实现把MyBatis的sql操作打印到控制台中。
具体其他方式实现MyBatis操作日志打印到控制台,请参考文章:http://blog.csdn.net/qq_17555933/article/details/51656253
db.properties
- #oracle.jdbc.driver.OracleDriver | com.mysql.jdbc.Driver
- driver=com.mysql.jdbc.Driver
- #jdbc:oracle:thin:@localhost:1521:orcl | jdbc:mysql://localhost:3306/mybatis
- url=jdbc:mysql://localhost:3306/mybatis
- name=root
- password=123456
新建mysql库:MyBatis,新建表TaskAutoExecutePlan
- create databases mybatis;
- create table TaskAutoExecutePlan(
- id varchar(64) CHARACTER SET utf8mb4 NOT NULL DEFAULT '',
- autoExecutePlanType varchar(36) NOT NULL default '',
- taskStatus varchar(36) NOT NULL default '',
- createDate datetime not null DEFAULT CURRENT_TIMESTAMP,
- modifyDate datetime not null DEFAULT CURRENT_TIMESTAMP)
新建实体类TaskAutoExecutePlan.java
- package com.xxx.entity;
- import java.util.UUID;
- import java.util.Date;
- /**
- * Created by Administrator on 2017/2/19.
- */
- public class TaskAutoExecutePlan {
- /**
- * create databases mybatis;
- *
- * create table TaskAutoExecutePlan(
- * `id` varchar(36) CHARACTER SET utf8mb4 NOT NULL DEFAULT '0',
- * 'autoExecutePlanType' integer default '0',
- * 'taskStatus' integer default '0',
- * 'createDate' datetime DEFAULT CURRENT_TIMESTAMP,
- * 'modifyDate' datetime DEFAULT CURRENT_TIMESTAMP)
- * */
- private String id=null;
- private AutoExecutePlanType autoExecutePlanType;
- private TaskStatus taskStatus;
- private Date createDate;
- private Date modifyDate;
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public AutoExecutePlanType getAutoExecutePlanType() {
- return autoExecutePlanType;
- }
- public void setAutoExecutePlanType(AutoExecutePlanType autoExecutePlanType) {
- this.autoExecutePlanType = autoExecutePlanType;
- }
- public TaskStatus getTaskStatus() {
- return taskStatus;
- }
- public void setTaskStatus(TaskStatus taskStatus) {
- this.taskStatus = taskStatus;
- }
- public Date getCreateDate() {
- return createDate;
- }
- public void setCreateDate(Date createDate) {
- this.createDate = createDate;
- }
- public Date getModifyDate() {
- return modifyDate;
- }
- public void setModifyDate(Date modifyDate) {
- this.modifyDate = modifyDate;
- }
- }
设计到的enum对象包括:
- AutoExecutePlanType.java
- TaskStatus.java
- package com.xxxx.entity;
- /**
- * Created by Administrator on 2017/2/19.<br>
- * 任务状态:<br>
- * 2:Todo,待处理状态<br>
- * 4:Doing,正在处理状态<br>
- * 8:Success,已成功处理<br>
- * 16:Fail;已失败<br>
- * */
- public enum TaskStatus {
- /**
- * 2:Todo,待处理状态
- * */
- Todo(2),
- /**
- * 4:Doing,正在处理状态
- * */
- Doing(4),
- /**
- * 8:Success,已成功处理
- * */
- Success(8),
- /**
- * 16:Fail;已失败
- * */
- Fail(16);
- private Integer value;
- private TaskStatus(int value){
- setValue(value);
- }
- public static TaskStatus valueOf(int value){
- switch(value){
- case 2:
- return Todo;
- case 4:
- return Doing;
- case 8:
- return Success;
- case 16:
- return Fail;
- default:
- return null;
- }
- }
- public Integer getValue() {
- return value;
- }
- private void setValue(int value) {
- this.value = value;
- }
- }
为了实现mybatis映射enum类型需要添加一个每个enum对象的一个mybatis转化处理类.
- package com.xxx.entity;
- import org.apache.ibatis.type.BaseTypeHandler;
- import org.apache.ibatis.type.JdbcType;
- import java.sql.CallableStatement;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- /**
- * Created by Administrator on 2017/2/20.
- */
- public class TaskStatusHandler extends BaseTypeHandler<TaskStatus> {
- private Class<TaskStatus> type;
- private final TaskStatus[] enums;
- /**
- * 设置配置文件设置的转换类以及枚举类内容,供其他方法更便捷高效的实现
- *
- * @param type 配置文件中设置的转换类
- */
- public TaskStatusHandler(Class<TaskStatus> type) {
- if (type == null)
- throw new IllegalArgumentException("Type argument cannot be null");
- this.type = type;
- this.enums = type.getEnumConstants();
- if (this.enums == null)
- throw new IllegalArgumentException(type.getSimpleName() + " does not represent an enum type.");
- }
- @Override
- public void setNonNullParameter(PreparedStatement preparedStatement, int i, TaskStatus autoExecutePlanType, JdbcType jdbcType) throws SQLException {
- // baseTypeHandler已经帮我们做了parameter的null判断
- preparedStatement.setInt(i, autoExecutePlanType.getValue());
- }
- @Override
- public TaskStatus getNullableResult(ResultSet resultSet, String s) throws SQLException {
- // 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
- int i = resultSet.getInt(s);
- if (resultSet.wasNull()) {
- return null;
- } else { // 根据数据库中的code值,定位EnumStatus子类
- return locateEnumStatus(i);
- }
- }
- @Override
- public TaskStatus getNullableResult(ResultSet resultSet, int i) throws SQLException {
- // 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
- int index = resultSet.getInt(i);
- if (resultSet.wasNull()) {
- return null;
- } else { // 根据数据库中的code值,定位EnumStatus子类
- return locateEnumStatus(index);
- }
- }
- @Override
- public TaskStatus getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
- // 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
- int index = callableStatement.getInt(i);
- if (callableStatement.wasNull()) {
- return null;
- } else {
- // 根据数据库中的code值,定位EnumStatus子类
- return locateEnumStatus(index);
- }
- }
- /**
- * 枚举类型转换,由于构造函数获取了枚举的子类enums,让遍历更加高效快捷
- *
- * @param code 数据库中存储的自定义code属性
- * @return code对应的枚举类
- */
- private TaskStatus locateEnumStatus(int code) {
- for (TaskStatus status : enums) {
- if (status.getValue().equals(Integer.valueOf(code))) {
- return status;
- }
- }
- throw new IllegalArgumentException("未知的枚举类型:" + code + ",请核对" + type.getSimpleName());
- }
- }
配置TaskAutoExecutePlan映射文件:
- <?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="com.xxx.mapper.TaskAutoExecutePlanMapper">
- <!--
- private UUID id=null;
- private AutoExecutePlanType autoExecutePlanType;
- private TaskStatus taskStatus;
- private Date createDate;
- private Date modifyDate;
- -->
- <resultMap type="TaskAutoExecutePlan" id="TaskAutoExecutePlanResult">
- <result column="id" property="id"/>
- <result column="autoExecutePlanType" property="autoExecutePlanType" typeHandler="com.xxx.entity.AutoExecutePlanTypeHandler"/>
- <result column="taskStatus" property="taskStatus" typeHandler="com.xxx.entity.TaskStatusHandler"/>
- <result column="createDate" property="createDate" jdbcType="TIMESTAMP" javaType="java.sql.Timestamp"/>
- <result column="modifyDate" property="modifyDate" jdbcType="TIMESTAMP" javaType="java.sql.Timestamp"/>
- </resultMap>
- <select id="getAll" resultType="TaskAutoExecutePlan" resultMap="TaskAutoExecutePlanResult">
- select * from TaskAutoExecutePlan
- </select>
- <insert id="insert" parameterType="TaskAutoExecutePlan">
- <selectKey keyProperty="id" resultType="String" order="BEFORE">
- select replace(uuid(),'-','') from dual
- </selectKey>
- insert into TaskAutoExecutePlan (id,autoExecutePlanType,taskStatus,createDate,modifyDate)
- values (#{id,jdbcType=VARCHAR},
- #{autoExecutePlanType,jdbcType=BIT,typeHandler=com.xxx.entity.AutoExecutePlanTypeHandler},
- #{taskStatus,jdbcType=BIT,typeHandler=com.xxx.entity.TaskStatusHandler},
- #{createDate,jdbcType=TIMESTAMP},
- #{modifyDate,jdbcType=TIMESTAMP})
- </insert>
- </mapper>
当涉及到日期操作时,需要注视事项:
在MyBatis映射文件中要表明映射类型:
- <!-- jdbcType="TIMESTAMP"入库后保存精确日期为:yyyy-MM-dd HH:mm:ss-->
- <result column="CreateDate" jdbcType="TIMESTAMP" property="createDate" javaType="java.sql.Timestamp" />
- <!-- jdbcType="DATE"入库后保存精确日期为:yyyy-MM-dd -->
- <result column="ModifyDate" jdbcType="DATE" property="modifyDate" javaType="java.util.Date" />
在使用字段的时候也要标明类型#{createDate,jdbcType=TIMESTAMP}、#{modifyDate,jdbcType=DATE}。
编写数据操作接口类TaskAutoExecutePlanMapper.java:
- package com.xxx.mapper;
- import com.xxx.entity.TaskAutoExecutePlan;
- import java.util.List;
- /**
- * Created by Administrator on 2017/2/17.
- */
- public interface TaskAutoExecutePlanMapper {
- public List<TaskAutoExecutePlan> getAll();
- public void insert(TaskAutoExecutePlan taskAutoExecutePlan);
- }
编写业务类TaskAutoExecutePlanServer.java:
- package com.xxx.service;
- import java.io.InputStream;
- import java.util.List;
- import com.xxx.entity.TaskAutoExecutePlan;
- import com.xxx.mapper.TaskAutoExecutePlanMapper;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
- /**
- * Created by Administrator on 2017/2/20.
- */
- public class TaskAutoExecutePlanServer implements TaskAutoExecutePlanMapper {
- private final String resource = "resources/mybatis-config.xml";
- private SqlSessionFactory factory = null;
- public TaskAutoExecutePlanServer() {
- InputStream is = TaskAutoExecutePlanServer.class.getClassLoader().getResourceAsStream(resource);
- factory = new SqlSessionFactoryBuilder().build(is);
- }
- @Override
- public List<TaskAutoExecutePlan> getAll() {
- SqlSession sqlSession = this.factory.openSession();
- List<TaskAutoExecutePlan> result = sqlSession.selectList("com.xxx.mapper.TaskAutoExecutePlanMapper.getAll");
- sqlSession.commit();
- sqlSession.close();
- return result;
- }
- @Override
- public void insert(TaskAutoExecutePlan taskAutoExecutePlan) {
- SqlSession sqlSession = this.factory.openSession();
- sqlSession.insert("com.xxx.mapper.TaskAutoExecutePlanMapper.insert",taskAutoExecutePlan);
- sqlSession.commit();
- sqlSession.close();
- }
- }
测试类Main.java
- public static void main(String[] args) {
- TaskAutoExecutePlanServer taskAutoExecutePlanServer = new TaskAutoExecutePlanServer();
- TaskAutoExecutePlan taskAutoExecutePlan = new TaskAutoExecutePlan();
- taskAutoExecutePlan.setId("BC");
- taskAutoExecutePlan.setAutoExecutePlanType(AutoExecutePlanType.MxRasterization);
- taskAutoExecutePlan.setTaskStatus(TaskStatus.Doing);
- taskAutoExecutePlan.setCreateDate(new Date());
- taskAutoExecutePlan.setModifyDate(new Date());
- taskAutoExecutePlanServer.insert(taskAutoExecutePlan);
- List<TaskAutoExecutePlan> items = taskAutoExecutePlanServer.getAll();
- for (TaskAutoExecutePlan item : items)
- System.out.println(item.getId() + "," + item.getAutoExecutePlanType() + "," + item.getTaskStatus() + "," + item.getCreateDate() + "," + item.getModifyDate());
- Log log = LogUtil.getInstance(MainThread.class);
- }
输出结果:
- "D:\Program Files\Java\jdk1.8.0_111\bin\java"2017-02-21 01:06:54,465 [main] DEBUG [com.xxx.mapper.TaskAutoExecutePlanMapper.insert!selectKey] - ==> Preparing: select replace(uuid(),'-','') from dual
- 2017-02-21 01:06:54,509 [main] DEBUG [com.xxx.mapper.TaskAutoExecutePlanMapper.insert!selectKey] - ==> Parameters:
- 2017-02-21 01:06:54,548 [main] DEBUG [com.xxx.mapper.TaskAutoExecutePlanMapper.insert!selectKey] - <== Total: 1
- 2017-02-21 01:06:54,549 [main] DEBUG [com.xxx.mapper.TaskAutoExecutePlanMapper.insert] - ==> Preparing: insert into TaskAutoExecutePlan (id,autoExecutePlanType,taskStatus,createDate,modifyDate) values (?, ?, ?, ?, ?)
- 2017-02-21 01:06:54,563 [main] DEBUG [com.xxx.mapper.TaskAutoExecutePlanMapper.insert] - ==> Parameters: fa07695af78e11e69fb300fffdc16f2e(String), 256(Integer), 4(Integer), 2017-02-21 01:06:54.124(Timestamp), 2017-02-21 01:06:54.124(Timestamp)
- 2017-02-21 01:06:54,565 [main] DEBUG [com.xxx.mapper.TaskAutoExecutePlanMapper.insert] - <== Updates: 1
- 2017-02-21 01:06:54,574 [main] DEBUG [com.xxx.mapper.TaskAutoExecutePlanMapper.getAll] - ==> Preparing: select * from TaskAutoExecutePlan
- 2017-02-21 01:06:54,575 [main] DEBUG [com.xxx.mapper.TaskAutoExecutePlanMapper.getAll] - ==> Parameters:
- 2017-02-21 01:06:54,587 [main] DEBUG [com.xxx.mapper.TaskAutoExecutePlanMapper.getAll] - <== Total: 7
- b82e7600f78d11e69fb300fffdc16f2e,MxRasterization,Doing,2017-02-21 00:57:54.0,2017-02-21 00:00:00.0
- cc754dacf78d11e69fb300fffdc16f2e,MxRasterization,Doing,2017-02-21 00:58:28.0,2017-02-21 00:58:28.0
- 2e6cb0a8f78e11e69fb300fffdc16f2e,MxRasterization,Doing,2017-02-21 01:01:12.0,2017-02-21 01:01:12.0
- 3cfe4f81f78e11e69fb300fffdc16f2e,MxRasterization,Doing,2017-02-21 01:01:36.0,2017-02-21 01:01:36.0
- 576b7b93f78e11e69fb300fffdc16f2e,MxRasterization,Doing,2017-02-21 01:02:21.0,2017-02-21 01:02:21.0
- a5de9916f78e11e69fb300fffdc16f2e,MxRasterization,Doing,2017-02-21 01:04:32.0,2017-02-21 01:04:32.0
- fa07695af78e11e69fb300fffdc16f2e,MxRasterization,Doing,2017-02-21 01:06:54.0,2017-02-21 01:06:54.0
MyBatis(一):配置并使用的更多相关文章
- Mybatis XML配置
Mybatis常用带有禁用缓存的XML配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...
- MyBatis Cache配置
@(MyBatis)[Cache] MyBatis Cache配置 MyBatis提供了一级缓存和二级缓存 配置 全局配置 配置 说明 默认值 可选值 cacheEnabled 全局缓存的开关 tru ...
- spring和mybatis整合配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- SSM ( Spring 、 SpringMVC 和 Mybatis )配置详解
使用 SSM ( Spring . SpringMVC 和 Mybatis )已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方.之前没 ...
- Mybatis中配置Mapper的方法
在这篇文章中我主要想讲一下Mybatis配置文件中mappers元素的配置.关于基础部分的内容可以参考http://haohaoxuexi.iteye.com/blog/1333271. 我们知道在M ...
- MyBatis 实践 -配置
MyBatis 实践 标签: Java与存储 Configuration mybatis-configuration.xml是MyBatis的全局配置文件(文件名任意),其配置内容和顺序如下: pro ...
- SpringMVC+Mybatis+MySQL配置Redis缓存
SpringMVC+Mybatis+MySQL配置Redis缓存 1.准备环境: SpringMVC:spring-framework-4.3.5.RELEASE-dist Mybatis:3.4.2 ...
- spring整合mybatis(hibernate)配置
一.Spring整合配置Mybatis spring整合mybatis可以不需要mybatis-config.xml配置文件,直接通过spring配置文件一步到位.一般需要具备如下几个基本配置. 1. ...
- 笔记:MyBatis XML配置详解
MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息.文档的顶层结构如下: configuration 配置 properties ...
- mybatis的配置和使用
mybatis的配置和使用 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...
随机推荐
- Android proguard (混淆)
混淆(Proguard)用法 最近项目中遇到一些混淆相关的问题,由于之前对proguard了解不多,所以每次都是面向Stackoverflow的编程.copy别人的答案内心还可以接受,但是copy了之 ...
- 在用jQuery时遇到的小问题
1. class类名问题? 在我在class ='看看(2)' ,凡是这样的居然给自身加其他style样式,居然添加不上,后来改成其他类名不带括号里的,居然好了. 2. line-height 引入的 ...
- 大数据 --> Kafka集群搭建
Kafka集群搭建 下面是以三台机器搭建为例,(扩展到4台以上一样,修改下配置文件即可) 1.下载kafka http://apache.fayea.com/kafka/0.9.0.1/ ,拷贝到三台 ...
- java基础之类与对象
[类 & 对象] 1.类:具有一系列相同属性(特征)和方法(行为)的个体的集合,称为类. 类是一个抽象的概念,只能说类具有哪些属性,而不能直接对属性进行赋值. 例如:人类有身高的属性,但是不能 ...
- Beta 第七天
今天遇到的困难: 构造新适配器的时候出现了某些崩溃的问题 ListView监听器有部分的Bug 今天完成的任务: 陈甘霖:完成相机调用和图库功能,完成阿尔法项目遗留下来的位置调用问题,实现百度定位 蔡 ...
- 四则运算----C++版
一.设计思想 因java中已做过,就是简单的将java中的语句调换为C++的语句. 二.代码 #include<iostream.h> #include<Stdlib.h> v ...
- 软件工程第三次作业-结对作业NO.1
第一次结对作业 结对人员: 潘伟靖 170320077 张 松 170320079 方案分析 我们对所供的资料进行分析,如下: 从提供的资料可以看出,需要解决的问题以及满足的需求主要有两类目标用户,各 ...
- 《Effective Objective-C 2.0》摘要
前一段时间将<Effective Objective-C 2.0>这本书浏览了一遍,说一下几个觉得比较有意思的知识点. 感觉这本书是ios开发必看的一本书,最基础的,以及稍微高阶一点的oc ...
- 【iOS】单元测试
iOS单元测试(作用及入门提升) 字数1704 阅读16369 评论26 喜欢247 由于只是一些简单实用的东西,学学还是挺不错的.其实单元测试用的好,开发起来也会快很多.单元测试对于我目前来说,就是 ...
- defaultdict使用及__missing__理解
import collections import re WORD_RE = re.compile(r'\w+') index = collections.defaultdict(list) #用li ...