一. 开发步骤:

1. 创建 PO (model) 类,根据需求创建。

2. 创建全局配置文件 sqlMapConfig.xml。

3. 编写映射文件。

4. 加载映射文件, 在 SqlMapConfig.xml 中进行加载。

5. 编写测试程序,连接并操纵数据库。
    - 读取配置文件。
    - 通过 SqlSessionFactoryBuilder 创建 SqlSessionFactory 会话工厂。
    - 通过 SqlSessionFactory 创建 SqlSession
    - 通过 SqlSession 的操作数据库方法。
    - 关闭 SqlSession。

二. 创建项目

代码获取

1. Dao创建

2. Dao创建并整合到 Spring

4. mapper创建并整合到 Spring

三. 参数信息

parameterType : 指定输入参数䣌 java 类型。
resultType    : 指定输出结果的 java 类型。

#{} : 相当于预处理中的占位符 -> ? ,可以接收 HashMap, POJO 类型参数,简单类型时参数可以是 value 或其它。(可防止 sql 注入)

${} : 相当于拼接 SQL 串,对传入的值不做任何解释,原样输出,可接受 HashMap, POJO 类型参数,接收简单类型参数时只能时 value。(有sql注入)

selectOne  : 只能查询 0 或 1 条记录,大于一条记录会报错。

selectList : 可以查询 0 或 n 条记录

四. mybatis 的 Dao 编写 【通过 mapper 代理方式实现】

1. 创建 接口类 (UserMapper)

package com.q.mybatis.mapper;

import com.q.mybatis.model.User;

public interface UserMapper {

    public int save(User user);

    public User getUserById(int id);

}

