MyBatis基础入门--知识点总结
对原生态jdbc程序的问题总结
下面是一个传统的jdbc连接oracle数据库的标准代码:
public static void main(String[] args) throws Exception {
Connection con = null;// 创建一个数据库连接
PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用Statement
ResultSet result = null;// 创建一个结果集对象
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");// 加载Oracle驱动程序
System.out.println("开始尝试连接数据库!");
String url = "jdbc:oracle:" + "thin:@127.0.0.1:1521:ORCl";// 127.0.0.1是本机地址,XE是精简版Oracle的默认数据库名
String user = "scott";// 用户名,系统默认的账户名
String password = "scott";// 你安装时选设置的密码
con = DriverManager.getConnection(url, user, password);// 获取连接
System.out.println("连接成功!");
String sql = "select * from tuser where username=?";// 预编译语句,“?”代表参数
pre = con.prepareStatement(sql);// 实例化预编译语句
pre.setString(1, "wang");// 设置参数,前面的1表示参数的索引,而不是表中列名的索引
result = pre.executeQuery();// 执行查询,注意括号中不需要再加参数
while (result.next())
// 当结果集不为空时
System.out.println("学号:" + result.getInt("id") + "姓名:"
+ result.getString("username"));
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
// 逐一将上面的几个对象关闭,因为不关闭的话会影响性能、并且占用资源
// 注意关闭的顺序,最后使用的最先关闭
if (result != null)
result.close();
if (pre != null)
pre.close();
if (con != null)
con.close();
System.out.println("数据库连接已关闭!");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
对于传统jdbc连接数据库的操作有一些问题,问题及相应的解决构想总结如下:
- 数据库连接,使用时创建,不使用时释放.对数据库进行频繁的开始和释放连接,造成数据库资源浪费.
方案:使用数据库连接池管理连接
- 将sql语句,占位符,参数,硬编码到java代码中,如果sql语句修改,需要重新编译java代码,不利于系统维护
方案:将sql语句,占位符,参数等配置到xml文件中,修改sql语句,无需重新编译项目.
- 从resultSet中遍历结果集数据时,存在硬编码,不利于维护
方案:将查询结果,自动映射成java对象
Myatis和Hibernate的区别
由于jdbc的这些问题,由此出现很多的ORM框架比较流行的有hibernate,Mybatis等,这些框架底层对jdbc进行了封装,使开发人员将精力放在业务上,大大提高了开发的效率,那么mybatis和hibernate有哪些异同呢?
Hibernate是一个标准的ORM(对象关系映射)框架,不需要程序员编写sql语句,sql语句自动生成,对sql语句的修改,优化是比较困难的.
适用于需求变化不多的中小型项目,比如后台管理系统,ERP,OA系统
Mybatis专注于sql语句本身,需要程序员自己编写sql语句,优化比较方便,mybatis不是一个完全的ORM框架,是一个半自动化的ORM框架.
适用于需求变化比较多的互联网项目.
入门项目(简单的数据库查询,根据用户id查询用户信息)
1.导入jar包
ant-1.9.6.jar
ant-launcher-1.9.6.jar
asm-5.0.4.jar
cglib-3.2.2.jar
commons-logging-1.2.jar
javassist-3.20.0-GA.jar
log4j-1.2.17.jar
log4j-api-2.3.jar
log4j-core-2.3.jar
mybatis-3.4.1.jar
ognl-3.1.8.jar
ojdbc6.jar
slf4j-api-1.7.21.jar
slf4j-log4j12-1.7.21.jar
2. src目录下新建mybatis的配置文件mybatis-config.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="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
<property name="username" value="scott" />
<property name="password" value="scott" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="sqlMap/User.xml"/>
</mappers>
</configuration>
3.配置log4j.properties,将sql语句以及相关信息打印到控制台上,便于分析查看:
a.src目录(classpath)下新建log4j.properties:
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# 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
b.在mybatis-config.xml中加入以下配置:
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
我当时没有加这个配置,结果控制台连个毛也不给我打印,加上这句配置,就好了.
4.新建一个pojo类User,包含属性id,username,password及对应get/set方法,代码省略
5.d.src目录下新建sqlMap文件夹,其下新建一个User.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="test">
<!--parameterType:指定传入参数的类型
resultType:指定返回结果的类型
#{}:表示一个占位符,如果需要填入的是简单数据类型,可以填入value或其他名称
${}:表示拼接字符串
-->
<select id="findUserById" parameterType="int" resultType="com.wang.pojo.User">
select * from tuser where id = #{value}
</select>
</mapper>
6.测试代码:
@Test
public void findUserById() throws IOException{
//mybatis配置文件
String resource ="sqlMapConfig.xml";
//得到配置文件的流
InputStream inputStream=Resources.getResourceAsStream(resource);
//创建会话工厂,传入mybatis配置文件信息
SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到session
SqlSession session = ssf.openSession();
//通过session操作数据库
User user=session.selectOne("test.findUserById", 1);
System.out.println(user);
session.close();
}
这是一个简单的使用mybatis的小例子,下面介绍几个配置文件中需要关注的几点:
typeAliases(别名)
在mapper.xml中,定义很多的statement,statement需要parameterType,resultType指定输入,输出类型.如果在指定类型时,输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便快捷.
<typeAliases>
<!-- 单个别名的定义 -->
<!-- <typeAlias type="com.wang.pojo.User" alias="user"/> -->
<!-- 批量别名的定义 自动扫描指定包下的po类,默认别名为类名(首字母大写或小写都可以) -->
<package name="com.wang.pojo"/>
</typeAliases>
mapper映射器
使用mapper代理的方法只需要程序员编写mapper接口即可(就是dao接口),程序员在编写mapper.xml(映射文件)和mapper.java时需要遵循一些规范:
1.mapper.xml中的namespace就是mapper.java的类全路径.
2.mapper.xml中的statement的id和mapper.java中的方法名一致.
3.mapper.xml中的parameterType和resultType和mapper.java中的参数类型和返回值类型一致.
<mappers>
<!-- 单个映射文件的加载,通过resource 一次加载一个 -->
<!-- <mapper resource="sqlMap/User.xml"/>
<mapper resource="sqlMap/UserMapper.xml"/> -->
<!-- 通过mapper接口加载配置文件,需要将mapper接口类型和对应的mapper.xml放在一个目录下
且保持名称一致 -->
<mapper class="com.wang.mapper.UserMapper"/>
<!-- 批量加载mapper配置文件,推荐使用 -->
<package name="com.wang.mapper"/>
</mappers>
输出映射
resultType
使用resultType进行输出映射,只有查询出来的列名和pojo的属性名一致,才会映射成功
只要查询出来的列名有一个和pojo类中的属性名一致,就会创建pojo对象,如果全部的都不一致,就不会创建pojo对象
ResultType的类型 不仅可以是pojo类 还可以是map,或者简单数据类型
像select Count(*) from user;这种sql是 resultType类型为int
返回值不管是User(pojo对象)还是List<User>(pojo列表),resultType的值都是一样的,为User.
resultMap
使用resultMap可以实现高级输出映射.
如果查询出来的列名和pojo属性名不一致,通过定义一个resultMap对列名和pojo属性名之间做一个映射关系.
1. 先定义resultMap(在mapper.xml中):
<!-- 定义resultMap
type:映射的java对象类型,可以使用被别名
id:resultMap的唯一标示
-->
<resultMap type="user" id="userResultMap">
<!-- id表示查询结果集中的唯一标示(主键列)
column:查询出来的列名
property:对应的pojo类中的属性名
-->
<id column="iddd" property="id"/>
<!-- result表示普通列 -->
<result column="name" property="username"/>
</resultMap>
2. 使用resultMap:
<select id="findUserById" parameterType="int" resultMap="userResultMap">
select id iddd ,username name from tuser where id = #{value}
</select>
MyBatis基础入门--知识点总结的更多相关文章
- MyBatis基础入门《二十》动态SQL(foreach)
MyBatis基础入门<二十>动态SQL(foreach) 1. 迭代一个集合,通常用于in条件 2. 属性 > item > index > collection : ...
- MyBatis基础入门《十九》动态SQL(set,trim)
MyBatis基础入门<十九>动态SQL(set,trim) 描述: 1. 问题 : 更新用户表数据时,若某个参数为null时,会导致更新错误 2. 分析: 正确结果: 若某个参数为nul ...
- MyBatis基础入门《十八》动态SQL(if-where)
MyBatis基础入门<十八>动态SQL(if-where) 描述: 代码是在<MyBatis基础入门<十七>动态SQL>基础上进行改造的,不再贴所有代码,仅贴改动 ...
- MyBatis基础入门《十七》动态SQL
MyBatis基础入门<十七>动态SQL 描述: >> 完成多条件查询等逻辑实现 >> 用于实现动态SQL的元素主要有: > if > trim > ...
- MyBatis基础入门《十六》缓存
MyBatis基础入门<十六>缓存 >> 一级缓存 >> 二级缓存 >> MyBatis的全局cache配置 >> 在Mapper XML文 ...
- MyBatis基础入门《十五》ResultMap子元素(collection)
MyBatis基础入门<十五>ResultMap子元素(collection) 描述: 见<MyBatis基础入门<十四>ResultMap子元素(association ...
- MyBatis基础入门《十四》ResultMap子元素(association )
MyBatis基础入门<十四>ResultMap子元素(association ) 1. id: >> 一般对应数据库中改行的主键ID,设置此项可以提高Mybatis的性能 2 ...
- MyBatis基础入门《十三》批量新增数据
MyBatis基础入门<十三>批量新增数据 批量新增数据方式1:(数据小于一万) xml文件 接口: 测试方法: 测试结果: =============================== ...
- MyBatis基础入门《十二》删除数据 - @Param参数
MyBatis基础入门<十二>删除数据 - @Param参数 描述: 删除数据,这里使用了@Param这个注解,其实在代码中,不使用这个注解也可以的.只是为了学习这个@Param注解,为此 ...
随机推荐
- 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付
前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...
- 通过一个demo了解Redux
TodoList小demo 效果展示 项目地址 (单向)数据流 数据流是我们的行为与响应的抽象:使用数据流能帮我们明确了行为对应的响应,这和react的状态可预测的思想是不谋而合的. 常见的数据流框架 ...
- 工欲善其事,必先利其器 之 VS2013全攻略(安装,技巧,快捷键,插件)!
如有需要WPF工具的朋友可以移步 工欲善其事,必先利其器 之 WPF篇: 随着开发轨迹来看高效WPF开发的工具和技巧 之前一篇<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATI ...
- 以bank account 数据为例,认识elasticsearch query 和 filter
Elasticsearch 查询语言(Query DSL)认识(一) 一.基本认识 查询子句的行为取决于 query context filter context 也就是执行的是查询(query)还是 ...
- 前端学HTTP之web攻击技术
前面的话 简单的HTTP协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击的对象.应用HTTP协议的服务器和客户端,以及运行在服务器上的Web应用等资源才是攻击目标.本文将详细介绍攻击web站点 ...
- .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator
去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...
- iOS开发之ReactiveCocoa下的MVVM(干货分享)
最近工作比较忙,但还是出来更新博客了,今天给大家分享一些ReactiveCocoa以及MVVM的一些东西,干活还是比较足的.在之前发表过一篇博文,名字叫做<iOS开发之浅谈MVVM的架构设计与团 ...
- 【架构设计】分布式文件系统 FastDFS的原理和安装使用
本文地址 分享提纲: 1.概述 2. 原理 3. 安装 4. 使用 5. 参考文档 1. 概述 1.1)[常见文件系统] Google了一下,流行的开源分布式文件系统有很多,介绍如下: -- mo ...
- Android MVP+Retrofit+RxJava实践小结
关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava ...
- iOS开源项目周报1229
由OpenDigg 出品的iOS开源项目周报第三期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开发方面的开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. Ma ...