MyBatis基础入门--知识点总结
对原生态jdbc程序的问题总结
下面是一个传统的jdbc连接oracle数据库的标准代码:
public static void main(String[] args) throws Exception {Connection con = null;// 创建一个数据库连接PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用StatementResultSet 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.测试代码:
@Testpublic void findUserById() throws IOException{//mybatis配置文件String resource ="sqlMapConfig.xml";//得到配置文件的流InputStream inputStream=Resources.getResourceAsStream(resource);//创建会话工厂,传入mybatis配置文件信息SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(inputStream);//通过工厂得到sessionSqlSession 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中):
<!-- 定义resultMaptype:映射的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>
转载于:https://www.cnblogs.com/fingerboy/p/5712991.html
MyBatis基础入门--知识点总结相关推荐
- MyBatis基础入门《九》ResultMap自动匹配
MyBatis基础入门<九>ResultMap自动匹配 描述: Mybatis执行select查询后,使用ResultMap接收查询的数据结果. 实体类:TblClient.java 接口 ...
- C# 零基础入门知识点汇总
C# 零基础入门 知识点汇总 前言 一,基础语法(1~10) 二,流程控制(11~20) 三,数组相关(21~30) 四,函数介绍(31~40) 五,类和对象(41~50) 六,面向对象(51~60) ...
- MyBatis基础学习知识点2
本文衔接MyBatis基础学习知识点1,继续对以下两个问题进行探讨 1.dao配置文件主要是用来干什么的?如何进行配置? 2.使用测试方法测试程序运行是如何实现的?每条语句起什么作用? 目录 dao配 ...
- javascript基础入门知识点整理
学习目标:- 掌握编程的基本思维- 掌握编程的基本语法 typora-copy-images-to: media JavaScript基础 HTML和CSS 京东 课前娱乐 众人皆笑我疯癫,我笑尔等看 ...
- Mybatis基础入门程序
1,1mybatis环境搭建 1,创建工程:使用Intellij IDEA工具,选择工具栏中的"File"-"New"-"Project"选 ...
- MyBatis基础学习知识点3
目录 动态sql语句 if标签 where标签 foreach标签 sql标签 动态sql语句 if标签 在主SQL语句之间使用,用于sql语句的拼接 例如: <select id=" ...
- Pandas基础入门知识点总结
目录 1.pandas 常用类 1.1 Series 1.1.1创建 Series 1.1.2 访问 Series 数据 1.1.3 更新.插入和删除 1.2 DataFrame 1.2.1 创建 D ...
- Python基础入门知识点——Python中的异常
前言 在先前的一些章节里你已经执行了一些代码,你一定遇到了程序"崩溃"或因未解决的错误而终止的情况.你会看到"跟踪记录(traceback)"消息以及随后解释器 ...
- insert exec 语句不能嵌套_Python基础入门知识点——if 语句简介
前言 if 语句是最简单的选择结构.如果满足条件就执行设定好的操作,不满足条件就执行其他其他操作. PS:如有需要Python学习资料的小伙伴可以加下方的群去找免费管理员领取 点击加群即可免费获取Py ...
最新文章
- 高性能javascript 文件加载阻塞
- 2018年计算机应用基础作业,2018年计算机应用基础作业二答案.doc
- WPF--ComboBox数据绑定
- 怎么让前端项目运行起来_如何立即使您的前端项目看起来更好
- .net 宏定义_C语言基础知识:几种特殊的函数宏封装方式
- Element menu
- 计算机休眠状态播放音乐,win7系统休眠后不能播放音乐怎么解决
- SAP License:面试谈
- 传统语音识别GMM和HMM
- MySQL中IN子查询会导致无法使用索引
- 酉矩阵和次酉矩阵的定义
- 详解谷歌VR平台Daydream:有手柄就是不一样
- LTE: SRVCC双模单待无线语音呼叫连续性
- POJ1723士兵站队问题
- 神奇的canvas——点与线绘制的绚丽动画效果
- R语言下载GEOquery包
- 如何组建权责明确、运营高效的数据团队
- React Native 0.44.3 ----------微信h5支付
- W51 - 999、电影评价数据的采集
- 子网掩码,网络ID,IP之间关系
热门文章
- java web scala_Springboot与scala编写第一个web程序
- 技能竞赛国赛_中西部第一!技能“川军”在第一届全国技能大赛斩获4金5银6铜...
- [leetcode周赛]1346. 检查整数及其两倍数是否存在
- Dubbo服务暴露(导出)流程
- 吴恩达神经网络和深度学习-学习笔记-43-Bounding box 预测 + YOLO算法
- python网络爬虫系列教程——python中requests库应用全解
- 基于Android的人事管理系统开发与设计源码(一)
- android下载模块封装,AndroidStudio 3.0 NDK开发2-AAR模块封装
- Duboo学习-SPI
- Hibernate占位符?和:及JPA