2. 创建 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.q.mybatis.mapper.UserMapper"> <insert id="save" parameterType="user">
insert into user(username, sex, birthday, address)
values (#{username}, #{sex}, #{birthday}, #{address})
</insert> <!--
namespace : 接口映射地址
id : 方法名
parameterType : 方法参数类型 (如果是一个类,可直接放上类的路径, 可在 SqlMapConfig.xml 文件中设置别名)
resultType : 模型地址 ( 可以在 SqlMapConfig.xml 文件中设置别名 )
--> <select id="getUserById" parameterType="int" resultType="user">
select * from user where id = #{id}
</select> </mapper>

3. 加载映射文件

<!--  加载映射文件  -->
<mappers>
<mapper resource="com/q/mybatis/mapper/UserMapper.xml"></mapper>
</mappers>

4. 编写测试代码

import com.q.mybatis.mapper.UserMapper;
import com.q.mybatis.model.User;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test; import java.io.IOException;
import java.io.InputStream;
import java.util.Date; public class t4 { SqlSession session; @Before
public void before() throws IOException { System.out.println("insert Before"); // 1. 读取配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml"); // 2. 通过 SqlSessionFactoryBuilder 创建 SqlSessionFactory 会话工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is); session = sessionFactory.openSession();
} @After
public void after(){
session.close();
} @Test
public void test1(){
UserMapper userMapper = session.getMapper(UserMapper.class); // 获取数据
System.out.println(userMapper.getUserById(16)); // 添加数据
User user1 = new User("t4_5","1",new Date(), "addr");
userMapper.save(user1);
session.commit();
} }

五. resultType / resultMap

1. resultType (表字段必须和类属性对应,如果不对应则返回 Null):
    模型地址 ( 可以在 SqlMapConfig.xml 文件中设置别名 )

<select id="getUserById" parameterType="int" resultType="com.q.mybatis.model.User">
select * from user where id = #{id}
</select>

2. resultMap: 当类属性字段和数据库字段不对应时,可以使用这个方法查询

<resultMap id="userResultMap" type="user">
<id property="id" column="id_"></id> <result property="username" column="username_"></result>
<result property="sex" column="sex_"></result>
<result property="birthday" column="birthday_"></result>
<result property="address" column="address_"></result>
</resultMap> <select id="getUserById" parameterType="int" resultMap="userResultMap">
select
id id_, username username_, sex sex_, birthday birthday_ , address address_
from user where id = #{id}
</select>

六. if where 使用

1. 配置文件 XML

<select id="findUserList" parameterType="com.q.mybatis.vo.UserQueryVO" resultType="user">

    select * from user
<where>
<if test="user.sex != null and user.sex != ''">
sex = #{user.sex}
</if> <if test="user.username != null and user.username != ''">
and username like '%${user.username}%'
</if> </where> </select>

2. 测试方法

@Test
public void test2(){
UserMapper userMapper = session.getMapper(UserMapper.class);
UserQueryVO query = new UserQueryVO(); User user = new User();
user.setSex("1"); query.setUser(user); List<User> users = userMapper.findUserList(query);
System.out.println(users);
}

七. 一对一

1. XML 配置

<!--  如果一个表中关联着其它表,就使用 resultMap  -->
<resultMap id="orderRslMap" type="orders">
<!-- 往 orders 的模型匹配数据 -->
<id column="id" property="id"/>
<id column="note" property="note"/>
<id column="number" property="number"/>
<id column="createtime" property="createtime"/> <!-- 往 orders 的关联表 user 匹配数据 -->
<!-- 注意: 这里使用 javaType -->
<association property="user" javaType="user">
<id column="user_id" property="id" />
<id column="username" property="username" />
<id column="address" property="address" />
</association> </resultMap> <select id="findOrderById" parameterType="int" resultType="orderRslMap">
select a.username, b.* from user a, orders b where a.id = b.id
</select>

2. 查询

orderMapper mapper = session.getMapper(OrderMapper.class);

Orders order = mapper.findOrderById(3);

System.out.println(order);
System.out.println(order.getUser());

八. 一对多

<resultMap id="orderRslMap" type="orders">
<!-- 往 orders 的模型匹配数据 -->
<id column="id" property="id"/>
<id column="note" property="note"/>
<id column="number" property="number"/>
<id column="createtime" property="createtime"/> <!-- 往 orders 的 orderdetail 匹配数据 一对多 -->
<!-- 注意:集合中的类型使用 ofType -->
<collection property="orderDetails" ofType="orderDetail">
<id column="detail_id" property="id"/>
<id column="item_id" property="itemsId"/>
<id column="item_num" property="itemsNum"/>
</collection> </resultMap>

九. 多对多 : 上面的 <collection> 中继续嵌套 <collection> ..文档。。。

十. 设置允许懒加载

<settings>
<setting name="lazyLoadingEnabled" value="true" />
</settings>

十一. 开启二级缓存

1. SqlMapCOnfig.xml 文件中

<settings>
<setting name="cacheEnabled" value="true" />
</settings>

2. UserMapper.xml 文件中

// type 默认不写用的是 mybatis 自带的缓存( perpetualCache )

<cache></cache>

3. 注意:当 session 关闭后,才会提交到 二级缓存 : session.close();
        当执行 update, delete, save 等操作时会清空缓存。

Java - 框架之 MyBites的更多相关文章

  1. 如何在Eclipse中查看JDK以及JAVA框架的源码(转载)

    原文链接:http://www.cnblogs.com/outlooking/p/5243415.html 设置步骤如下: 1.点 “window”-> "Preferences&qu ...

  2. Java框架介绍-13个不容错过的框架项目

    本文转自互联网,个人收藏所用. 下面,我们将一同分享各有趣且颇为实用的Java库,大家请任取所需.不用客气~ 1.极致精简的Java Bootique是一项用于构建无容器可运行Java应用的极简技术. ...

  3. 如何查看JDK以及JAVA框架的源码

    如何查看JDK以及JAVA框架的源码 设置步骤如下: 1.点 “window”-> "Preferences" -> "Java" -> &q ...

  4. 对java框架的几点认识

    java框架实在是太多了,网上一抄一大段,根本就了解不到什么.我还是以我的经验来说一下j2ee的框架.1.首先力推struts2框架,这是最经典的框架(可以说没有“之一”).可以帮你快速搭建出一个MV ...

  5. 最简单的Java框架

    框架framework的目的是定义骨架式方案,处理各种相同的底层细节:而开发人员使用框架时,能够依照自己的需求实现自己的功能--仅仅须要填入自己的东西/flesh. 最简单的框架,类似于JUnit,它 ...

  6. 2016年7款最流行的Java框架

    虽然Java一直被唱衰,但是直到现在Java也坚持霸主地位不动摇,毫无疑问,Java是目前最热门的编程语言之一,所以我们为大家搜集了一些目前比较受欢迎的Java框架的消息. 根据RebelLabs对在 ...

  7. Java框架spring Boot学习笔记(六):Spring Boot事务管理

    SpringBoot和Java框架spring 学习笔记(十九):事务管理(注解管理)所讲的类似,使用@Transactional注解便可以轻松实现事务管理.

  8. Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)

    在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...

  9. Java框架spring 学习笔记(十四):注解aop操作

    回见Java框架spring Boot学习笔记(十三):aop实例操作,这里介绍注解aop操作 首先编写一个切入点HelloWorld.java package com.example.spring; ...

