接触mybatis使用
1、mybatis
mybatis是一个自定义sql、存储过程和高级映射的持久层框架,是Apache下的顶级项目。
mybatis可以让程序员将主要精力放在sql上,通过mybatis提供的映射方式。自由灵活生成满足需要的sql。
mybatis可以将向prepareStatement中的输入参数自动进行输入映射,将查询结果集自动映射成Java对象。
2、mybatis框架
3、最主要的配置文件SqlMapConfig.xml
配置数据库连接等。
映射文件
映射文件命名方式(来自ibatis命名),mapper代理开发映射文件名称叫xxxMapper.xml,在映射文件中配置sql。
全局配置文件内容如下:
properties(属性):可以将连接数据库的值编写在另一个配置文件中,如db.properties,然后再加载该配置文件。
settings(全局配置参数)
typeAliases(类型别名):在mapperxml定义了很多的statement,ParameterType和resultType的名字比较长,可以使用别名重新定义
typeHandlers(类型处理器)
ObjectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器):可以单个加载映射文件(resource),也可以通过mapper接口加载映射文件
4、实例演示
功能:MySQL中有一个user表,通过ID来查询user和通过name来模糊查询user。
(1)配置SqlMapConfig.xml
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd" ><configuration>    <!--和spring整合后environment配置将废除  -->    <environmentsdefault="development">        <environmentid=development>        <!-- 使用jdbc事务管理,事务控制由mybatis -->            <transactionManagertype="JDBC"></transactionManager>        <!-- 数据库连接池,由mybatis管理 -->            <dataSourcetype="POOLED">                <propertyname="driver"value="com.mysql.jdbc.Driver"/>                <propertyname="url"value="jdbc:mysql://127.0.0.1:3306/databasename"/>                <propertyname="username"value="root"/>                <propertyname="password"value="mysql"/>            </dataSource>            </environment>    </environments>        <!-- 加载映射文件 -->    <mappers>        <mapperresource="resources/mapper/UserMapper.xml"/>    </mappers></configuration> | 
(2)配置UserMapper.xml。各种sql的使用都在这里来映射。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?xmlversion="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进行分类化管理,理解sql隔离 不同表可以施工不同的命名空间注意:使用mapper代理方法开发,namespace就有特殊重要的作用 --><mappernamespace="test">    <!--在映射文件中配置很多sql语句  -->    <!--通过select执行数据库查询    ID:标识映射文件中的sql,将sql语句封装到mapperStatement对象中,所以id就是statement的id    parameterType:指定输入参数类型,这个根据数据库字段类型来的    #():标识一个占位符    #(id):其中id表示接收输入参数。参数名称就是id,如果输入参数是简单类型,#()中的参数名词可以任意,可以是value或者其他    resultType:指定sql输出结果集所映射的Java对象。      -->      <selectid="findById"parameterType="int"resultType="com.hust.wt.model.User">        select * from user where id=#();      </select>        <!--      resultType指定的就是单条记录所映射的Java对象类型      ${}:表示拼接sql串,将接收到参数的内容不叫任何修饰【拼接在sql中。使用${}会引起sql注入      ${value}:接收输入参数的内容,如果传入类型是简单类型,${}中只能是value        -->      <selectid="findByName"parameterType="java.lang.String"resultType="com.hust.wt.model.User">        select * from user where name like ‘%${value}%’;      </select></mapper> | 
(3)测试程序:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | publicclassTestOne {    @Test    publicvoidfindByIdTest() throwsIOException{        //mybatis的配置文件        String resource = "conf/SqlMapConfig.xml";        //得到配置文件流        InputStream inputStream = Resources.getResourceAsStream(resource);        //创建会话工厂        SqlSessionFactory sqlSessionFactory = newSqlSessionFactoryBuilder().build(inputStream);        //通过工厂得到会话        SqlSession sqlSession = sqlSessionFactory.openSession();        //通过SQlSession来操作数据库        //第一个参数statement:映射文件statement的id,等于=命名空间+‘。’+statement的id,        //第二个参数Parameter指定和映射文件中所匹配的ParameterType类型的参数        //返回的结果就是映射文件中的resultType类型的对象        User user=sqlSession.selectOne("test.findById", 1);        System.out.println(user);        //释放资源        sqlSession.close();    }} | 
整个执行过程就可以使用debug来走一遍。
对于第二个select,就是另一个不同的需求,可以在写一个test方法来测试,这里忽略。
(4)小结
- parameterType:输入参数类型 
- resultType:指定输出结果的类型 
- #{}:#{}代表占位符,类型可以是简单类型,model(pojo类)、HashMap。使用其接受pojo对象值是通过OGNL读取对象中的属性值。如果pojo中还有pojo类,那么就是user.user.username来读取属性值,即属性.属性。 
- ${}是拼接符号,拼接sql语句,但是这会引起sql注入 
- selectOne表示查询出一条记录进行映射,如果使用selectOne那么也可以使用selectList(列表记录为1条) 
- selectList表示查询出一个列表(多条记录)进行映射。但不能使用selectOne来替代。 
(5)扩展功能
添加用户:在UserMapper.xml中添加insert
| 1 2 3 4 | <!-- 添加用户 parameterType为model类型是复杂对象  -->      <insertid="insertUser"parameterType="com.hust.wt.model.User">        insert into user(id,name,password,age) value(#{id},#{name},#{password},#{age})      </insert> | 
在测试程序中需要 提交事务sqlSession.commit();
删除用户和更新用户:在UserMapper.xml中添加
| 1 2 3 4 5 6 7 | <deleteid="deleteUser"parameterType="java.lang.Integer">       delete from user where id=#{id}     </delete>          <updateid="updateUser"parameterType="com.hust.wt.model.User">       update user set name=#{name}, password=#{password},age=#{age},where id=#{id}     </update> | 
(6)hibernate和mybatis的区别
hibernate:是一个标准ORM框架(对象关系映射)入门门槛较高,不需要写sql语句,自动生成sql语句。对sql的优化和修改会比较困难
使用场景:适用需求变化不多的中小型项目,比如ERP,ORM,OA等。
mybatis:专注的是sql本身,需要程序员自己去编写sql语句,便于语句的优化和修改。mybatis可以裂解成一个不完全的ORM框架,虽然程序员可以自己写sql,也可以实现映射(输入输出)。
使用场景:适用于需求变化较多的项目,比如互联网项目。
5、mapper代理开发dao
使用mapper代理开发则需要编写mapper.xml映射文件和mapper.java接口,还需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。
开发规范:
(1)在mapper.xml中namespace等于mapper接口地址。
| 1 2 3 4 | <!--namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 不同表可以施工不同的命名空间注意:使用mapper代理方法开发,namespace就有特殊重要的作用,namespace等于mapper接口地址 --><mappernamespace="com.hust.wt.mapper.UserMapper"> | 
(2)mapper.java接口中的方法名和mapper.xml中的statement的id一致
(3)mapper.java接口中的方法输入参数类型和mapper.xml中的statement的ParameterType一致
(4)mapper.java接口中的方法输入参数类型和mapper.xml中的statement的resultType一致
所有的开发规范就是对一些重复代码的封装,进行统一的生成:
User user=sqlSession.selectOne("test.findById", id);
sqlSession.insert("test.insertUser", user);
使用mapper代理的方式就不需要再写dao的实现类了。只需实现mapper接口就行。
就相当于dao接口,dao接口的方法定义满足mapper的开发规范要求,然后在mapper中namespace设置成dao的地址即可。
所有的mapper.xml文件都要在总的配置文件中SqlMapConfig.xml加载。
mapper接口方法参数只能有一个,这并不会影响系统的开发,可以使用包装类型的pojo来满足不同的业务方法的需求。
6、输出映射
resultType:需要列名和属性名一致
resultMap:当查询出的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间做一个映射关系。
7、动态SQL
对sql语句的灵活使用。where和if标签的灵活使用可以让sql语句拼接起来。如下表示,如果userCustom不为null则将条件user.sex=#{userCustom.sex}加入select语句中,如果为null则不在查询条件内。
我们还可以将上边的sql判断代码段抽取出来,组成一个sql片段,这样其他的statement中就可以引用该sql片段。
(1)定义sql片段(mapper.xml)
(2)引用片段
8、foreach
如果需要向sql中传递数组或list时,就需要使用到foreash。
例如用户查询列表中增加多个id输入查询。
select * from user where id=1 or id=2 or id=3...(id in(1,2,3))
(1)在输入参数类型中添加List<Integer>ids传入多个id。在输入参数的Vo中,添加List属性:
(2)修改mapperxml
实现sql语句拼接
实现sql语句拼接:
接触mybatis使用的更多相关文章
- MyBatis学习笔记(一)入门
		首先给大家推荐几个网页: http://blog.csdn.net/isea533/article/category/2092001 没事看看 - MyBatis工具:www.mybatis.t ... 
- 初识Mybatis框架,实现增删改查等操作(动态拼接和动态修改)
		此第一次接触Mybatis框架确实是有点不适应,特别是刚从Hibernate框架转转型过来,那么为什么要使用Mybatis框架,Mybatis框架和Hibernate框架又有什么异同呢? 这个问题在我 ... 
- mybatis 配置返回集合collection时只有一条记录
		查询语句配置如下: <select id="selectCustomerList" resultMap="CustomerDtoMap" paramete ... 
- Mybatis.Net 整合 ODP.NET Managed
		初步接触MyBatis.Net的朋友,请先移步 MyBatis.Net 学习手记 1. 项目中先添加Oracle.ManagedDataAccess.dll程序集引用 2. MyBatis.Net 中 ... 
- 初识Mybatis框架,实现增删改查等操作
		此第一次接触Mybatis框架确实是有点不适应,特别是刚从Hibernate框架转转型过来,那么为什么要使用Mybatis框架,Mybatis框架和Hibernate框架又有什么异同呢? 这个问题在我 ... 
- mybatis与spring的整合(使用接口实现crud)
		本人刚刚接触mybatis,今天把它和spring整合起来用了一个上午==. 一开始是通过配置文件来配置,后来尝试用了一下注解,觉得mybatis的注解真的有点恶心...一大坨的,所以我还是建议使用配 ... 
- mybatis入门配置和调试
		欢迎转载http://www.cnblogs.com/jianshuai520/p/8669177.html大家一起努力,如果看的时候有图片半边遮挡起来的话,右键查看图片,就可以观看完整的图片,具体怎 ... 
- MyBatis动态sql之${}和#{}区别
		前言  接触mybatis也是在今年步入社会之后,想想也半年多了,缺没时间去系统的学习,只知道大概,也是惭愧.  不知道有多少刚毕业的同学和我一样,到现在还没仔仔细细去了解你每天都会见到使用到的框 ... 
- MyBatis正在爬的坑
		换了份工作,开始接触Mybatis,开一篇文章记录一下自己遇到的坑 2018-06-20 今天遇到了一个问题,编好的sql语句在数据库可以执行但是写到程序里边就GG,什么问题呢?一直纠结在程序哪里写错 ... 
随机推荐
- sqoop导入导出对mysql再带数据库test能跑通用户自己建立的数据库则不行
			sqoop对hdfs导入导出怎么操作这里我就不多说了 现在说下sqoop导入导出时针对mysql后面用户手动创建的数据库导入到处遇到的问题 首先我这里搭建的是3节点集群 master slave1 s ... 
- 现在的 Linux 内核和 Linux 2.6 的内核有多大区别?
			作者:larmbr宇链接:https://www.zhihu.com/question/35484429/answer/62964898来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ... 
- JAVA Spring JdbcTemplate ( 以 SQLSERVER 为例 ) 的简单使用
			< 1 > 配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&q ... 
- DevExpress GridView 显示行号
			Private Sub GridView1_CustomDrawRowIndicator(sender As Object, e As RowIndicatorCustomDrawEventArgs) ... 
- 拒绝网页被 iframe 嵌套
			在响应头里加一个X-Frame-Options DENY:浏览器拒绝当前页面加载任何Frame页面 SAMEORIGIN:frame页面的地址只能为同源域名下的页面 ALLOW-FROM origin ... 
- Webservice 返回数据集 DataSet 及Android显示数据集LiveBindings
			一.服务端 New TSoapDataModule 添加控件 TDataSetProvider,TClientDataSet,TADOQuery,TADOConnection 添加方法 functio ... 
- Windows下MySQL5.6查找my.ini配置文件
			在DOS命令行窗口登录MySQL,输入如下命令查看MySQL的安装目录和数据存放目录,MySQL的配置文件就在数据存放目录下: 另外一种方法: 在"开始 → 所有程序 → MySQL&quo ... 
- 在 WampServer 上手工安装 PHP 的多个版本
			手工安装新版本的PHP,只需以下步骤: 下载要安装的PHP版本.既然是用WampServer,那当然是下载Window版本的ZIP包啦:http://windows.php.net.解压到 Wamp的 ... 
- php用正则判断是否为数字
			验证数字:^[0-9]*$验证n位的数字:^\d{n}$验证至少n位数字:^\d{n,}$验证m-n位的数字:^\d{m,n}$验证零和非零开头的数字:^(0|[1-9][0-9]*)$验证有两位小数 ... 
- windows installer 应用变换时的错误.请验证指定的变换路径是否有
			安装Windows Installer Clean Up 清理一下残留的项目之后再装或者手动去注册表找 HKEY_CLASSES_ROOT\Installer\Products\ 下面的"子 ... 
