官方网站

一、什么是 MyBatis ?

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

二、mybatis和hibernate的比较

mybatis hibernate
半自动ORM框架 全自动ORM框架
必须写SQL 可以不写SQL
事务处理 事务处理
缓存都支持 缓存都支持,二级缓存比mybatis更好

三、入门案例

1.创建maven工程,添加对应jar包

<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.27</version>
</dependency>
</dependencies>

2.创建全局配置文件

该配置文件包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器TransactionManager)。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>
<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:3306/ssm?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>

配置允许其他用户连接mysql:

grant all privileges on . to 'root'@'%' identified by '123456' with grant option;

flush privileges;

3.定义User对象

4.创建映射文件

<?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="dpb">
<insert id="addUser" parameterType="com.sxt.dao.User">
insert into t_user(name,age)values(#{name},#{age})
</insert>
<delete id="deleteUserById" parameterType="java.lang.Integer">
delete from t_user where id=#{id}
</delete>
<update id="updateUserById" parameterType="com.sxt.dao.User">
update t_user set name = #{name} where id=#{id}
</update>
<select id="getUserById" parameterType="java.lang.Integer" resultType="com.sxt.dao.User">
select * from t_user where id=#{id}
</select>
</mapper>

5.将映射文件添加到主配置文件中

<?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:3306/ssm"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 注册映射文件 -->
<mappers>
<mapper resource="com/sxt/dao/UserMapper.xml"/>
</mappers>
</configuration>

6.测试

	@Test
public void add() throws IOException {
// 1.通过Resources对象加载配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 2.获取SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream );
// 3.通过SqlSessionFactory对象获取SQLSession对象
SqlSession session = factory.openSession();
User user = new User();
user.setName("dpb");
user.setAge(22);
// dpb.addUser 是映射文件中 namespace的内容加 id的内容,定位要执行的SQL
int count = session.insert("dpb.addUser", user);
System.out.println("影响的行数:"+count);
// 需要显示的提交
session.commit();
session.close();
}
}

7.查询,修改,删除操作

public class Test02 {
private SqlSession sqlSession; @Before
public void before() throws IOException {
// 1. 加载配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 2. 根据配置文件获取一个SqlSessionFactory对象,这个对象相当于连接工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
// 3. 获取一个sqlsession,sqlsession类似于之前学过的Connection
sqlSession = sqlSessionFactory.openSession();
} @After
public void after() {
sqlSession.commit();
sqlSession.close();
} @Test
public void test1() {
User user = new User();
user.setId(7);
user.setName("里斯1");
int update = sqlSession.update("dpb.updateUserById", user);
System.out.println(update);
} @Test
public void test2() {
int delete = sqlSession.delete("dpb.deleteUserById", 7);
System.out.println(delete);
} @Test
public void test3() {
User user = (User) sqlSession.selectOne("dpb.getUserById", 8);
System.out.println(user);
} }

四、案例优化

1.获取SqlSessionFactory对象的方式

SqlSessionFactory在一个服务中只需要有一个实例就可以了,此时可以通过单例的模式获取

/**
* 工具类 对外提供SqlSessionFactory的单例对象
* @author dengp
*
*/
public class DbUtils { private static SqlSessionFactory factory ; public static SqlSessionFactory getInstace(){
if(factory ==null){
InputStream in = null;
try{
in = Resources.getResourceAsStream("mybatis-config.xml");
}catch(Exception e){
e.printStackTrace();
}
synchronized (DbUtils.class) {
if(factory ==null){
factory = new SqlSessionFactoryBuilder().build(in);
}
}
}
return factory;
}
}

2.整理CRUD操作

public interface UserMapper {

	public int addUser(User user);

	public int updateById(User user);

	public int deleteById(int id);

	public User queryById(int id);
}
public class UserDao implements UserMapper {

