MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。项目GitHub地址

  下载MyBatis源码,导入到IDEA工程(Maven工程)中,工程结构如下:

在pom.xml中新增如下依赖:

<!-- MySQL相关 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency> <dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.6.2</version>
</dependency> <dependency>
<groupId>ognl</groupId>
<artifactId>ognl</artifactId>
<version>3.1.6</version>
</dependency> <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency> <dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>

  等待依赖更新完毕后,如果出现了@Override覆盖接口方法报错问题,请参考IDEA中 @override报错的解决方法

MyBatis配置conf.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> <settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="false"/>
<!--setting name="logImpl" value="STDOUT_LOGGING"/--> <!-- 日志 -->
</settings> <typeAliases>
<typeAlias type="com.luoxn28.dao.User" alias="User"/>
</typeAliases> <environments default="development">
<environment id="development">
<transactionManager type="JDBC" /> <!-- 声明使用那种事务管理机制 JDBC/MANAGED -->
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://192.168.1.150:3306/xxx" />
<property name="username" value="xxx" />
<property name="password" value="xxx" />
</dataSource>
</environment>
</environments> <mappers>
<mapper resource="userMapper.xml"/>
</mappers> </configuration>

User类的映射文件userMapper.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"> <mapper namespace="com.luoxn28.dao.UserDao"> <select id="getById" parameterType="int" resultType="User">
SELECT * FROM user WHERE id=#{id}; <!-- #{xxx} xxx为类中的数据域名称 -->
</select> <select id="getAll" resultType="com.luoxn28.dao.User">
SELECT * FROM user;
</select>
</mapper>

测试代码:

/**
* MyBatis测试类
*/
public class TestMain { public static void main(String[] args) throws IOException {
String resouce = "conf.xml";
//InputStream is = TestMain.class.getClassLoader().getResourceAsStream(resouce);
InputStream is = Resources.getResourceAsStream(resouce); // 构建sqlSession工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sqlSessionFactory.openSession(); /**
* 第一种方式: 直接执行已映射的 SQL 语句
*/
String statement = "com.luoxn28.dao.UserDao.getById";
User user = session.selectOne(statement, 1);
System.out.println(user); System.out.println("---------------------"); /**
* 第二种方式: 执行更清晰和类型安全的代码
*/
UserDao userDao = session.getMapper(UserDao.class);
user = userDao.getById(1);
System.out.println(user);
} }

User用户类:

/**
* User - 用户类
*/
public class User { public static final int MAN = 0; // 男生
public static final int WOMAN = 1; // 女生
public static final int OTHER = 2; // 其他 private int id; // 用户id
private String name; // 用户名
private String password; // 用户密码
private int sex; // 用户性别
private String email; // 用户邮箱
private String phone; // 用户手机
private String admin; // 用户是否是管理员,"admin"表示是管理员,其他为普通用户 public User() { } public User(String name, String password, int sex, String email, String phone) {
this.name = name;
this.password = password;
this.sex = sex;
this.email = email;
this.phone = phone;
this.admin = "";
}
public User(String name, String password, String sex, String email, String phone) {
this.name = name;
this.password = password;
setSex(sex); // this.sex = sex;
this.email = email;
this.phone = phone;
this.admin = "";
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public int getSex() {
return sex;
} public void setSex(int sex) {
this.sex = sex;
} public void setSex(String sexStr) {
int sex = Integer.valueOf(sexStr);
switch (Integer.valueOf(sexStr)) {
case 0: {
this.sex = MAN;
break;
}
case 1: {
this.sex = WOMAN;
break;
}
default: {
this.sex = OTHER;
break;
}
}
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public String getPhone() {
return phone;
} public void setPhone(String phone) {
this.phone = phone;
} public String getAdmin() {
return admin;
} public void setAdmin(String admin) {
this.admin = admin;
} @Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", sex=" + sex +
", email='" + email + '\'' +
", phone='" + phone + '\'' +
", admin='" + admin + '\'' +
'}';
} }

User

UserDao用户操作类

/**
* UserDao - User操作类
*/
public interface UserDao { public User getById(int id);
public List<User> getAll(); }

  以上示例代码是用XML来设置映射语句的,当然,也可以用Java注解来做。比如,上面的 XML 示例可被替换如下:

/**
* UserDao - User操作类
*/
public interface UserDao { @Select("SELECT * FROM user WHERE id=#{id}")
public User getById(int id); @Select("SELECT * FROM user")
public List<User> getAll(); }

  使用注解时调用实例:

UserDao userDao = session.getMapper(UserDao.class);
user = userDao.getById(1);
System.out.println(user);

  对于简单语句来说,注解使代码显得更加简洁,然而 Java 注解对于稍微复杂的语句就会力不从心并且会显得更加混乱。因此,如果你需要做很复杂的事情,那么最好使用 XML 来映射语句。选择何种方式以及映射语句的定义的一致性对你来说有多重要这些完全取决于你和你的团队。换句话说,永远不要拘泥于一种方式,你可以很轻松的在基于注解和 XML 的语句映射方式间自由移植和切换。注意:UserDao接口的getById方法配置了注解,那么就不要XML中配置<select id="getById">xxx</select>了,否则程序会报异常。

