### 1. MYBATIS简介
 
MYBATIS是持久层框架,大大的简化了持久层开发。
 
当使用MYBATIS框架时,开发人员不必再编写繁琐的JDBC代码,只需要定义好每个功能对应的抽象方法与需要执行的SQL语句即可!

相关文献资料地址:http://www.mybatis.org/mybatis-3/zh/getting-started.html

一、准备工作

1、配置MyBatis开发环境:https://www.cnblogs.com/package-java/p/10316536.html

2、创建数据库:

2-1. 创建新的数据库`tedu_ums`;
 
    CREATE DATABASE tedu_ums;
 
2-2. 在新数据库中创建数据表`t_user`,表中至少包含id, username, password, age, phone, email这6个属性;  
 
    USE tedu_ums;
 
    CREATE TABLE t_user (
        id INT AUTO_INCREMENT,
        username VARCHAR(20) UNIQUE NOT NULL,
        password VARCHAR(20) NOT NULL,
        age INT,
        phone VARCHAR(20),
        email VARCHAR(50),
        PRIMARY KEY(id)
    ) DEFAULT CHARSET=utf8;
 
2-3. 添加不少于10条数据;
 
    INSERT INTO t_user  
        (username, password, age, phone, email)  
    VALUES  
        ('root', '1234', 18, '13800138001', 'root@tedu.cn'),
        ('admin', '4567', 19, '13800138002', 'admin@tedu.cn'),
        ('jack', '1234', 20, '13800138003', 'jack@tedu.cn'),
        ('tom', '1234', 22, '13800138010', 'tom@tedu.cn'),
        ('jerry', '1234', 25, '13800138011', 'jerry@tedu.cn'),
        ('rose', '1234', 21, '13800138004', 'rose@tedu.cn'),
        ('mike', '1234', 22, '13800138005', 'mike@tedu.cn'),
        ('lily', '1234', 23, '13800138006', 'lily@tedu.cn'),
        ('lucy', '1234', 24, '13800138007', 'lucy@tedu.cn'),
        ('mary', '1234', 25, '13800138008', 'mary@tedu.cn'),
        ('alex', '1234', 26, '13800138009', 'alex@tedu.cn');

二、创建实体类

每张数据表都应该有1个对应的实体类,所以,创建`cn.tedu.mybatis.entity.User`类,属性的数量与类型请参考数据表的设计:

package cn.tedu.mybatis.entity;

import java.io.Serializable;

public class User implements Serializable {

    private static final long serialVersionUID = 1L;
private Integer id;
private String username;
private String password;
private Integer age;
private String phone;
private String email;
private Integer isDelete; public Integer getIsDelete() {
return isDelete;
} public void setIsDelete(Integer isDelete) {
this.isDelete = isDelete;
} 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 getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public String getPhone() {
return phone;
} public void setPhone(String phone) {
this.phone = phone;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} @Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + ", age=" + age + ", phone="
+ phone + ", email=" + email + ", isDelete=" + isDelete + "]";
} }

三、创建接口,声明抽象方法

创建`cn.tedu.mybatis.mapper.UserMapper`接口,并在接口中声明“插入用户数据”的抽象方法:

package cn.tedu.mybatis.mapper;

import java.util.ArrayList;
import java.util.List; import cn.tedu.mybatis.entity.User;
import cn.tedu.mybatis.vo.UserVO; public interface UserMapper {
Integer addnew(User user);//增加数据 User findById(Integer id);//根据id查找用户数据 User findByUsername(String username);//根据用户名username查找用户数据 List<User> findAll(); Integer getCount();
ArrayList<String> finddelect();
List<UserVO> findAll2(); }

关于抽象方法,在MyBatis中,执行的操作如果是增、删、改,返回值均使用`Integer`,表示受影响的行数;方法的名称可以自定义,只要不违反Java的命名规则即可,另外,不允许在接口中使用重载机制;参数也可以自定义,如果执行的是增加操作,参数应该是与数据表对应的实体类的类型。

四、配置接口所在的包

在MyBatis中,通过`MapperScannerConfigurer`类扫描持久层接口的,所以,应该在`spring-dao.xml`文件中进行配置:

<!-- MapperScannerConfigurer -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 配置接口文件所在的包 -->
<property name="basePackage"
value="cn.tedu.mybatis.mapper" />
</bean>

五、在XML中配置接口方法对应的SQL语句

在`src/main/resources`下创建名为`mappers`文件夹,mappers文件夹下创建UserMapper.xml文件:

其实,这些XML文件的名称并不重要,可以自由命名,通常,推荐使用与接口文件相同的名称,便于管理。
 
