Mybatis—curd
Mybatis简介:
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行 一些改进。 目前mybatis在github上托管。
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发 者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、 创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、
preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的
sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成 java对象并返回。简单来说,mybatis封装了相关jdbc的操作,经过简单的配置,然后该框架就会帮我 们运行我们写的sql。
搭建Mybatis工作环境:
step1:
导入jar包(mybatis-3.4.5.jar、mysql-connector-java-5.1.7-bin.jar)。
step2:
书写UserBean,DAO接口 。
step3:
书写配置文件(两个):
1、资源文件(主配置文件)SqlMapConfig.xml,用于指定数据库连接参数和框架参数。
1.1 文件抬头格式书写
<?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">
1.2 内容配置
<configuration>
<environments default="mysql"> <!--配置数据库连接环境-->
<environment id="mysql">
<!--先配置事物 -->
<transactionManager type="JDBC" />
<!-- 配置mysql数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/gokee_0703" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!-- 配置映射文件(sql语句)的位置 -->
<mappers>
<mapper resource="mapper/UserMapping.xml"/>
</mappers>
</configuration>
2、映射配置文件 SqlMap.xml,用于定义sql语句和映射信息。
2.1 文件抬头格式书写
<?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">
2.2 内容配置
<mapper namespace="dao.UserDAO">
<select id="findUserById" resultType="entity.UserBean" parameterType="String">
select * from bank where id=#{id}
</select>
</mapper>
参数解析:
①namespace为该mapper文件的命名空间,且一个DAO对应一个映射配置文件,值为对应dao的全类名;
②id指该sql语句的id,要求唯一,其值为对应接口的方法名;
③resultType表示返回数据的类型;
④parameterType表示传 入参数的类型。
代码测试
书写测试类(核心操作: 获取SqlSession 数据会话对象,调用其提供的方法实现对数据库的操作):
//使用类加载器加载mybatis的配置文件,并构建sqlSession的工厂 InputStream is = Resources.getResourceAsStream(“xml”);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
// 获取SqlSession 对象
SqlSession session = sessionFactory.openSession();
//获得相关的dao
IUserDao userDao = session.getMapper(IUserDao.class);
API解析:
1、SqlSessionFactoryBuilder :
该对象负责根据配置文件SqlMapConfig.xml构建SqlSessionFactory实例。
2、SqlSessionFactory :
每一个Mybatis的应用程序都将以一个SqlSessionFactory 对象为核心,该对象负责构建SqlSession实例。
3、SqlSession(数据库会话):
该对象包含了所有执行Sql操作的方法,用来执行已经映射的sql语句,不过Sqlsession打开数据库,真正 完成交互的是Executor,SqlSession对数据库的操作都是通过Executor来完成的,Executor是动态创建,不需要我们 去管理。
CURD操作
1.单表增加操作:
usermapper.xml:
<insert id="saveUser" parameterType="entity.BankUser" >
INSERT INTO bank VALUES(#{id},#{user_name},#{password},#{address})
</insert>
java代码:
UserDAO userDAO=sqlSession.getMapper(UserDAO.class);
User user=new User();
int i=userDAO.addUser(user);
sqlSession.commit();
1、这里就算不写ResultType 也可以得到默认的返回值int,
2、mybatis框架独立运行时,需要手动控制事物,进行打开、提交、回滚、关闭操作。若集成了Spring框架, 则可以将其托管到Spring中自动管理。
2.单表修改操作:
usermapper.xml:
<update id="upadateUserName" parameterType="entity.UserBean">
UPDATE bank SET user_name=#{user_name} WHERE id=#{id}
</update>
java代码:
int i=userDAO.updateUser(user);
session.commit();
3.单表删除操作:
usermapper.xml:
<delete id="deleteUserName" parameterType="String">
DELETE FROM bank WHERE id=#{id}
</delete>
java代码;
int i=userDAO.deleteUserById(“1”);
session.commit();
4.单表查询操作:
1 查询单条数据:
usermapper.xml:
<select id="findUserById" parameterType="String"resultType="entity.UserBean">
select * from bank where id=#{id}
</select>
java代码:
UserDAO userDAO=sqlSession.getMapper(UserDAO.class);
BankUser bankUser=userDAO.getUserInfoById("1");
2 查询多条数据:
usermapper.xml:
<select id="findUserById" resultType="entity.UserBean">
select * from bank
</select>
java代码:
UserDAO userDAO=sqlSession.getMapper(UserDAO.class);
List<UserBean> list =userDAO.userDAO.getAllBankUser1();
注:这里需要注意一个问题就是resultType代表的是List中的元素类型,而不应该是List本身,所
以大家会看到如果我们想获取一个UserBean集合, 在配置不应该是resultType=“List”
3.查询数据返回一个Map(Mybatis自动将数据装入map中,键是字段名,值是字段值)类型:
usermapper.xml:
<select id="findUserById" parameterType="String" resultType="Map">
select * from bank where id=#{id}
</select>
java代码:
UserDAO userDAO=sqlSession.getMapper(UserDAO.class);
Map<String,Object> map=userDAO.getUserById("02");
4 查询单个字段:
usermapper.xml:
<select id="findUserById" parameterType="String" resultType="String">
select userName from bank where id=#{id}
</select>
java代码:
UserDAO userDAO=sqlSession.getMapper(UserDAO.class);
String userName=userDAO.getUserNameById("张三");
5.关于模糊查询:
我们知道模糊查询需要使用通配符 %,但是如果直接使用 #,明显不能实现的(下面会讲到#和$的区别):
SELECT * FROM bank WHERE user_name LIKE #{name}
所以我们可能会:
SELECT * FROM bank WHERE user_name LIKE ' ${value} '
但是使用 ${} 也是我们不提倡的方式,所以此时我们可以使用concat函数
SELECT * FROM bank WHERE user_name LIKE CONCAT(' ',#{name},' ')
Mybatis中#和 $参数取值:
参数的值的获取问题:
在Mybatis的映射配置文件中可以通过#{ }或 ${ }这两种方式实现参数值的获取,一般来说能使用#{ } 就不要使 用 ${ }。
1、当传入参数为String类型时:
使用#{ } 方式可以 通过 #{参数名} 或者默认的 #{_parameter} 来获取参数值,
但是使用${ }时,不能直接通过${参数名}来获取,需要通过默认方式 ${value} 来取值
2、#{} 和 ${} 取值的区别:
#{}进行参数获取时,会把参数转成字符串,即会自动加上一个引号 ‘ ’ ,如
select * from bank where name= #{name}
传入名字 “ zhangsan”,最终得到的是 :
select * from bank where name= ‘ zhangsan’
${}是将传入的数据直接显示生成在sql中:
select * from bank where name= ${value}
传入名字 “zhangsan”,最终得到:
select * from bank where name = zhangsan
直接运行报错,所以需要我们手动添加 ‘ ‘:
select * from bank where name= ‘ ${value} ’
但是这样做会带来非常严重的sql注入
比如传入这样的参数:
userDAO.getUserIByPsd(" pwd111 ' OR '1'='1 ")
实际上是
select * from bank where password= ' pwd111 ' OR '1'='1'
3、${} 的使用场景:
多数情况下我们应该使用#{ },但是有些时候我们需要使用${},比如进行动态排序时,根据传入字段排序:
SELECT * FROM bank order by #{ columnName}
比如说按照工资排序,你传入salary这个字段,结果:
SELECT * FROM bank order by 'salary'
这样明显排序时不起作用的,我们需要
SELECT * FROM bank order by ${ columnName}
所以说${ }方式一般用于传入数据库对象,例如传入表名 ,列名这种。
Mybatis多参数查询映射:
当sql语句只需要一个参数作为条件时,那么只要通过#{参数名}便可获得该参数值,但是当有多参数时, 这样做会直接报错,这里提供如下解决方案:
- 将多个参数传入map, 然后#{keyName} 获取
- 将多个参数封装到实体类,然后#{属性名}获取
- MyBatis还提供了一个使用@Param注解来参入多个参数的方式。这种方式需要在接口的参数上添加
public UserBean checkLogin(@Param(value="name")String userName, @Param(value="password")String password);
在映射文件中便可以通过 #{name} #{password} 取出。
ResultType和resultMap
MyBatis中在查询进行select映射的时候,返回数据类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是在同一个select节点中两 者不能够同时存在。
在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属 性名,值则是其对应的值。
当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象 对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
<!-- 当表的字段名和实体类的属性名不一致时,MyBatis在进行数据映射时就失败,此时用resultMap解决此问题 -->
<select id="findById3" parameterType="String" resultMap="userMap">
SELECT * FROM bank WHERE id=#{id}
</select>
<!--id属性: resultMap标签的标识 ; type : 返回值的全限定类名,或类型别名 -->
<resultMap type="entity.UserBean" id="userMap">
<id property="userId" column="id"/>
<result property="userName" column="user_name"/>
</resultMap>
注: resultMap 子节点有6个,①id元素 ,用于设置表的主键字段与实体类属性的映射关系,
②result元素 ,用于设置表普通字段与实体类属性的映射关系,其他作了解 。
子节点属性: property: 属性名 column:表的字段名。
Mybatis—curd的更多相关文章
- MyBatis初级实战之二:增删改查
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- MyBatis初级实战之三:springboot集成druid
OpenWrite版: 欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kuber ...
- MyBatis初级实战之四:druid多数据源
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- MyBatis初级实战之五:一对一关联查询
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 【mybatis】1、入门CURD基本操作(环境搭建)
#1.基本环境 环境 版本 jdk 1.7.0_10 ide eclipse-jee-luna-SR2-win32-x86_64 maven 3.3.3 mybatis 3.2.7 mysql 5.1 ...
- Spring Boot入门教程2-1、使用Spring Boot+MyBatis访问数据库(CURD)注解版
一.前言 什么是MyBatis?MyBatis是目前Java平台最为流行的ORM框架https://baike.baidu.com/item/MyBatis/2824918 本篇开发环境1.操作系统: ...
- MyBatis最原始的实现curd的操作
关于jdbc的缺点: 1.数据库链接创建释放频繁造成系统资源浪费从而影响系统性能.如果使用数据库连接池可以解决此问题. 2.sql语句在代码中硬编码,不利于维护,sql变动需要改变java代码 3.使 ...
- 使用tk.mybatis快速开发curd
使用mybatis已经是可以快速开发程序了,对于单表的curd似乎是一种可抽象的结果,下面介绍tk.mybatis的使用方式. maven引用 我使用的是这个版本,所以相关功能介绍也是这个版本. 使用 ...
- Mybatis学习第一天——Mybatis的安装配置以及基本CURD操作
1.Mybatis下载 Mybatis是开源的持久层框架,能够度jdbc进行简单的封装,但其并不是完全的ORM(Object Relational Mapping,对象关系映射),无法脱离数据库进行适 ...
随机推荐
- PHP current() 函数
实例 输出数组中的当前元素的值: <?php$people = array("Peter", "Joe", "Glenn", &quo ...
- 部署java项目日志乱码求解!!!
springboot项项目打成war包放到tomcat9上,项目日志出现乱码,tomcat乱码已解决,这个不知道咋回事!!!!!! 这是项目的打包坐标 <parent> <group ...
- Elasticsearch和Scala类型转换
Scala Type ES Unit null None null Nil empty array Some[T] according to the table Map object Traver ...
- Canal简介
以下内容主要摘自Canal 官方wiki和网友博客:https://www.jianshu.com/p/6299048fad66 一.背景 早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨 ...
- Mac IDEA 免激活破解版 亲测有效 2020.8.1记
开局一张图 下载地址 链接: https://pan.baidu.com/s/1OKbYCRQiZ3ip0Gzle5wydg 密码: iwfb 步骤 卸载之前的IDEA(没安装过,可忽略) 将下载后的 ...
- python 变量的命名规则和注意事项
命名规则 变量名只能包含字母.数字和下划线.变量名可以字母或下划线打头,但不能以数字打头,例如,可将变量命名为message_1,但不能将其命名为1_message 变量名不能包含空格,但可使用下划线 ...
- jetbrain的plugin repository地址
jetbrain的plugin repository地址:https://plugins.jetbrains.com/plugins/alpha/5047 有的时候 plugins内搜不到东西 把这个 ...
- Android html5和Android之间的交互
今天补充了会昨天的问题,然后搞半天又出现莫名其妙的问题. 今天讲的是交互,先说html5在Android的调用. 上面的hello world上面的部分都是安卓里的布局 然后按这些布局自动生成代码. ...
- python2.5项目:个税计算器程序
#开发个税计算器:应纳税所得额=工资收入金额-各项社会保险费-起征点(5000元)应纳税额=应纳税所得额*税率—速算扣除数(税率参考图片)m=float(input("请输入你的税前工资:& ...
- Pytorch_第七篇_深度学习 (DeepLearning) 基础 [3]---梯度下降
深度学习 (DeepLearning) 基础 [3]---梯度下降法 Introduce 在上一篇"深度学习 (DeepLearning) 基础 [2]---神经网络常用的损失函数" ...