参考:

  1、IDEA中 @override报错的解决方法

  2、MyBatis3中文文档

MyBatis源码分析-IDEA新建MyBatis源码工程的更多相关文章

  1. 【异常及源码分析】org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping

    一.异常出现的场景 1)异常出现的SQL @Select("SELECT\n" + " id,discount_type ,min_charge, ${cardFee} ...

  2. [转] jQuery源码分析-如何做jQuery源码分析

    jQuery源码分析系列(持续更新) jQuery的源码有些晦涩难懂,本文分享一些我看源码的方法,每一个模块我基本按照这样的顺序去学习. 当我读到难度的书或者源码时,会和<如何阅读一本书> ...

  3. Redis源码分析:serverCron - redis源码笔记

    [redis源码分析]http://blog.csdn.net/column/details/redis-source.html   Redis源代码重要目录 dict.c:也是很重要的两个文件,主要 ...

  4. 序列化器中钩子函数源码分析、many关键字源码分析

    局部钩子和全局钩子源码分析(2星) # 入口是 ser.is_valid(),是BaseSerializer的方法 # 最核心的代码 self._validated_data = self.run_v ...

  5. k8s client-go源码分析 informer源码分析(5)-Controller&Processor源码分析

    client-go之Controller&Processor源码分析 1.controller与Processor概述 Controller Controller从DeltaFIFO中pop ...

  6. SpringMVC流程源码分析及DispatcherServlet核心源码

    一.源码分析前还是需要一张流程图作为指导,如下: 二.简单介绍以及源码定位 DispatcherServlet其实就是一个HttpServlet,他是HttpServlet的子类,所以它和普通的Htt ...

  7. nova创建虚拟机源码分析系列之五 nova源码分发实现

    前面讲了很多nova restful的功能,无非是为本篇博文分析做铺垫.本节说明nova创建虚拟机的请求发送到openstack之后,nova是如何处理该条URL的请求,分析到处理的类. nova对于 ...

  8. 源码分析 ucosii/source 任务源码详细分析

    分析源码: 得先学会读文档, 函数前边的 note :是了解该程序员的思想的途径.不得不重视 代码前边的  Notes,了解思想后,然后在分析代码时看他是如何具体实现的. 1. ucosii/sour ...

  9. Tomcat源码分析----eclipse中搭建源码环境

    前提:JDK,至少1.7,ant,要设置ANT_HOME环境变量,需要再classpath中增加ant的lib目录,在path变量中增加ant的bin目录 1.官网下载tomcat源码包:apache ...

随机推荐

  1. Android自定义View初步

    经过上一篇的介绍,大家对于自定义View一定有了一定的认识,接下来我们就以实现一个图片下显示文字的自定义View来练习一下.废话不多说,下面进入我们的正题,首先看一下我们的思路,1.我们需要通过在va ...

  2. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(10)-系统菜单栏[附源码]

    系列目录 似乎我们需要更多的模块了,我们有一个样例程序,可以帮助我们以后的系统开发做很多对照,我们稍后还有系统日志和系统异常的记录,这时浏览发生了困难,我们这一节来完成一个大家比较喜欢的东西吧,系统菜 ...

  3. Linux文件系统的实现

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Linux文件管理从用户的层面介绍了Linux管理文件的方式.Linux有一个树状 ...

  4. 妙用psexec分析关机一直挂起的Windows update 更新

    Windows 更新服务对每个IT运维人员来说都不会陌生,而且很多情况下出现的一些不兼容,产品问题通过更新都可很好的解决掉. 小弟近日为一台老爷机服务器安装Windows 产品更新就遇到了意见事情,特 ...

  5. 用H5中的Canvas等技术制作海报

    在去年的时候也实现过合成海报的功能,不过当时时间仓促,实现的比较简单. 就一个旋转功能,图片也不能拖动放大,也不能裁剪. 去年的实现可以参考<移动图片操作--上传>和<移动图片操作- ...

  6. 前端打包构建工具grunt快速入门(大篇幅完整版)

    打包的目的和意义就不用叙述了直接上干货 http://www.gruntjs.net/getting-started里面的教程也太简单了,需要下一番功夫去研究才行.本文将grunt打包的常用方法都用实 ...

  7. [vs2008]Visual Studio 2008 SP1添加或删除功能提示查找SQLSysClrTypes.msi文件

    前言 今天接到领导布置的一个任务,是之前同事负责的项目.离职了,现在客户有些地方需要修改,由于我之前参与过,就落在我的头上了. 然后我就把代码弄了过来,打开发现其中需要用到水晶报表.(我觉得不好用,不 ...

  8. asp.net实现图片在线上传并在线裁剪

    1.说明 接上一篇文章uploadify实现多附件上传完成后,又突然用到头像上传并在线裁剪.在网上找个众多例子都没有符合要求的,有一篇文章写的不错,就是文旺老兄写的这篇Asp.Net平台下的图片在线裁 ...

  9. sessionStorage 和 localStorage 、cookie

    sessionStorage 和 localStorage html5中web storage包括两种储存方式:sessionStorage 和 localStorage sessionStorage ...

  10. No.004:Median of Two Sorted Arrays

    问题: There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the median of the ...