一、MyBatis概述

1.1 原始的JDBC操作

谈及mybatis,必然需要先了解Java和数据库的连接技术——JDBC(Java DataBase Connectivity)。但是原始JDBC操作中,却存在如下缺点:

  1. 数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能。

  1. sql语句在代码中硬编译,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变Java代码。

  1. 查询操作时,需要手动将结果集中的数据手动封装到实体中;插入操作时,需要手动将实体的数据设置到sql语句的占位符位置。

如下为原始JDBC操作:

public class JDBCDemo {public static void main(String[] args) throws Exception{//获取数据库连接对象Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");//定义sql语句String sql = "select * from db1.emp";//获取执行sql的对象StatementStatement stmt = conn.createStatement();//执行sqlResultSet resultSet = stmt.executeQuery(sql);//处理结果while(resultSet.next()) {             int id = resultSet.getInt(1);                    //获取idString name = resultSet.getString("ename");             //获取姓名System.out.println("id:" + id + " name:" + name);}//释放资源stmt.close();conn.close();}
}

1.2 如何克服JDBC固有缺陷

而面对上述缺点,我们的解决方案是:

  1. 使用数据库连接池技术(C3P0或者Druid)初始化连接资源;

  1. 将sql语句抽取到xml配置文件中(解耦合);

  1. 使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射(比较困难)。

因此,mybatis应运而生!

1.3 什么是MyBatis

mybatis 是一个优秀的基于java的持久层框架,它内部封装了 jdbc,使开发者只需要关注sql语句本身,而不需要花费精力 去处理加载驱动、创建连接、创建statement等繁杂的过程。

mybatis通过xml或注解的方式将要执行的各种 statement配 置起来,并通过java对象和statement中sql的动态参数进行 映射生成最终执行的sql语句。

最后mybatis框架执行sql并将结果映射为java对象并返回。采 用ORM思想解决了实体和数据库映射的问题,对jdbc 进行了 封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作 。

二、MyBatis传统开发步骤

首先,我们可以先访问一下MyBatis官网地址:http://www.mybatis.org/mybatis-3/,这里有完整的mybatis的介绍。

2.1 添加MyBatis的坐标

把mysql和mybatis的坐标引入pom.xml中。

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.32</version>
</dependency>
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version>
</dependency>

2.2 创建一个实体

在项目下创建一个User.java的实体。

public class User {private int id;private String username;private String password;public int getId() {return id;}public void setId(int 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;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

2.3 编写映射文件

在文件夹resources下再创建一个mapper文件夹,再创建映射文件UserMapper.xml。后续我们的sql语句可以全部写到这里。

2.3.1先写一个通用的dtd约束头

<?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">

2.3.2 再配置mapper

这里是select子句,当然也可以时insert、update等等。

<mapper namespace="userMapper"><select id="findAll" resultType="user">select * from db1.user</select>
</mapper>
  • namespace:命名空间。起名可以随意。例如使用时我们可以用userMapper.findAll来使用对应的select语句。

  • resultType:结果类型。从数据库查询到的数据封装到哪个位置。例如我们这里的select子句查询到的结果要封装到User实体集中,但是这里用user而不适用domain.User是因为在接下来的核心配置文件SqlMapConfig.xml中我们通过typeAliases标签将domain.User更名为user。

注意:这里必须先要有一个user数据库表。

2.4 编写核心文件

2.4.1 核心配置文件SqlMapConfig.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><!--通过properties标签加载外部properties文件--><properties resource="jdbc.properties"/><!--自定义别名--><typeAliases><typeAlias type="domain.User" alias="user"/></typeAliases><!--数据源环境--><environments default="developement"><environment id="developement"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!--加载映射文件--><mappers><mapper resource="mapper/UserMapper.xml"/></mappers>
</configuration>
  • typeAliases:设置类型别名。比如这里我们使用自己定义的user更换本来的domain.User。所以在UserMapper.xml中我们就可以把sql语句中的resultType字段写成“user”。但是mybatis本身也为我们提供了一些别名来方便简写,如下:

别名

数据类型

string

java.lang.String

long

java.lang.Long

java

java.lang.Integer

double

java.lang.Double

boolean

java.lang.Boolean

而后期我们在执行更新操作时,就可以直接使用parameterType="int" 而不是 parameterType="java.lang.Integer",比如:

<update id="update" parameterType="int">
update user set username=#{username},password=#{password} where id=#{id}
</update>
  • transactionManager:事务管理器。取值有两种,JDBC和MANAGED,这里我们使用JDBC。

  • dataSource:数据源。取值有三种,UNPOOLED、POOLED和JNDI,这里我们使用POOLED,利用“池”的概念将 JDBC 连接对象组织起来。

  • property:配置数据库连接池的属性。这里使用了jdbc.properties来简化书写,当然也可以直接写。

  • mappers:用来加载映射,加载方式有如下几种:

• 使用相对于类路径的资源引用,例如:

<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>

• 使用完全限定资源定位符(URL),例如:

<mapper url="file:///var/mappers/AuthorMapper.xml"/>

• 使用映射器接口实现类的完全限定类名,例如:

<mapper class="org.mybatis.builder.AuthorMapper"/>

• 将包内的映射器接口实现全部注册为映射器,例如:

<package name="org.mybatis.builder"/>

2.4.2 配置文件jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db1
jdbc.username=root
jdbc.password=root

2.5 测试

2.5.1 编写测试代码

/*** 查询* @throws IOException*/
@Test
public void test1() throws IOException {//获得核心配置文件InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");//获得session工厂对象SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);//获得session会话对象SqlSession sqlSession = sqlSessionFactory.openSession();//执行操作 参数:namespace+idList<User> userList = sqlSession.selectList("userMapper.findAll");//打印数据System.out.println(userList);//释放资源sqlSession.close();
}
  • SqlSessionFactoryBuilder :工厂构建器。通过加载mybatis的核心文件的输入流的形式构建一个SqlSessionFactory对象 。

  • SqlSessionFactory:工厂对象 ,用来创建sql会话。openSession( )会默认开启一个事务,但事务不会自动提交,也就意味着需要手动提 交该事务,更新操作数据才会持久化到数据库中 。如果里面传一个参数为true,那么不需要手动提交事务(更新操作中sqlSession.commit()方法就不需要写了)。

  • SqlSession :会话对象。执行接下来的增删改查操作。

2.5.2 代码要点

这里我们可以看到,查询数据的一段java代码为:

List<User> userList = sqlSession.selectList("userMapper.findAll");

而这句代码中sqlSession.selectList的参数即我们刚才在UserMapper.xml 中写的代码:

<mapper namespace="userMapper"><select id="findAll" resultType="user">select * from db1.user</select>
</mapper>

同理,我们也可以同样得到添加数据、修改数据和删除数据类似的代码:

  • 添加数据:

sqlSession.insert("userMapper.add", user);
<insert id="add" parameterType="快速入门.User">
insert into user values(#{id},#{username},#{password})
</insert>
  • 修改数据

sqlSession.update("userMapper.update", user);
<update id="update" parameterType="快速入门.User">
update user set username=#{username},password=#{password} where id=#{id}
</update>
  • 删除数据

sqlSession.delete("userMapper.delete",3);
<delete id="delete" parameterType="快速入门.User">
delete from user where id=#{id}
</delete>

2.5.3 输出结果

执行编写好的代码,可以看到输出结果:

上面被选中的输出语句为:

[User{id=1, username='zhangsan', password='123'}, User{id=2, username='lisi', password='234'}, User{id=5, username='wangwu', password='abc'}, User{id=6, username='ray', password='111'}]

而我们再看一下数据库当中的数据,判断是否输出正常:

这里我们可以看到,一共4条数据,数据库中的数据已经被我们成功查找到。

三、总结

原来直接使用JDBC的sql代码被我们写入到了映射文件UserMapper.xml中,后续一些动态sql的加入更加简化了xml中代码量的书写。

而在Java代码中,我们只需要新建一些SqlSession对象便可以将xml中的sql语句直接使用。耦合度大大降低

但是我们也不难发现,这样的配置还是相对复杂的,因此就有了后来的MyBatisPlus来更加简化我们的代码书写。

什么是MyBatis相关推荐

  1. mybatis查询报错:com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from string

    mybatis查询报错: com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from strin ...

  2. MyBatis的插入后获得主键的方式

    需求: 使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法: 在mapper中指定keyProperty属性,示例如下: <insert id=" ...

  3. mybatis使用注解开发

    mybatis使用注解开发 面向接口编程 在之前我们是通过面向对象编程,但是在真正开发的时候我们会选择面向接口编程. 根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 , 上层不用管具体的 ...

  4. mybatis ResultMap

    ResultMap 解决属性名和字段的名称不一致的问题. 查询为null的问题 创建java实体类: public class User {private int id; //idprivate St ...

  5. mybatis配置文件解析

    mybatis配置文件解析 mybatis核心配置文件`mybatis-config.xml文件. mybatis的配置文件包含了会深深影响mybatis行为的设置和属性信息. 能配置的内容: con ...

  6. mybatis CRUD操作

    mybatis CRUD操作 select select标签是mybatis最常用的标签之一. select语句有很多属性可以详细的配置每一天sql语句. id 命名空间唯一的标识. 接口中的方法名与 ...

  7. java mybatis基础

    java mybatis基础 1.1 什么是mybatis? mybatis是一个优秀的持久层框架. 避免几乎所有的JDBC代码和手动设置参数以及获取结果集的过程. 可以使用简单的xml或者注解来配置 ...

  8. mybatis的资源过滤错误及xml文件编码错误

    mybatis 解决maven项目内资源过滤的问题 写的配置文件无法被导出或者生效的问题. 解决方案: <build><resources><resource>&l ...

  9. Mybatis传递多个参数的4种方式

    现在大多项目都是使用Mybatis了,但也有些公司使用Hibernate.使用Mybatis最大的特性就是sql需要自己写,而写sql就需要传递多个参数.面对各种复杂的业务场景,传递参数也是一种学问. ...

  10. SpringBoot (五) :SpringBoot整合mybatis

    说在前面 mybatis刚开始使用的时候比较麻烦,需要各种配置文件.实体类.dao层映射关联.还有一大推其它配置.初期开发了generator可以根据表结果自动生产实体类.配置文件和dao层代码,可以 ...

最新文章

  1. docker 容器数据备份
  2. Watch out for these 10 common pitfalls of experienced Java developers architects--转
  3. 为什么redis取出来是null_跳表:为什么Redis一定要用跳表来实现有序集合
  4. redis hash结构如何设置过期时间
  5. Lombok(1.14.8) - @Log
  6. PowerBI 报表平台首页报表列表加载慢
  7. js中的forEach
  8. echarts 环形图鼠标悬停
  9. 支持语言locale
  10. Eclipse·Maven·构建SpringMVC简单工程-2
  11. dex文件全解析C语言,中篇
  12. 七款好看文字样式纯css
  13. Java图片处理:ico格式转PNG/JPG等格式
  14. 10大顶级运营商转型案例剖析
  15. pytorch多进程加速及代码优化
  16. springboot Basic Auth 暴露API 访问认证
  17. Linux下的32位C程序,linux系统c语言生成.so文件,生成64位可执行文件,在64位系统中运行32位的可执行文件...
  18. 华为云发布桌面IDE-CodeArts
  19. [错误解决] paramiko.ssh_exception.SSHException: Error reading SSH protocol banner
  20. 深入理解wifi direct

热门文章

  1. 手动下载VMware Tolls.ISO
  2. NLP | Word2Vec之基于Negative Sampling的 CBOW 和 skip-gram 模型
  3. win10修改账户权限
  4. 2.JVM垃圾回收机制-什么时候回收内存
  5. Coding哥,魅族让你用洪荒之力来夺宝了!
  6. 路由的导航守卫过渡动效transtion导航守卫 路由懒加载 路由元信息 @stage3---wee2--day7
  7. Weex实战分享|Weex在极客时间APP中的实践
  8. Professional SharePoint 2007 Web Content Management Development: Building Publishing Sites with Offi
  9. 米色精致秋分主题PPT模板
  10. 计算机教室布置软木,软木照片墙布置,让孩子体验手工的乐趣