	@Override
public int addUser(User user) { return DBUtils.getInstall().openSession().insert("com.sxt.dao.UserMapper.addUser", user);
} @Override
public int updateById(User user) {
// TODO Auto-generated method stub
return DBUtils.getInstall().openSession().update("com.sxt.dao.UserMapper.updateById", user);
} @Override
public int deleteById(int id) {
// TODO Auto-generated method stub
return DBUtils.getInstall().openSession().delete("com.sxt.dao.UserMapper.deleteById", id);
} @Override
public User queryById(int id) {
// TODO Auto-generated method stub
return DBUtils.getInstall().openSession().selectOne("com.sxt.dao.UserMapper.queryById", id);
}
}
<?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.sxt.dao.UserMapper">
<insert id="addUser" parameterType="com.sxt.bean.User">
insert into t_user(name,age)values(#{name},#{age})
</insert> <delete id="deleteById" parameterType="java.lang.Integer">
delete from t_user where id=#{id}
</delete> <update id="updateById" parameterType="com.sxt.bean.User">
update t_user
set name=#{name},age=#{age}
where id=#{id}
</update> <select id="queryById" parameterType="java.lang.Integer"
resultType="com.sxt.bean.User">
select * from t_user where id=#{id}
</select>
</mapper>
/**
* 代理方式
*/
@Test
public void test(){
UserMapper mapper = (UserMapper) Proxy.newProxyInstance(UserMapper.class.getClassLoader()
, new Class[]{UserMapper.class},new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(UserMapper.class.getName()+"."+method.getName());
Object id = null;
for (Object object : args) {
System.out.println(object);
id = object;
} // 实现逻辑
return DBUtils.getInstall().openSession().selectOne(UserMapper.class.getName()+"."+method.getName(), id);
}
} );
System.out.println(mapper.queryById(5));
}

可行!!!

五、mybatis接口的使用方式

通过前面UserDao的设计,可以发现,UserDao中的代码都是模板化代码,都可以通过配置自动生成,因此,在实际开发中,Mapper可以按照如下方式设计

1.定义Mapper接口

Mapper接口中,只需要声明方法名,方法参数、方法返回等信息

public interface UserMapper {

	public int addUser(User user);
}

2.定义映射文件