随机推荐

  1. TCP报文格式+UDP报文格式+MAC帧格式

    TCP和UDP的区别: 1)TCP是面向连接的,而UDP是无连接的 2)TCP提供可靠服务,而UDP不提供可靠服务,只是尽最大努力交付报文 3)TCP面向字节流,TCP把数据看成一串无结构的字节流,而 ...

  2. el-input 标签中密码的显示和隐藏

    效果展示: 密码隐藏: 密码显示: 代码展示: 一:<el-input>标签代码 <el-form-item label="密码" prop="pass ...

  3. 在Python中创建和使用类

    编程只是 if : 为了少写重复的代码,有了循环 for/while: 但碰到很长的重复代码,可能用一个循环难以实现,所以出现了面向对象的思想: 类:就是你的循环主体 实例:就是对你的循环的一次调用 ...

  4. SQL——IN操作符

    一.IN操作符基本用法 IN操作符用于在WHERE字句中规定多个值. 语法格式如下: SELECT 列名1,列名2... FROM 表名 WHERE 列名 IN(值1,值2...); 示例studen ...

  5. day40——数据库、数据库分类、安装、修改密码、字符集编码、简单语句介绍

    day40 详情请看:https://www.cnblogs.com/clschao/articles/9907529.html 数据库 数据库 简而言之可视为电子化的文件柜--存储电子文件的处所,用 ...

  6. (转)nginx与PHP的关系

    php是一门编程语言,可以编写很多程序,但是只有php的话,你的php只能在你的服务器里孤立的运行,比如你用php写了一个可以通过身高计算人的标准体重的程序,虽然这个程序可以在服务器运行,但是他还不能 ...

  7. 关于fastjson与jackson在反序列化bool型时的区别

    背景 在测试中,两个项目a,b的接口参数用到了Bool类型,当传参"0",项目a通过了,项目b报错了,排查了下,项目b的那个接口,在对传参反序列化时就出现了问题,最后发现两个项目使 ...

  8. Consul 的安装与基本使用

    什么是 Consul ​ Consul是一种服务网格解决方案,提供具有服务发现,配置和分段功能的全功能控制平面.这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全服务网格.Consul需 ...

  9. Node学习之(第三章:仿Apache显示目录列表的功能)

    前言 今天咱们用Node.js中的核心模块以及上节学习的模板引擎art-template来实现服务器软件Apache的大体功能.用过Apache的朋友都知道,我们只需把本地文件放置在Apache的ww ...

  10. 广联达C++面经(一站式西安) - 2019秋招

    9月7号通知在广联达西安面试,早上在高新面完中兴一面就赶忙坐地铁倒公交去面试了.  一面(大概30-40min) 刚去签了一个到,就带我去面试了,在一个小型会议室,面试我的是一个女面试官(第一次碰见女 ...