Mybatis入门程序
作为一个java的学习者,我相信JDBC是大家最早接触也是入门级别的数据库连接方式,所以我们先来回忆一下JDBC作为一种用于执行SQL语句的Java API是如何工作的。下面的一段代码就是最基本的JDBC开发流程。
在上代码之前要先导入JDBC的jar包,由于我用的数据库是mysql,所以要先导
入如下的jar包

接下来的就是加载数据库驱动,获取数据库链接之类的工作了,当然了这些工作都是通过代码来完成的。为了和接下的mybatis配置文件对比,我在这里采用的预处理的方式进行查询,代码如下:
public class Testjdbc {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 通过驱动管理类获取数据库链接
connection = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "123456");
// 定义sql语句 ?表示占位符
String sql = "select * from user where username = ?";
// 获取预处理statement
preparedStatement = (PreparedStatement) connection.prepareStatement(sql);
// 设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
preparedStatement.setString(1, "王五");
// 向数据库发出sql执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
// 遍历查询结果集
while (resultSet.next()) {
System.out.println(resultSet.getString("id") + " " + resultSet.getString("username"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
然后用过JDBC的人也都知道它有这样那样的缺点,总结下来有以下几点:
- 数据库连接,使用时就创建,不使用时立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能。
解决方案:使用数据库连接池管理数据库
- 以上的JDBC代码中明显将sql语句硬编码到java代码中,如果sql语句修改,需要重新编译java代码,不利于系统的维护。
解决方法:将sql语句配置到xml配置文件中,这样即使sql变化,也不需要对java代码重新编译
- 向preparedStatement中设置参数时,对占位符位置和设置参数值硬编码在java代码中,同样不利于系统维护
解决方法:同样可以将占位符和参数配置在xml文件中
- 从resultSet中遍历结果集数据时,存在硬编码
解决方法:将查询的结果集自动映射为java对象
说完了JDBC,大家也都看到了JDBC的种种不便,于是Hibernate、Mybatis等等的对象关系映射框架便应运而生,而名义上虽说都是ORM框架,Hibernate和Mybatis在细枝末节上还是有很大不同的,但是本文是探讨Mybatis框架。
首先Mybatis是什么?
- mybatis是一个持久层的框架,是apache下的顶级项目(已托管在github上面)
- mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成满足需求的sql语句
- mybatis可以向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象(输出映射)。
Mybatis架构:

接下来用mybatis写一个入门程序
首先讲一下我们的需求,在我的数据库里有一张用户的表,表结构如下

我现在要做的是根据用户的id(主键)查询用户信息
在开始撸代码之前,先要搭好环境
eclipse本人采用的是java EE的版本,然后可以去https://github.com/mybatis/mybatis-3/releases该网站下载mybatis的jar包导入到工程里面去
再然后就是就是上面已经提到了的mysql的驱动包
除了上面架构图所提到的sqlMapConfig.xml配置文件外,还需要一个包来存映射文件(映射文件是什么后面会提到),即sqlMap。
最后创建log4j.properties文件方便查看日志
所以整个项目的架构如下

为方便查阅,这里直接贴出整个项目代码
首先是log4j.properties文件
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
然后是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>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
</configuration>
这串配置文件无非是配置事务管理和数据库连接池,每个ORM框架都是必备的所以不深究
紧接着就是我们的重头戏映射文件了
映射文件命名:
User.xml, 而在mapper代理开发映射文件名称叫xxxMapper.xml, 比如:UserMapper.xml
而我们在映射文件里要干的活就是配置sql语句,最直观的对比就是hibernate直接在映射文件中将java对象映射为关系(即数据库中的表),而在mybatis中细化了这种映射关系,具体了输入映射和输出映射
先把具体映射文件贴上来,然后一一解释
<?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="test">
<select id="findUserById" parameterType="int" resultType="com.mybatis.pojo.User">
select * from user where id=#{id};
</select>
</mapper>
有一下几点申明:
- namespace命名空间,作用是对sql进行分类化管理,理解为sql隔离
注意:使用mapper代理方法开发,namespace有特殊作用
- 通过select执行数据库查询, id标识映射文件中的sql,将sql语句封装到mappedStatement对象中,所以将id称之为statement的id
- #{}:表示一个占位符 #{id}: 其中的id表示接收输入的参数,参数名称就是id, 如果输入参数是简单类型,#{}中的参数名称可以任意
- parameterType指的是输入参数类型,在这里输入的是id当然是整型,parameterType指的是输出结果所映射的java类型,由于sql语句查到的是一组数据,所以在这里需要一个java对象来接收。
User类如下:

之后就是将映射文件加载到全局配置文件SqlMapConfig文件中去
就是在该文件加上一句
<mappers>
<mapper resource="sqlMap/User.xml"/>
</mappers>
到这里整个配置文件就完成了,接下来的工作就是编写程序来测试了
按照之前的架构一步一步来,最后写成的程序如下:
public class MybatisTest {
@Test
public void findUserByIdTest() throws IOException{
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
User user=sqlSession.selectOne("test.findUserById",1);
System.out.println(user);
}
}
在这里值得注意的地方有两个,第一个是输入流(inputStream)来源于mybatis配置文件
第二个地方是是selectOne方法里的两个参数:
第一个参数:映射文件中statement的id,在这里则要写成 namespace+’.’+statement的id
第二个参数:指定和映射文件中所匹配的parameterType类型的参数
结果如下:

写到这里,Mybatis从配置文件到测试代码整个Mybatis入门程序已经写完了,请期待本人接下来的更新
Mybatis入门程序的更多相关文章
- MyBatis入门程序(基于XML配置)
创建一个简单的MyBatis入门程序,实现对学生信息的增删改查功能(基于XML配置) 一.新建一个Java工程,导入MyBatis核心jar包.日志相关的jar包以及连接Oracle数据库所需驱动包, ...
- Mybatis学习——Mybatis入门程序
MyBatis入门程序 一.查询用户 1.使用客户编号查询用户 (1).创建一个数据表 USE spring; #创建一个名为t_customer的表 CREATE TABLE t_customer( ...
- MyBatis入门程序(1)
一.入门程序: 1.mybatis的配置文件SqlMapConfig.xml 配置mybatis的运行环境,数据源.事务等. <?xml version="1.0" enco ...
- Mybatis入门程序编写
执行原理 入门程序编写 1.pom.xml 文件 <dependencies> <dependency> <groupId>mysql</groupId> ...
- Mybatis入门程序(一)
1.入门程序实现需求 根据用户id查询一个用户信息 根据用户名称模糊查询用户信息列表 添加用户(二) 更新用户(二) 删除用户(二) 2.引入Mybatis所需 jar 包(Maven工程) < ...
- mybatis入门程序-(二)
1. 添加配置文件 log4j.properties # Global logging configuration #开发环境下日志级别设置成DEBUG,生产环境设置成info或者error log4 ...
- MyBatis入门程序之Mapper代理方式
Mapper代理的开发方式,程序员只需要编写mapper接口(相当于dao接口)即可,MyBatis会自动为mapper接口生成动态代理实现类. 一.开发规范 1.mapper接口的全限定名要和map ...
- Mybatis入门程序(二)
1.实现需求 添加用户 更新用户 删除用户 2.添加用户 (1)映射文件User.xml(Mapper)中,配置添加用户的Statement <!-- 添加用户: parameterType:指 ...
- 2.Mybatis入门程序(单表的增删改成)
这里讲的单表的增删改查,是由mapper代理的增删改查,先来看看步骤: 1.jar包的导入 2.配置全局的配置文件 3.建立接口 4.编写mapper.xml 5.测试 工程结构:这个你们自己可以调整 ...
随机推荐
- angular路由详解三(路由参数传递)
我们经常用路由传递参数,路由主要有三种方式: 第一种:在查询参数中传递数据 {path:"address/:id"} => address/1 => Activa ...
- C语言引用另一个源文件中定义的数组
C语言中是可以引用另外一个源文件的全局数组的,但是不能引用局部数组. 引用方式举例如下: 设a.c文件有有数据定义 int array1[10]; 现有b.c文件中想访问a.c中的array1数组 ...
- Vuejs实例-使用vue-cli创建项目
1,首先从官方网站下载安装Node.js,建议使用6.x版本,同时也会一并安装npm工具,npm>3.10以上. 2,npm安装很慢(国外服务器),所以一般推荐使用npm淘宝镜像cnpm,先安装 ...
- 使用BigDecimal报的错
错误:java.lang.arithmeticexception: non-terminating decimal expansion; no exact representa 小数位膨胀 解决方法 ...
- mysql主从复制的基本原理
怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下: 1.主从服务器分别作以下操作: 1.1.版本一致 1.2.初始化表,并在后台启动mysql 1.3.修改root的密码 2.修 ...
- 为什么需要RPC,而不是简单的HTTP接口
转载自:http://www.oschina.net/question/271044_2155059?sort=default&p=1#answers 目前有很多Java的RPC框架,有基于J ...
- 问题排查:The requested URL /test/index.jsp was not found on this server
问题描述 添加一个新模块,部署在服务器上.服务器上还部署有其他模块且访问正常,新模块和其他模块共用同一个域名.服务部署之后,请求如下: http://my.domain.com/test/index. ...
- kubernetes实现用户自定义扩缩容
本文章主要参考walkthrough,aggregation和auth.涉及custom metric API的注册认证以及API server aggregation的相关知识.walkthroug ...
- PHP 环境搭建篇
0x01 PHP 简介 PHP 是一种流行的通用脚本语言, 特别适合 web 开发. 快速, 灵活, 务实, PHP 的所有东西, 从你的博客到世界上最流行的网站. 0x02 PHP环境要求 Tips ...
- java中equals与==的区别
http://blog.csdn.net/zfrong/article/details/4290904