前言

工作这么多年,ORM框架一直选择Mybatis框架。 Mybatis的使用方式也一直在变,总体来说是越来越简单。写篇文章对各使用方式做个总结...

正文

一、Mybatis典型用法

1. 正常执行流程

♦  配置文件 - 全局配置信息和映射文件信息。全局配置信息包括:数据库配置和事务配置。映射文件就是SQL相关的

♦  Mybatis读取配置文件生成SqlSessionFactory,即回话工厂

♦  获取SqlSession, 做CRUD操作。但真正做这个事情的是底层的executor。

♦  Executor执行器把SQL分装到MappedStatement对象中。该对象包括:SQL, 输入参数映射信息和输出结果映射信息。

2. 案例

2.1 建表

CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) ,
`password` varchar(20) ,
`age` int(11) ,
PRIMARY KEY (`id`)
)

2.2 全局配置文件

<?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="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3307/book"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/User.xml"/>
</mappers>
</configuration>

2.3 mapper.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="user">
<select id="findUserById" parameterType="int" resultType="com.mybatis.User">
select * from user where id = #{id}
</select>
<select id="findUserAll" resultType="com.mybatis.User">
select * from user
</select>
<insert id="insertUser" parameterType="com.mybatis.User">
insert into user(username,password,age) values(#{username},#{password},#{age})
</insert>
<delete id="deleteUserById" parameterType="int">
delete from user where id=#{id}
</delete>
<update id="updateUserPassword" parameterType="com.mybatis.User">
update user set password=#{password} where id=#{id}
</update>
</mapper>

2.4 Dao 接口

package com.mybatis.dao;

import com.mybatis.User;

import java.util.List;

public interface UserDao {
public User findUserById(int id) throws Exception ;
public List<User> findAllUsers() throws Exception;
public void insertUser(User user) throws Exception;
public void deleteUserById(int id) throws Exception;
public void updateUserPassword(User user) throws Exception;
}

2.5 DaoImpl

package com.mybatis.dao.impl;

import com.mybatis.User;
import com.mybatis.dao.UserDao; 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 java.io.IOException;
import java.io.InputStream;
import java.util.List; public class UserDaoImpl implements UserDao {
private static SqlSessionFactory factory = null;
static {
String resource = "mybatis/SqlMapConfig.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
factory = new SqlSessionFactoryBuilder().build(inputStream);
} public static SqlSession getSession(){
return factory.openSession();
} @Override
public User findUserById(final int id) throws Exception {
return getSession().selectOne("user.findUserById",id);
} @Override
public List<User> findAllUsers() throws Exception {
return null;
} @Override
public void insertUser(final User user) throws Exception { } @Override
public void deleteUserById(final int id) throws Exception { } @Override
public void updateUserPassword(final User user) throws Exception { }
}

2.6 User类

package com.mybatis;

import lombok.Data;

@Data
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
}

2.7 测试类

package com.mybatis.dao;

import com.mybatis.User;
import com.mybatis.dao.impl.UserDaoImpl; import org.junit.Test; public class UserDaoTest {
@Test
public void testFindUserById() throws Exception{
UserDao userDao = new UserDaoImpl();
User user = userDao.findUserById(7);
System.out.println(user);
}
}

二、Mapper代理开发方式

Mapper代理的开发方式,我们只需要编写mapper接口,不需要再Dao类,MyBatis会为我们生成代理类。代理开发方式应当遵循以下条件:

♦  mapper接口的全限定名要和mapper映射文件的namespace的值相同。

♦  mapper接口的方法名称要和mapper映射文件中的statement的id相同。

♦  mapper接口的方法参数只能有一个,且类型要和mapper映射文件中statement的parameterType的值保持一致。

♦  mapper接口的返回值类型要和mapper映射文件中statement的resultType值或resultMap中的type值保持一致。

案例:

1. 建表 同2.1

2. 全局配置 同2.2

