Mybatis学习(一)—————mybatis入门
学习了hibernate这个持久层框架之后,在来学习Mybatis简直是无压力,因为Mybatis入门门栏很低,如果学习过了hibernate的话,对于Mybatis的学习很简单了,如果没学习过hibernate直接学习Mybatis也没关系,也很好理解。
写Mybatis这一章节博客,大致分为这样一种思路
mybatis入门 --> 全局配置文件和映射文件详解 --> 高级映射(一对一,一对多,多对多) -->延迟加载机制 -->一级缓存,二级缓存(整合ehcache) --> spring整合mybatis --> 逆向工程
如果你想直接查看mybatis的标准helloworld,那么跳过这章,看第二章。
一、Mybatis的简介
mybatis封装了jdbc的持久层框架,前身为ibatis,在配置文件中编写sql,是不完全orm映射框架。
查看百度百科的介绍
1、支持普通sql查询
2、高级映射
3、存储过程
4、消除了几乎所有jdbc代码和参数的手工设置以及结果集的检索,等等特点,都会讲解到,今天先认识一下为什么说mybatis消除了所有jdbc代码和参数的设置,通过普通的jdbc有哪些不足,从而认识到mybatis的好处。
二、分析jdbc的问题
1 //1、注册驱动,什么是驱动?能够让java连接数据库,也就是实现jdbc接口规范就是驱动
2 Class.forName("com.mysql.jdbc.Driver");//硬编码
3 /*
4 * 2、通过驱动管理者获取数据库连接
5 * DriverManager是驱动实现类的管理者。
6 * url:连接数据库的位置,端口号,数据库名
7 * jdbc:mysql://localhost:3306/test_01
8 */
9 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_1", "root", "root");//(硬编码)
10 /*
11 * 3、获得sql语句执行者
12 * statement:执行sql语句对象
13 * sql语句必须是完整的。
14 * preparedStatement:预处理(常用)
15 * sql语句可以不是完整的,可以将参数用?替代,然后在预编译后加入未知参数
16 *
17 */
18 //定义sql语句,?表示占位符
19 String sql = "select * from user where id = ?"; //硬编码
20 PreparedStatement ps = conn.prepareStatement(sql);
21 ps.setInt(1, 1); //硬编码
22 //4、获取sql语句执行结果,resultset
23 /*
24 * executeQuery():查询操作
25 * executeUpdate():增删改操作
26 */
27 ResultSet rs= ps.executeQuery();
28 //5、处理结果
29 while(rs.next()){
30 System.out.println(rs.getInt(1));;//index代表第几列,从1开始
31 }
32
33 //6、关闭连接
34 rs.close();
35 ps.close();
36 conn.close();
1 //1、注册驱动,什么是驱动?能够让java连接数据库,也就是实现jdbc接口规范就是驱动
2 Class.forName("com.mysql.jdbc.Driver");//硬编码
3 /*
4 * 2、通过驱动管理者获取数据库连接
5 * DriverManager是驱动实现类的管理者。
6 * url:连接数据库的位置,端口号,数据库名
7 * jdbc:mysql://localhost:3306/test_01
8 */
9 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_1", "root", "root");//(硬编码)
10 /*
11 * 3、获得sql语句执行者
12 * statement:执行sql语句对象
13 * sql语句必须是完整的。
14 * preparedStatement:预处理(常用)
15 * sql语句可以不是完整的,可以将参数用?替代,然后在预编译后加入未知参数
16 *
17 */
18 //定义sql语句,?表示占位符
19 String sql = "select * from user where id = ?"; //硬编码
20 PreparedStatement ps = conn.prepareStatement(sql);
21 ps.setInt(1, 1); //硬编码
22 //4、获取sql语句执行结果,resultset
23 /*
24 * executeQuery():查询操作
25 * executeUpdate():增删改操作
26 */
27 ResultSet rs= ps.executeQuery();
28 //5、处理结果
29 while(rs.next()){
30 System.out.println(rs.getInt(1));;//index代表第几列,从1开始
31 }
32
33 //6、关闭连接
34 rs.close();
35 ps.close();
36 conn.close();
这种方式的缺陷
1、创建连接存在硬编码
2、执行statement时存在硬编码
3、频繁的开闭数据库连接,会影响数据库的性能。
现在就对这个所产生的问题与使用mybatis进行对比。
三、初级的mybatis
跟hibernate一样,也是需要拥有两个配置文件,
全局配置文件 和 映射文件,在编写这两个映射文件之前,必须创建mybatis环境(jar包等)
创建java工程
3.1、jar包
mysql(1)
Mybatis(1个核心包+9个依赖包)
总共11个jar
3.2、初始化数据库脚本
暂时只需要一张表 id是自增的,为主键
3.3、添加log4j.properties
该内容可以在mybatis的jar包中找到
1 # Global logging configuration
2 log4j.rootLogger=DEBUG, stdout
3 # MyBatis logging configuration...
4 log4j.logger.org.mybatis.example.BlogMapper=TRACE
5 # Console output...
6 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
7 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
8 log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
1 # Global logging configuration
2 log4j.rootLogger=DEBUG, stdout
3 # MyBatis logging configuration...
4 log4j.logger.org.mybatis.example.BlogMapper=TRACE
5 # Console output...
6 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
7 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
8 log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
3.4、全局配置文件
建议使用sqlMapConfig.xml,内容如下
此次的配置
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE configuration
3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4 "http://mybatis.org/dtd/mybatis-3-config.dtd">
5 <configuration>
6 <!--
7 属性
8 <properties></properties>
9 全局参数设置
10 <settings></settings>
11 类型别名
12 <typeAliases></typeAliases>
13 类型处理器
14 <typeHandles></typeHandles>
15 对象工厂
16 <objectFactory></objectFactory>
17 插件
18 <plugins></plugins>
19 以上属性在后边会详细讲解到,现在我们就只需要关注一下下面的配置即可
20 如下所配置的就是使用这点东西。
21 environments(环境信息集合)
22 environment(单个环境信息)
23 transactionManager(事物)
24 dataSource(数据源)
25 environment
26 environments
27 mappers(映射器)
28 -->
29
30
31 <!-- 配置mybatis的环境信息 -->
32 <environments default="development">
33 <environment id="development">
34 <!-- 配置JDBC事务控制,由mybatis进行管理 -->
35 <transactionManager type="JDBC"></transactionManager>
36 <!-- 配置数据源,采用dbcp连接池 -->
37 <dataSource type="POOLED">
38 <property name="driver" value="com.mysql.jdbc.Driver"/>
39 <property name="url" value="jdbc:mysql://localhost:3306/test_1?useUnicode=true&characterEncoding=utf8"/>
40 <property name="username" value="root"/>
41 <property name="password" value="root"/>
42 </dataSource>
43 </environment>
44 </environments>
45 <!-- 加载mapper映射文件 -->
46 <mappers>
47 <mapper resource="sqlmap/User.xml"/>
48 </mappers>
49 </configuration>
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE configuration
3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4 "http://mybatis.org/dtd/mybatis-3-config.dtd">
5 <configuration>
6 <!--
7 属性
8 <properties></properties>
9 全局参数设置
10 <settings></settings>
11 类型别名
12 <typeAliases></typeAliases>
13 类型处理器
14 <typeHandles></typeHandles>
15 对象工厂
16 <objectFactory></objectFactory>
17 插件
18 <plugins></plugins>
19 以上属性在后边会详细讲解到,现在我们就只需要关注一下下面的配置即可
20 如下所配置的就是使用这点东西。
21 environments(环境信息集合)
22 environment(单个环境信息)
23 transactionManager(事物)
24 dataSource(数据源)
25 environment
26 environments
27 mappers(映射器)
28 -->
29
30
31 <!-- 配置mybatis的环境信息 -->
32 <environments default="development">
33 <environment id="development">
34 <!-- 配置JDBC事务控制,由mybatis进行管理 -->
35 <transactionManager type="JDBC"></transactionManager>
36 <!-- 配置数据源,采用dbcp连接池 -->
37 <dataSource type="POOLED">
38 <property name="driver" value="com.mysql.jdbc.Driver"/>
39 <property name="url" value="jdbc:mysql://localhost:3306/test_1?useUnicode=true&characterEncoding=utf8"/>
40 <property name="username" value="root"/>
41 <property name="password" value="root"/>
42 </dataSource>
43 </environment>
44 </environments>
45 <!-- 加载mapper映射文件 -->
46 <mappers>
47 <mapper resource="sqlmap/User.xml"/>
48 </mappers>
49 </configuration>
3.5、映射文件和操作
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">
<!-- namespace:命名空间,对sql进行一个分类管理 -->
<!-- 注意:namespace在mapper代理时,具有重要且特殊的作用 -->
<mapper namespace="test">
//编写映射条件,也就是下面的
</mapper>
<?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:命名空间,对sql进行一个分类管理 -->
<!-- 注意:namespace在mapper代理时,具有重要且特殊的作用 -->
<mapper namespace="test">
//编写映射条件,也就是下面的
</mapper>
该映射文件是为了解决jdbc中statement的硬编码的问题,所以,在此映射文件中,只需要指定输入参数类型,返回结果参数类型,sql语句等就差不多了,也就是将原本jdbc所遇到的硬编码问题全部是使用xml配置文件来替代,有什么需要就修改配置文件即可,现在来看看该映射文件是如何编写的。
通过增删改查这四个操作来讲解。
3.6.1、查询 按id查询出user对象 注意看下面的注释
1 <!--
2 使用id进行查询
3 查询,使用select来表示一个查询的statement,相当于statement.executeQuery
4 id:表示该statement唯一标识
5 parameterType:输入参数类型
6 resultType:输出参数类型,使用的是User类,则会将查询出来的记录封装到该类中
7 #{id}:使用#{}接收输入的参数,其中的"id"属性名任意,可以为uid,也可以为别的。
8 -->
9 <select id="findUserById" parameterType="java.lang.Integer" resultType="com.wuhao.mybatis.domain.User">
10 SELECT * FROM user WHERE id= #{id}
11 </select>
12
1 <!--
2 使用id进行查询
3 查询,使用select来表示一个查询的statement,相当于statement.executeQuery
4 id:表示该statement唯一标识
5 parameterType:输入参数类型
6 resultType:输出参数类型,使用的是User类,则会将查询出来的记录封装到该类中
7 #{id}:使用#{}接收输入的参数,其中的"id"属性名任意,可以为uid,也可以为别的。
8 -->
9 <select id="findUserById" parameterType="java.lang.Integer" resultType="com.wuhao.mybatis.domain.User">
10 SELECT * FROM user WHERE id= #{id}
11 </select>
12
操作
1 //根据用户id进行查询。findUserById
2 @Test
3 public void test() throws IOException{
4 //跟hibernate一样,需要获取一大堆东西
5 // 1、读取配置文件
6 String resource = "SqlMapConfig.xml";
7 InputStream inputStream = Resources.getResourceAsStream(resource);
8 // 2、根据配置文件创建SqlSessionFactory
9 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
10 // 3、SqlSessionFactory创建SqlSession
11 SqlSession sqlSession = sqlSessionFactory.openSession();
12 // 4、SqlSession执行statement,并返回映射结果
13
14 /*
15 * test.findUserById:在映射配置文件中,mapper的namespace为test,
16 * 其中有一个select,也就代表查询的statement。
17 * 1:输入参数为1
18 * 返回的结果类型为User
19 */
20 User user = sqlSession.selectOne("test.findUserById", 1);
21 System.out.println(user);
22
23 //5、关闭sqlsession资源
24 sqlSession.close();
25 }
1 //根据用户id进行查询。findUserById
2 @Test
3 public void test() throws IOException{
4 //跟hibernate一样,需要获取一大堆东西
5 // 1、读取配置文件
6 String resource = "SqlMapConfig.xml";
7 InputStream inputStream = Resources.getResourceAsStream(resource);
8 // 2、根据配置文件创建SqlSessionFactory
9 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
10 // 3、SqlSessionFactory创建SqlSession
11 SqlSession sqlSession = sqlSessionFactory.openSession();
12 // 4、SqlSession执行statement,并返回映射结果
13
14 /*
15 * test.findUserById:在映射配置文件中,mapper的namespace为test,
16 * 其中有一个select,也就代表查询的statement。
17 * 1:输入参数为1
18 * 返回的结果类型为User
19 */
20 User user = sqlSession.selectOne("test.findUserById", 1);
21 System.out.println(user);
22
23 //5、关闭sqlsession资源
24 sqlSession.close();
25 }
3.6.2、查询, 模糊查询,对username字段进行模糊查询
user.xml映射文件
操作
3.6.3、增加User, insert
user.xml,insert操作,对主键id有几种不同的处理方式,具体看下图的解释
操作
3.6.4、删除 delete
映射文件
操作
3.6.5、更新 update
映射文件
操作
小总结:编写了最基础的全局配置文件和映射文件。
全局配置文件:连接数据库所需要的帐号密码等属性,事务等操作
映射文件:通过对比原始jdbc连接数据库,其实mybatis中的映射文件就是对statement的硬编码进行改进,我们配置的都市statement需要的东西
sql语句、输入参数类型代替sql语句中的占位符,输出参数类型表示输出结果,都可以对应着statement的操作
parameterType:指定输入参数的java类型,可以填写别名或Java类的全限定名。别名的用法在详细讲解全局配置文件的时候会讲解到,在那边可以配置
resultType:指定输出结果的java类型,可以填写别名或Java类的全限定名。
#{}和${}的用法
#{}:相当于预处理中的占位符?
#{}里面的参数表示接收java输入参数的名称
#{}可以接受HashMap、简单类型、POJO类型的参数
简单类型:#{}里面可以是value,可以是任意值
POJO类型的参数:必须是POJO中的属性名
hashmap:key值名
${}:相当于拼接SQL串,对传入的值不做任何解释的原样输出。
${}会引起SQL注入,所以要谨慎使用。
${}可以接受HashMap、简单类型、POJO类型的参数。
当接受简单类型的参数时,${}里面只能是value。
sqlSession操作时selectOne和selectList
selectOne:只能查询0或1条记录,大于1条记录的话,会报错
selectList:可以查询0或N条记录
对于增删改操作,切记需要commmit操作才能够生效。
四、开发dao的方式
上面我们就单纯测试了使用mybatis对数据库的增删改查操作,在开发中,我们都是开发dao接口和dao实现类,那么就在dao实现类中调用sqlsession的方法对数据库的增删改差操作即可。
4.1、dao接口
4.2、daoImpl 实现类
4.3、测试
小总结:
这样开发有一个不好的地方,就是不能够直接使用dao接口中的方法,而是使用的sqlSession中的方法,这样让人不能一目了然,所以我们在开发中都不使用这种方式进行开发,而是使用Mapper代理的方式,什么意思呢?接下来讲讲。
五、Mapper代理开发的方式
Mapper代理开发方式就是开发mapper接口(相当于dao接口)
1、mapper接口的全限定名要和mapper映射文件的namespace一致
2、mapper接口的方法名称要和mapper映射文件的statement的id一致
3、mapper接口的方法参数类型要和mapper映射文件的statement的parameterType一致
4、mapper接口的方法返回值类型要和 mapper映射文件的statement的resultType一致
这样直接看肯定不好理解,所以直接上代码。
三样东西,mapper接口,两个配置文件,一个全局配置文件,一个映射文件,但是这个映射文件就有要求了,除了上面所说的四点之外,另外一点也最好遵循,这里用不到,但是后面会讲解为什么会这样使用,就是mapper接口的名称要和映射文件的名称相同,
mapper接口,UserMapper.java
映射文件,UserMapper.xml
全局配置文件。sqlMapConfig.xml
其他都跟上面一样,重点讲一下这个mappers加载映射文件的问题,为什么需要mapper接口和映射文件同名,并且放入同一目录下
为了方便批量加载映射文件。而使用这种方式,前提条件就是接口和映射文件同名并且放入同一目录下。
测试
直接调用方法名即可
六、总结
mybatis的基本用法就是这样,我想大家应该都有点感觉了,就是在映射文件中编写statement,将输入参数和输出结果进行映射,所以说mybatis是不完全映射的框架。懂了基本的用法之后,那么之后就会详细讲解其中的问题,全局配置文件当中的配置,映射文件中的详细配置(高级映射),延迟加载,一级缓存二级缓存等用法。
Mybatis学习(一)—————mybatis入门的更多相关文章
- MyBatis学习总结-MyBatis快速入门的系列教程
MyBatis学习总结-MyBatis快速入门的系列教程 [MyBatis]MyBatis 使用教程 [MyBatis]MyBatis XML配置 [MyBatis]MyBatis XML映射文件 [ ...
- mybatis学习:mybatis的注解开发和编写dao实现类的方式入门
一.使用注解则不需要创建映射配置文件:即xxxDao.xml javaBean为什么要实现Serializable接口? Java的"对象序列化"能让你将一个实现了Serializ ...
- mybatis学习:mybatis的环境搭建与入门
一.mybatis的概述: mybatis是一个持久层框架,用java编写 它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接登繁杂过程 它使用了ORM思想 ...
- MyBatis学习(三)---MyBatis和Spring整合
想要了解MyBatis基础的朋友可以通过传送门: MyBatis学习(一)---配置文件,Mapper接口和动态SQL http://www.cnblogs.com/ghq120/p/8322302. ...
- Mybatis学习笔记-Mybatis简介
如何获得Mybatis 中文文档 https://github.com/tuguangquan/mybatis Github https://github.com/mybatis/mybatis-3 ...
- mybatis学习四 mybatis的三种查询方式
<select id="selAll" resultType="com.caopeng.pojo.Flower"> select * from fl ...
- Mybatis学习总结--------Mybatis <where>标签 (九)
<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WH ...
- mybatis 学习六 MyBatis主配置文件
在定义sqlSessionFactory时需要指定MyBatis主配置文件: <bean id="sqlSessionFactory" class="org.myb ...
- mybatis 学习二 MyBatis简介与配置MyBatis+Spring+MySql
1.2.2建立MySql数据库 在C:\Program Files\MySQL\MySQL Server 5.7\bin下面: 首先连接MySQL: mysql -u root -p ...
- mybatis学习:mybatis的二级缓存
一级缓存: 一级缓存是SqlSession级别的缓存.在操作数据库时需要构造 sqlSession对象,在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据.不同的sqlSession ...
随机推荐
- cp/tar/用c语言编写程序 实现cp命令的效果
1.cp (拷贝) 已存在文件路径 要拷贝的文件路径 实现cp命令的代码如下: #include <stdio.h> //因为要在命令中得到两个路径,所以要用到main函数的两个参数 i ...
- HTML5标签汇总及知识学习线路总结
HTML5标签汇总,以及知识学习线路总结.
- JS模块化工具require.js教程(二):基本知识
前一篇:JS模块化工具我们以非常简单的方式引入了requirejs,这一篇将讲述一下requirejs中的一些基本知识,包括API使用方式等 基本API require会定义三个变量:define,r ...
- Vue两种组件类型介绍:递归组件和动态组件
一递归组件 递归组件的特性就是可以在自己的template模板中调用自己本身.值得注意的它必须设置name属性. // 递归组件 recursive.vue <template> < ...
- RabbitMQ “Hello world!”
本文将使用Python(pika 0.9.8)实现从Producer到Consumer传递数据”Hello, World“. 首先复习一下上篇所学:RabbitMQ实现了AMQP定义的消息队列.它实现 ...
- 132.leecode-Palindrome Partitioning II
这个题需要两个dp,一个保存从i到j是否为回文串 另一个保存0到i的最小的分割 下面是我的效率不太高的代码 class Solution { public: int minCut(string s) ...
- pycharm断点应用
1.在需要打断点行处,单击鼠标左键打断点 2.调试程序开始,在第一个断点之前停止 3.跳过第一个断点进入到下一个断点
- 手工检测SQL注入漏洞
SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,具体来说,它是利用现有应用程序将(恶意的)SQL命令注入到后台数据库引擎执 ...
- Docker学习笔记-两种发布方式
第一种,自己手写dockerfile发布,上传至hubDocker 正常发布到文件夹中,发布文件上传至linux机器上.如 /www/app 将Dockerfile文件也复制到同目录 ./www/ap ...
- soundJs库简单使用心得
概述 由于工作需要,学习了一下soundJs库,把心得记录下来,供以后开发时参考,相信对其他人也有用. soundJs是createJs的一部分,它提供了强大的API来处理音频,是音频类H5的一个比较 ...