然后,编写`UserMapper.xml`文件中的内容,首先,根节点必须是`<mapper>`,且根节点的`namespace`表示对应的接口文件,然后,添加子节点,以对应接口中的抽象方法:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <!-- 根节点必须是mapper -->
<!-- namespace:对应的接口文件 -->
<mapper namespace="cn.tedu.mybatis.mapper.UserMapper"> <!-- 根据执行的操作类型选取节点 -->
<!-- id:对应的抽象方法的方法名 -->
<!-- 值:使用#{}框住参数User类型中的属性名 -->
<!-- 增加数据 -->
<insert id="addnew">
INSERT INTO t_user (
username, password,
age, phone,
email
) VALUES (
#{username}, #{password},
#{age}, #{phone},
#{email}
)
</insert>
<!-- 根据id查询数据 -->
<select id="findById"
resultType="cn.tedu.mybatis.entity.User">
SELECT
id, age,
password, username,
phone, email
FROM
t_user
WHERE
id=#{id}
</select>
<!-- 根据用户名查询数据 -->
<select id="findByUsername"
resultType="cn.tedu.mybatis.entity.User">
SELECT
id, age,
password, username,
phone, email
FROM
t_user
WHERE
username=#{username}
</select>
<!-- 查询所有数据 -->
<select id="findAll"
resultType="cn.tedu.mybatis.entity.User">
SELECT
id, age,
password, username,
phone, email
FROM
t_user
</select> <select id="getCount"
resultType="java.lang.Integer">
SELECT COUNT(id) FROM t_user
</select>
<!-- 删除数据 -->
<delete id="deleteByIds">
DELETE FROM
t_user
WHERE id IN (
<foreach collection="array" item="id" separator=",">
#{id}
</foreach>
)
</delete> </mapper>

执行查询时,`<select>`节点中必须配置`resultType`属性(或者是`resultMap`属性)。
 
以上方法执行时,如果查询到匹配的数据,则返回有效的User对象,如果没有匹配的数据,则返回null。

    <select id="findByUid"
resultType="cn.tedu.store.entity.User">
SELECT
username, phone,
email, gender,
password, salt,
is_delete AS isDelete //如果这边给字段名取别名,那别名是cn.tedu.store.entity.User中的属性名,不然数据写不进去
FROM
t_user
WHERE
uid=#{uid}
</select>

六、配置XML文件的位置与数据源

MyBatis通过`SqlSessionFactoryBean`获取数据源,并且扫描配置了SQL语句的XML文件,最终由MyBatis框架来执行SQL语句,所以,需要在`spring-dao.xml`中配置`SqlSessionFactoryBean`:

<!-- SqlSessionFactoryBean -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据源,值为以上配置BasicDataSource节点的bean-id -->
<property name="dataSource"
ref="dataSource" />
<!-- XML文件在哪里 -->
<property name="mapperLocations"
value="classpath:mappers/*.xml" />
</bean>

七、单元测试

package cn.tedu.mybatis.mapper;

import java.util.List;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.tedu.mybatis.entity.User; public class UserMapperTestCase { AbstractApplicationContext ac;
UserMapper mapper; @Before
public void doBefore() {
ac = new ClassPathXmlApplicationContext("spring-dao.xml");
mapper = ac.getBean("userMapper", UserMapper.class);
} @After
public void doAfter() {
ac.close();
} @Test
public void addnew() {
User user = new User();
user.setUsername("fancq");
user.setPassword("666");
Integer rows = mapper.addnew(user);
System.out.println("rows=" + rows);
} @Test
public void findById() {
Integer id = 80;
User user = mapper.findById(id);
System.out.println(user);
} @Test
public void findByUsername() {
String username = "jack";
User user = mapper.findByUsername(username);
System.out.println(user);
} @Test
public void findAll() {
List<User> users = mapper.findAll();
for (User user : users) {
System.out.println(user);
}
} @Test
public void getCount() {
Integer count
= mapper.getCount();
System.out.println("count=" + count);
} }

八、抽象方法中多个参数的问题

在使用MyBatis时,接口中的抽象方法只允许有1个参数,如果有多个参数,例如:
 
    Integer updatePassword(
            Integer id, String password);
 
在最终运行时,Java源代码会被编译成.class文件,就会丢失参数名称,所以,运行时会提示“找不到某参数”的错误:
 
    Caused by: org.apache.ibatis.binding.BindingException: Parameter 'password' not found. Available parameters are [arg1, arg0, param1, param2]
 
解决方案就是“封装”,例如将以上2个参数id、password封装到1个User对象中,或将这2个参数封装到1个Map对象中……但是,无论哪种做法,都存在调用方法不便利的问题,MyBatis提供的解决方案就是添加注解:
 
    Integer updatePassword(
        @Param("id") Integer id,  
        @Param("password") String password);
 
通过`@Param`注解,当执行时,MyBatis会将多个参数封装为1个Map对象来执行,就不需要开发人员自行封装!
 
也可以小结为:当抽象方法的参数超过1个时,必须添加`@Param`注解,并且,在XML配置中,使用`#{}`表示的变量的名称其实是`@Param`注解中的值!