<?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">
<!-- 使用接口 代理的方式 namespace必须和接口的全路径名称一致 -->
<mapper namespace="com.sxt.dao.UserMapper">
<!-- id必须和接口声明的方法一致 -->
<insert id="addUser" parameterType="com.sxt.bean.User">
insert into t_user(name,age)values(#{name},#{age})
</insert>
</mapper>

3.测试

@Test
public void add() throws IOException {
// 1.通过Resources对象加载配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 2.获取SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream );
// 3.通过SqlSessionFactory对象获取SQLSession对象
SqlSession session = factory.openSession();
User user = new User();
user.setName("dpb");
user.setAge(22);
//通过Java动态代理自动提供了UserMapper的实现类
UserMapper mapper = session.getMapper(UserMapper.class);
int count = mapper.addUser(user);
System.out.println("影响的行数:"+count);
session.commit();
}

注意:

使用mapper接口方式必须满足:

1.映射文件的namespace的值必须是接口的全路径名称

比如:com.dpb.dao.UserMapper

2.接口中的方法名在映射文件中必须有一个id值与之对应。

数据添加成功

mybatis教程1(基本使用)的更多相关文章

  1. mybatis教程:入门>>精通>>实战

    以前曾经用过ibatis,这是mybatis的前身,当时在做项目时,感觉很不错,比hibernate灵活.性能也比hibernate好.而且也比较轻量级,因为当时在项目中,没来的及做很很多笔记.后来项 ...

  2. MyBatis教程目录

    MyBatis教程目录 2017-10-18  摘自 YSOcean MyBatis教程目录: 1 mybatis 详解(一)------JDBC 2 mybatis 详解(二)------入门实例( ...

  3. Mybatis教程(一)

    1      Mybatis教程(一) 学习过的持久层框架:DBUtils , Hibernate Mybatis就是类似于hibernate的orm持久层框架. 为什么学Mybatis? 目前最主流 ...

  4. SpringBoot系列之集成Mybatis教程

    SpringBoot系列之集成Mybatis教程 环境准备:IDEA + maven 本博客通过例子的方式,介绍Springboot集成Mybatis的两种方法,一种是通过注解实现,一种是通过xml的 ...

  5. mybatis 教程(mybatis in action)

    目录简介: 一:开发环境搭建二:以接口的方式编程 三:实现数据的增删改查 四:实现关联数据的查询 五:与spring3集成(附源码) 六:与Spring MVC 的集成 七:实现mybatis分页(源 ...

  6. MyBatis 教程 ——检视阅读

    MyBatis 教程 --检视阅读 准备 官网文档-中文 教程地址yiibai,质量很差 教程地址w3cschool,纯理论,还不如直接看官网文档 教程地址Mybatis框架入门教程,Oracle M ...

  7. Mybatis教程-实战看这一篇就够了

    转自:https://blog.csdn.net/hellozpc/article/details/80878563 1.从JDBC谈起 1.1.使用IDEA创建maven工程 1.2.引入mysql ...

  8. 14、MyBatis教程之全部(包括所有章节)

    MyBatis 3.5.5 教程 1.环境准备 jdk 8 + MySQL 5.7.19 maven-3.6.1 IDEA 学习前需要掌握: JDBC MySQL Java 基础 Maven Juni ...

  9. 最简单的SpringBoot整合MyBatis教程

    前面两篇文章和读者聊了Spring Boot中最简单的数据持久化方案JdbcTemplate,JdbcTemplate虽然简单,但是用的并不多,因为它没有MyBatis方便,在Spring+Sprin ...

  10. mybatis教程6(逆向工程)

    什么是逆向工程 简单点说,就是通过数据库中的单表,自动生成java代码. Mybatis官方提供了逆向工程,可以针对单表自动生成mybatis代码(mapper.java\mapper.xml\po类 ...

随机推荐

  1. centOS redis的安装及配置

    1.下载redis的安装包 wget http://download.redis.io/releases/redis-4.0.2.tar.gz 我一般wget的文件都是在一个download的文件夹里 ...

  2. Mysql知识点个人整理

    1.概念 数据库:保存有组织的数据的容器. 表: 某种特定类型数据的结构化清单 模式:关于数据库和表的布局和特性的信息?(有时指数据库) 主键: primary key 一个列或一组列,其值能唯一区分 ...

  3. 201771010142 张燕 Java的基本程序设计结构第二周学习总结

    第三章 Java的基本程序设计结构 第一部分 理论知识学习部分 一 基本知识: 1.标识符:由字母.下划线,美元符号和数字组成,第一个符号不能为数字,可以用作类名.变量名.方法名.数组名和文件名等. ...

  4. 20175316盛茂淞 2018-2019-2 《Java程序设计》第2周学习总结

    20175316盛茂淞 2018-2019-2 <Java程序设计>第2周学习总结 教材学习内容总结 1.整数:可细分为为short整数(占2字节),int整数(占4字节),long整数( ...

  5. IDA显示字节机器码

    默认居然不显示,有点坑. 要像CE一样显示出来,需要 菜单 Options >> General Disassembly选项卡Number of opcode bytes写上非0,写1好像 ...

  6. HDU 1171 01背包

    http://acm.hdu.edu.cn/showproblem.php?pid=1171 基础的01背包,求出总值sum,背包体积即为sum/2 #include<stdio.h> # ...

  7. Vuejs——(11)组件——slot内容分发

    版权声明:出处http://blog.csdn.net/qq20004604   目录(?)[+]   本篇资料来于官方文档: http://cn.vuejs.org/guide/components ...

  8. 【算法】实现字典API:有序数组和无序链表

    参考资料 <算法(java)>                           — — Robert Sedgewick, Kevin Wayne <数据结构>       ...

  9. 微信小程序之自定义模态弹窗(带动画)实例

    1.基本需求. 实现用户自定义弹框 带动画(动画可做参靠,个人要是觉得不好看可以自定义动画) 获取弹出框的内容,自定义事件获取 2.案例目录结构 二.程序实现具体步骤 1.弹框index.wxml代码 ...

  10. ElasticSearch5.0之后的改变

    ES5的变化 search_type=count和scan都移除了 count可以用size=0代替 GET /my_index/_search { "size": 0, &quo ...