3. mapper.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.mybatis2.dao.UserDao">
<select id="findUserById" parameterType="int" resultType="com.mybatis2.User">
select * from user where id = #{id}
</select> <select id="findUserAll" resultType="com.mybatis2.User"> select * from user
</select>
<insert id="insertUser" parameterType="com.mybatis.User">
insert into user(username,password,age) values(#{username},#{password},#{age})
</insert>
<delete id="deleteUserById" parameterType="int">
delete from user where id=#{id}
</delete>
<update id="updateUserPassword" parameterType="com.mybatis.User">
update user set password=#{password} where id=#{id}
</update>
</mapper>

4.mapper类:类名无所谓,用*Dao或者*Mapper都可以

package com.mybatis2.dao;

import com.mybatis2.User;

import java.util.List;

public interface UserDao {
public User findUserById(int id) throws Exception ;
public List<User> findUserAll() throws Exception;
public void insertUser(User user) throws Exception;
public void deleteUserById(int id) throws Exception;
public void updateUserPassword(User user) throws Exception;
}

5. User类同2.5

6. 测试类

package com.mybatis.dao;

import com.mybatis2.dao.UserDao;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.BeforeClass;
import org.junit.Test; import java.io.IOException;
import java.io.InputStream; public class UserDaoTest2 {
private static SqlSessionFactory factory = null;
@BeforeClass
public static void init(){
String resource = "mybatis/SqlMapConfig.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
factory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() throws Exception{
UserDao mapp = factory.openSession().getMapper(UserDao.class);
System.out.println(mapp.findUserById(7));
}
}

  

三、与Spring框架的集成

相关背景,使用方式官方文档已经很详细了。参考官方文档 -  http://www.mybatis.org/spring/

Mybatis 不同使用方式的更多相关文章

  1. oracle行转列、列转行、连续日期数字实现方式及mybatis下实现方式

    转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9977591.html 九月份复习,十月份考试,十月底一直没法收心,赶在十一初 由于不可抗拒的原因又不得不重新找 ...

  2. SpringBoot入门教程(四)MyBatis generator 注解方式和xml方式

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...

  3. mybatis入参方式和缓冲

    1.mybatis入参方式 @Param注解参数(注解) 封装成对象入参 public int updatePassword(@Param("id")int id,@Param(& ...

  4. MyBatis简单使用方式总结

    MyBatis简单使用方式总结 三个部分来理解: 1.对MyBatis的配置部分 2.实体类与映射文件部分 3.使用部分 对MyBatis的配置部分: 1.配置用log4J显式日志 2.导入包的别名 ...

  5. MyBatis通过注解方式批量添加、修改、删除

    唯能极于情,故能极于剑 注: 本文转载于:CodeCow · 程序牛 的个人博客:http://www.codecow.cn/ 一.数据库实体DO public class User implemen ...

  6. Java Mybatis 传参方式

    一.单个参数: public List<XXBean> getXXBeanList(String xxCode); <select id="getXXXBeanList&q ...

  7. mybatis之注解方式实现

    * 使用mybatis举例,使用注解方式实现* 不需要针对UserMapperI接口去编写具体的实现类代码,这个具体的实现类由MyBatis帮我们动态构建出来,我们只需要直接拿来使用即可.* 1.导入 ...

  8. 关于整合spring+mybatis 第二种方式

    和第一种方式一样的步骤,不过bean.xml中有些许差异 <!-- 配置sqlSessionFactory --> <bean id="sqlSessionFactory& ...

  9. mybatis通过插件方式实现读写分离

    原理:通过自定义mybatis插件,拦截Executor的update和query方法,检查sql中有select就用读的库,其它的用写的库(如果有调用存储过程就另当别论了) @Intercepts( ...

随机推荐

  1. HDU 3277 Marriage Match III(并查集+二分答案+最大流SAP)拆点,经典

    Marriage Match III Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  2. 在 word 中对正文和目录进行分节显示页码

    使用版本 word 2016 使目录独占一页:在正文第一页的第一个字符前插入分节符下一页(布局--分节符--下一页),此时会在正文第一个字符前插入分节符.在之前插入一张空白页,用于插入目录.(插入 - ...

  3. HTML5手机页面里面如何把长按复制避免

    在写HTML5手机页面的时候,有时候会写到一些标签是需要用户长按然后放开的 但是微信里面长按就会出现复制,大大影响了用户体验,那么如何可以避免呢? 我也是最近写到这样的页面,总结了一部分,大家可以作为 ...

  4. python中关于round函数的小坑

    这个一直都想写,但是因为这个点比较小,所以一直懒得动手.不过还是补上吧,留着早晚是个祸害. round函数很简单,对浮点数进行近似取值,保留几位小数.比如 >>> round(10. ...

  5. 【Big Data - Hadoop - MapReduce】初学Hadoop之图解MapReduce与WordCount示例分析

    Hadoop的框架最核心的设计就是:HDFS和MapReduce.HDFS为海量的数据提供了存储,MapReduce则为海量的数据提供了计算. HDFS是Google File System(GFS) ...

  6. tensorflow 笔记7:tf.concat 和 ops中的array_ops.concat

    用于连接两个矩阵: mn = array_ops.concat([a, d], 1) #  按照第二维度相接,shape1 [m,a] shape2 [m,b] ,concat_done shape ...

  7. MXNET:深度学习计算-模型构建

    进入更深的层次:模型构造.参数访问.自定义层和使用 GPU. 模型构建 在多层感知机的实现中,我们首先构造 Sequential 实例,然后依次添加两个全连接层.其中第一层的输出大小为 256,即隐藏 ...

  8. MXNET:监督学习

    线性回归 给定一个数据点集合 X 和对应的目标值 y,线性模型的目标就是找到一条使用向量 w 和位移 b 描述的线,来尽可能地近似每个样本X[i] 和 y[i]. 数学公式表示为\(\hat{y}=X ...

  9. Linux 下 nginx反向代理与负载均衡

    前面几篇记录下nginx的基本运功,代理服务器的访问,这里来试验下nginx的反向代理. 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给 ...

  10. HyperLogLog

    数据量一大,连统计基数也成了一个麻烦事.在使用kylin的时候,遇到对度量值进行基数统计,使用的是Hyperloglog算法,占用内存小,误差小,实乃不错的方法,但查阅网上的资料与内容,感觉未能理解的 ...