Mybatis中的增删改查
相比jdbc mybatis在操作数据库方面比jdbc节省了大量的代码,及大量的代码冗余.使得操作起来更加简洁.
在Mapper中分别有着 select,insert, update,delete的这四个标签分别对应着SQL语句中的查询映射,添加映射,修改映射,删除映射.
<select id=""></select>
<insert id=""></insert>
<update id=""></update>
<delete id=""></delete>
不同点
可以看到除了标签,SQL语句的作用不一致,以及除了select返回的数据不是受影响行数之外,其它的都是返回受影响行数,也就是返回的是int类型数据
相同点
都需要传入参数
xml代码如下
<select id="getProvider" resultType="Provider">
SELECT * FROM smbms_bill b JOIN smbms_provider p ON b.providerId=p.id
WHERE b.providerId=#{id}
</select>
<update id="updatePwd" parameterType="User">
UPDATE `smbms_user` SET `userPassword` = #{userPassword} WHERE `id` = #{id} ;
</update>
<delete id="delUserById" parameterType="Integer">
delete from smbms_user where id=#{id}
</delete>
<insert id="add" parameterType="User">
INSERT INTO `smbms_user`
(`userCode`, `userName`, `userPassword`, `gender`,
`birthday`, `phone`, `address`, `userRole`, `createdBy`,
`creationDate`, `modifyBy`, `modifyDate`)
VALUES(#{userCode},#{userName},#{userPassword},#{gender},
#{birthday},#{phone},#{address},#{userRole},#{createdBy},#{creationDate},
#{modifyBy}, #{modifyDate});
</insert>
接口代码
List<Provider> getProvider(Integer id);
int add(User u);
int updatePwd(User u);
int delUserById(int id);
测试类代码
public static void main(String[] args) {
SqlSession sqlSession=null;
List<Bill> bList = new ArrayList<>();
List<Provider> providers = new ArrayList<>();
try {
sqlSession=MyBatisUtil.createSqlSession();
providers=sqlSession.getMapper(ProviderMapper.class).getProvider(1);for (Provider p : providers) {
for (Bill b : p.getBills()) {
System.out.println(b.getProductName());
}
}
} catch (Exception e) {
e.printStackTrace();
logger.debug(e);
}finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
}
@org.junit.Test
public void testAdd() {
logger.debug("testAdd-----");
SqlSession sqlSession =null;
int count=0;
try {
sqlSession = MyBatisUtil.createSqlSession();
User u = new User("测试用户", 1);
u.setUserCode("test001");
u.setUserPassword("123456");
u.setBirthday(Date.valueOf("1999-09-09"));
u.setAddress("测试地址");
u.setGenfer(1);
u.setPhone("19973535706");
u.setCreatedBy(1);
u.setCreationDate(Date.valueOf("1999-09-09"));
count = sqlSession.getMapper(UserMapper.class).add(u);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
}finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
logger.debug("testAdd:"+count);
}
@org.junit.Test
public void testModifyPwd() {
logger.debug("testModifyPwd-----");
SqlSession sqlSession =null;
int count=0;
try {
sqlSession = MyBatisUtil.createSqlSession();
User u = new User("测试用户修改", 1);
u.setUserPassword("123456");
u.setId(15);
count = sqlSession.getMapper(UserMapper.class).updatePwd(u);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
}finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
logger.debug("testModifyPwd:"+count);
}
@org.junit.Test
public void testdel() {
logger.debug("testdel-----");
SqlSession sqlSession =null;
int count=0;
try {
sqlSession = MyBatisUtil.createSqlSession();;
count = sqlSession.getMapper(UserMapper.class).delUserById(16);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
}finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
logger.debug("testdel:"+count);
}
以上一个都传入了参数的,那么我们在来看共同点相同属性也就是parameterType,指的是传入的参数,一种具体的数据类型比如,int,String,自定义的对象等等
注意:传入的参数与SQL语句中参数名两者名称需一致,如果是自定义对象则需与对象中自定义的属性名称一致
此外还有一个属性parameterMap:参数有多个值,并且这多个值之间没有具体的联系,就可以考虑使用parameterMap,或者@param注解
那么再看select中的另外一个属性:resultType指的是返回的数据类型,而除了select其他的都没有,这是因为它们默认就是返回int因此不需要 resultType.
resultMap:必须要自己在这个xml中重新配置一个新的resultMap标签,
注意:当受影响行数为0时返回的值就会是null,因此返回值最好设置成integer而不是int
@Param注解实现多参数
List<Bill> getBill(@Param("id") Integer billId);
使用注解@Parma来传入多个参数,入@Param("id") Integer billId,相当于将该参数重命名为id,在映射的SQL中需要使用#{注解名}
<select id="getBill" parameterType="Integer" resultMap="billResult">
SELECT * FROM smbms_bill b JOIN smbms_provider p ON b.providerId=p.id
WHERE b.providerId=#{id}
</select>
resultType和resultMap的关联
在mybatis进行查询映射的时候,其实查询处理的每个字段值都放在一个对应的Map里面,其中关键是字段名,值则是对应的值,当select提供的返回类型属性
是在resultType的时候,My把提升会将Map里面的键值取出赋值给resultType所知道的对象对应的属性(即钓鱼对应的对象里的属性的setter方法进行填充).因此
,当resulttype的时候,直接在后台就能接收到其相应的值.其实mybatis的每个查询映射的返回类型都是resultMap,只是mybatis自动转换成了我们需要的类型
注意:resultType属性和resultMap属性不能同时存在,只能二者选其一
resultMap自定义映射
<resultMap type="Bill" id="billResult">
<result property="productName" column="productName"/>
<result property="productDesc" column="productDesc"/>
</resultMap>
<select id="getBill" parameterType="Integer" resultMap="billResult">
SELECT * FROM smbms_bill b JOIN smbms_provider p ON b.providerId=p.id
WHERE b.providerId=#{id}
</select>
resultMap的属性值和子节点
- id属性:唯一标识符,此id值用于select于是resultMap的属性引用
- type:表示该resultMap的映射结果类型
- result节点:用于表示一些简单属性,其中column属性表示从数据库中查询的字段名,property则表示查询处来的字段对应的值赋给实体对象的那个属性
设置映射级别
<settings>
<!-- 设置自动匹配所有属性 包括collection与association-->
<setting name="autoMappingBehavior" value="FULL"/>
</settings>
- NONE:禁止自动匹配
- PARTIAL(默认):自动匹配所以属性,内部嵌套的(association,collection)除外
- FULL:匹配所有
有了最高映射级别,因此自定义对象中的属性只要数据库中的字段相对应就不需要使用使用resultMap进行手动映射结果了
association
association:映射到Javabean的某个"复杂类型"属性,比如Javabean类,即Javabean内部嵌套一个复杂数据类型(Javabean)属性,这种情况就属性复杂类型的关联.
如类类,需要注意:association仅处理一对一的关联关系
实体类
private int id;
/**
* 编码
*/
private String billCode;
/**
* 名称
*/
private String productName;
/**
* 商品描述
*/
private String productDesc;
/**
* 商品单位
*/
private String productUnit;
/**
* 商品数量
*/
private int productCount;
/**
* 商品总额
*/
private int totalPrice;
/**
* 是否支付 1 未支付 0 已支付
*/
private int isPayment;
/**
* 创建者
*/
private String createdBy;
/**
* 创建时间
*/
private Date creationDate;
/**
* 更新者
*/
private String modifyBy;
/**
* 更新时间
*/
private Date modifyDate;
/**
* 供应商id
*/
private int providerId;
/**
* 供应商
*/
private Provider provider;
// 省略getset方法
SQL映射
<resultMap type="Bill" id="billResult">
<result property="productName" column="productName"/>
<result property="productDesc" column="productDesc"/>
<association property="provider" resultMap="providerresult"></association>
</resultMap>
<resultMap type="Provider" id="providerresult">
<result property="proAddress" column="proAddress"/>
<result property="proName" column="proName"/>
</resultMap>
<select id="getBill" parameterType="Integer" resultMap="billResult">
SELECT * FROM smbms_bill b JOIN smbms_provider p ON b.providerId=p.id
WHERE b.providerId=#{id}
</select>
上面只选了部分属性进行映射
association属性
- property:映射数据库列的实体对象属性,此处为在Bill定义的属性:Provider
- result:property 映射数据库列的实体对象的属性,此处为Provider,column数控列名或别名
collection
作用与association非常类似,只不过collection对应的是类型中的集合
<resultMap type="Bill" id="billResult">
<result property="productName" column="productName"/>
<result property="productDesc" column="productDesc"/>
</resultMap>
<resultMap type="Provider" id="providerresult">
<result property="proAddress" column="proAddress"/>
<result property="proName" column="proName"/>
<collection property="bills" ofType="Bill" resultMap="billResult"></collection>
</resultMap>
<select id="getProvider" resultMap="providerresult" parameterType="Integer">
SELECT * FROM smbms_bill b JOIN smbms_provider p ON b.providerId=p.id
WHERE b.providerId=#{id}
</select>
collection属性
- ofType:映射数据库列的实体对象属性,此处为在Bill定义的属性:Provider
- result:property 映射数据库列的实体对象的属性,此处为Provider,column数控列名或别名
resultType
Mybatis中的增删改查的更多相关文章
- mybatis中的增删改查操作
在这一个部分,主要进行增删改查的示例书写. 增删改查可以基于xml的,也可以基于注解的方式. 一:对单条数据的查询 1.目录结构 这个使得目录更加清晰 2.User.java 这个使用以前的user表 ...
- Spring Boot 使用Mybatis注解开发增删改查
使用逆向工程是遇到的错误 错误描述 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): c ...
- Mybatis实现简单增删改查
Mybatis的简单应用 学习内容: 需求 环境准备 代码 总结: 学习内容: 需求 使用Mybatis实现简单增删改查(以下是在IDEA中实现的,其他开发工具中,代码一样) jar 包下载:http ...
- MyBatis简单的增删改查以及简单的分页查询实现
MyBatis简单的增删改查以及简单的分页查询实现 <? xml version="1.0" encoding="UTF-8"? > <!DO ...
- Mybatis入门之增删改查
Mybatis入门之增删改查 Mybatis如果操作成功,但是数据库没有更新那就是得添加事务了.(增删改都要添加)----- 浪费了我40多分钟怀疑人生后来去百度... 导入包: 引入配置文件: sq ...
- 【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查
原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...
- MyBatis -- 对表进行增删改查(基于注解的实现)
1.MyBatis对数据库表进行增/删/改/查 前一篇使用基于XML的方式实现对数据库的增/删/改/查 以下我们来看怎么使用注解的方式实现对数据库表的增/删/改/查 1.1 首先须要定义映射sql的 ...
- SpringMVC,MyBatis商品的增删改查
一.需求 商品的增删改查 二.工程结构 三.代码 1.Mapper层 (1) ItemsMapperCustom.java package com.tony.ssm.mapper; import ja ...
- 基于SSM之Mybatis接口实现增删改查(CRUD)功能
国庆已过,要安心的学习了. SSM框架以前做过基本的了解,相比于ssh它更为优秀. 现基于JAVA应用程序用Mybatis接口简单的实现CRUD功能: 基本结构: (PS:其实这个就是用的Mapper ...
随机推荐
- Java集合——集合框架Set接口
1.Set接口 一个不包含重复元素的collecyion.更确切的讲,set不包含满足e1.equals(e2)的元素e1和e2,并且最多包含一个null元素. 2.HashSet 类实现Set接口, ...
- Hive 基本语法操练(六):Hive 的权限控制
Hive 的权限控制 Hive从0.10可以通过元数据控制权限.但是Hive的权限控制并不是完全安全的.基本的授权方案的目的是防止用户不小心做了不合适的事情. 为了使用Hive的授权机制,有两个参数必 ...
- jquery选择器大全参考
在Dom 编程中我们只能使用有限的函数根据id 或者TagName 获取Dom 对象. 然而在jQuery 中则完全不同,jQuery 提供了异常强大的选择器用来帮助我们获取页面上的对象, 并且将对象 ...
- SpringBoot | 第八章:统一异常、数据校验处理
前言 在web应用中,请求处理时,出现异常是非常常见的.所以当应用出现各类异常时,进行异常的捕获或者二次处理(比如sql异常正常是不能外抛)是非常必要的,比如在开发对外api服务时,约定了响应的参数格 ...
- <Linux系统isosize指令用法>
isosize命令:iso9660文件系统大小显示 isosize命令用于显示iso9660文件系统的大小,还文件可以使普通文件,也可以是块设备,如/dev/sr0或者/dev/sda.如果没有相关选 ...
- AnyCAD在医疗中的应用
void addPoint(List<float> buffer, Vector3 pt) { buffer.Add((float)pt.X); buffer.Add((float)pt. ...
- UITableViewCellStyle 四种样式
四种样式如下:
- 使用compiz出现奔溃的一些应急办法
Linux Mint 17.1 CompizConfig is also installed by default so you can configure every aspect of Compi ...
- spring transaction 初识
spring 事务初识 1.spring事务的主要接口,首先盗图一张,展示出spring 事务的相关接口.Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给Hibern ...
- maven 搭建springMvc+mybatis
1.在resource文件夹下创建Configure.xml <?xml version="1.0" encoding="UTF-8"?> < ...