一个简单的MyBatis项目(应用)的更多相关文章

  1. mybatis入门教程之搭建一个简单的mybatis项目并启动它

    一.准备条件: 1.依赖jar包:mybatis核心包(必须).lombok插件包(非必须)以及MySQL数据库连接驱动包(必须) <dependency> <groupId> ...

  2. 带你搭建一个简单的mybatis项目:IDEA+spring+springMVC+mybatis+Mysql

    最近小编有点闲,突发奇想想重温一下mybatis,然后在脑海中搜索了一下,纳尼,居然不太会用了,想到这里都是泪啊!!现在我所呆的的公司使用的是springboot+hebinate,编程都是使用的JP ...

  3. 一个简单的MyBatis项目

    1.log4j.properties,我们把它设为debug级别,以便于调试.生产环境可以设为INFO,本项目放在src下面: # Global logging configuration log4j ...

  4. 一个简单的JUnit项目

    本人一直很喜欢JAVA,可是真正接触到JUnit也不过半年.由于公司进行网页测试,采用的是 JUnit+selenium的方式搭建的测试框架,然后采用JAVA语言编写,所以本人也好好研究了一下JUni ...

  5. 搭建Vue.js环境,建立一个简单的Vue项目

    基于vue-cli快速构建 Vue是近年来比较火的一个前端框架,所以搭建Vue.js环境,要装webpack,vue-cli,Vue 安装webpack命令如下 $ cnpm install webp ...

  6. 通过myclipse建立一个简单的Hibernate项目(PS:在单元测试中实现数据的向表的插入)

    Hibernate的主要功能及用法: Ⅰ.Hibernate封装了JDBC,使Java程序员能够以面向对象的思想对数据库进行操作 Ⅱ.Hibernate可以应用于EJB的J2EE架构,完成数据的持久化 ...

  7. Django入门第一步:构建一个简单的Django项目

    Django入门第一步:构建一个简单的Django项目 1.简介 Django是一个功能完备的Python Web框架,可用于构建复杂的Web应用程序.在本文中,将通过示例跳入并学习Django.您将 ...

  8. 写了一个简单的 Mybatis

    写了一个简单的 Mybatis,取名 SimpleMybatis . 具备增删改查的基本功能,后续还要添加剩下的基本数据类型和Java集合类型的处理. 脑图中有完整的源码和测试的地址 http://n ...

  9. 搭建一个简单的mybatis框架

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

随机推荐

  1. (转载) listview实现微信朋友圈嵌套

    listview实现微信朋友圈嵌套 标签: androidlistview 2016-01-06 00:05 572人阅读 评论(0) 收藏 举报  分类: android(8)  版权声明:本文为博 ...

  2. 分享一个完美的新闻客户端(酷商城)Android源码

    分享一个完美的新闻客户端(酷商城)Android源码,这个源码项目是从安卓教程网转载过来的,项目主要是解析html,fragment,异步缓存图片加载,webview加载网页等.可以正常的运行的,我已 ...

  3. oracle数据库 sqlplus

  4. pip快速下载安装python 模块module

    g刚开始学习python时,每次想要安装某个module,都到处找module的安装包(exe.whl等) 装setuptools,然后在cmd里用easy_install装pip,然后用pip装你要 ...

  5. 多个账号GitHub账号配置

    1.vi config 重复以上步骤就行 然后#注释下  是个人账号还是公司用的账号 mv id_rsa   id_rsa_qq   做下区别,防止冲突 ,别忘了,路径也要改下 mv   id_rsa ...

  6. Python数据分析8-----网页文本处理

    1.去除网页的标签,如<br/> from bs4 import BeautifulrSoup preData=BeautifulSoup(data,'html.parser').get_ ...

  7. (2016北京集训十三)【xsy1531】魔法游戏 - Nim游戏

    题解: 好题!我的结论很接近正解了... 把一个数化成二进制,每次至少要拿走一位,最多全拿走,不能不拿.那么这就是一个经典的Nim问题了,子树异或起来就是根节点的答案,随便递推一下就行了. 代码: # ...

  8. NOI 2018 屠龙勇士 (拓展中国剩余定理excrt+拓展欧几里得exgcd)

    题目大意:略 真是一波三折的一道国赛题,先学了中国剩余定理,勉强看懂了模板然后写的这道题 把取出的宝剑攻击力设为T,可得Ti*x=ai(mod pi),这显然是ax=c(mod b)的形式 这部分用e ...

  9. Linux 网络属性管理

    Linux网络基础管理-1:IPv4 地址分类:  点分十进制:0.0.0.0-255.255.255.255  A类: 0 0000000 - 0 1111111: 1-127 网络数:126, 1 ...

  10. python在不同情况下写入csv文件

    情况一(解法一):将列表存储为csv文件.列表的每一项代表csv文件的一行. 列表中的每一项包含多个属性.list=[[属性1,属性2,属性3,……],[属性1,属性2,属性3,……],[属性1,属性 ...