1 mybatis框架介绍

1.1回顾jdbc操作数据库的过程

1.2 mybatis开发步骤

A.提供一个SqlMapperConfig.xml(src目录下),该文件主要配置数据库连接,事务,二级缓存。

B.提供一个XxxMapper.xml(DeptMapper.xml),放入和DeptDao同一个包中。

Sql语句

Sql语句占位符的值

Sql语句执行后需要返回的结果类型

C.使用mybatis提供的API操作数据库。

Mybatis完成对jdbc的封装,将操作数据过程需要的参数,封装到xml文件中,做到了可变的参数和不可变的代码的之间的解耦合,提高数据库开的效率。

2 Mybatis对数据的CRUD

2.1新建项目加入jar包

2.2建立Mybatis的主配置文件

必须放入src目录(classpath)

MyBatis.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>
<properties resource="db.properties"></properties>
<environments default="deptEnv">
<environment id="deptEnv">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/guangsoft/mapper/DeptMapper.xml" />
</mappers>
</configuration>

db.properties

 driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/test
username = root
password =root

2.3建立部门的实体类

 package org.guangsoft.entity;

 public class Dept
{
private Integer did;
private String dname;
public Integer getDid()
{
return did;
}
public void setDid(Integer did)
{
this.did = did;
}
public String getDname()
{
return dname;
}
public void setDname(String dname)
{
this.dname = dname;
} }

2.4建立DeptMapper接口

 package org.guangsoft.mapper;

 import java.util.List;

 import org.guangsoft.entity.Dept;

 public interface DeptMapper
{
public void saveDept(Dept dept);
public void deleteDept(Integer did);
public void updateDept(Dept dept);
public Dept getDeptById(Integer did);
public List<Dept> getAllDepts();
public Integer getDeptCount();
}

2.5建立DeptMapperImpl实现类

使用Mybatis的API完成数据库添加

 package org.guangsoft.mapper.impl;

 import java.util.List;

 import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.guangsoft.entity.Dept;
import org.guangsoft.mapper.DeptMapper; public class DeptMapperImpl implements DeptMapper
{ @Override
public void saveDept(Dept dept)
{
//创建sqlSessionFactory对象
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class.
getClassLoader().getResourceAsStream("MyBatis.xml"));
//产生SqlSesion兑现
SqlSession sqlSession = ssf.openSession();
//进行数据的crud操作
sqlSession.insert("dept.saveDept",dept);
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
} @Override
public void deleteDept(Integer did)
{
//创建sqlSessionFactory对象
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class.
getClassLoader().getResourceAsStream("MyBatis.xml"));
//产生SqlSesion兑现
SqlSession sqlSession = ssf.openSession();
//进行数据的crud操作
int rows = sqlSession.delete("dept.deleteDept",did);
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
} @Override
public void updateDept(Dept dept)
{
//创建sqlSessionFactory对象
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class.
getClassLoader().getResourceAsStream("MyBatis.xml"));
//产生SqlSesion兑现
SqlSession sqlSession = ssf.openSession();
//进行数据的crud操作
int rows = sqlSession.update("dept.updateDept",dept);
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
} @Override
public Dept getDeptById(Integer did)
{
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class.getClassLoader().getResourceAsStream("MyBatis.xml"));
//获取数据库会话
SqlSession session = ssf.openSession();
//进行数据库查询操作
Dept dept = session.selectOne("dept.getDeptById",did);
//释放资源
session.close();
return dept;
} @Override
public List<Dept> getAllDepts()
{
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class.getClassLoader().getResourceAsStream("MyBatis.xml"));
//获取数据库会话
SqlSession session = ssf.openSession();
//进行数据库查询操作
List<Dept> deptList = session.selectList("dept.getAllDepts");
//释放资源
session.close();
return deptList;
} @Override
public Integer getDeptCount()
{
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class.getClassLoader().getResourceAsStream("MyBatis.xml"));
//获取数据库会话
SqlSession session = ssf.openSession();
//进行数据库查询操作
int count = session.selectOne("dept.getDeptCount");
//释放资源
session.close();
return count;
} }

2.6建立映DeptMapper.xml射文件

和Mapper接口放入同一个包,而且和Mapper接口的名字一样。

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dept">
<insert id="saveDept" parameterType="org.guangsoft.entity.Dept">
insert into dept(did,dname) values (null,#{dname})
<selectKey keyColumn="did" keyProperty="did" resultType="java.lang.Integer">
<!-- 获得增加的记录的id -->
select last_insert_id()
</selectKey>
</insert>
<delete id="deleteDept" parameterType="java.lang.Integer">
delete from dept where did = #{did};
</delete>
<update id="updateDept" parameterType="org.guangsoft.entity.Dept">
update dept set dname = #{dname} where did=#{did}
</update>
<select id="getDeptById" parameterType="java.lang.Integer"
resultType="org.guangsoft.entity.Dept">
select * from dept where did = #{did}
</select>
<select id="getAllDepts" resultType="org.guangsoft.entity.Dept">
select * from dept
</select>
<select id="getDeptCount" resultType="java.lang.Integer">
select count(*) from dept
</select>
</mapper>

2.7建立数据库表

新建数据库,新建表:

 /*
Navicat MySQL Data Transfer Source Server : MySQL
Source Server Version : 50715
Source Host : localhost:3306
Source Database : test Target Server Type : MYSQL
Target Server Version : 50715
File Encoding : 65001 Date: 2016-12-13 20:23:19
*/ SET FOREIGN_KEY_CHECKS=0; -- ----------------------------
-- Table structure for dept
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
`did` int(11) NOT NULL AUTO_INCREMENT,
`dname` varchar(255) DEFAULT NULL,
PRIMARY KEY (`did`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

2.8建立测试类

 package org.guangsoft.test;

 import java.util.List;

 import org.guangsoft.entity.Dept;
import org.guangsoft.mapper.DeptMapper;
import org.guangsoft.mapper.impl.DeptMapperImpl;
import org.junit.Test; public class TestDeptMapper
{
DeptMapper deptMapper = new DeptMapperImpl(); @Test
public void testSaveDept()
{
Dept dept = new Dept();
dept.setDname("sssssdfs");
deptMapper.saveDept(dept);
System.out.println(dept.getDid());
} @Test
public void testDeleteDept()
{
deptMapper.deleteDept(3);
} @Test
public void testUpdateDept()
{
Dept dept = new Dept();
dept.setDid(2);
dept.setDname("update");
deptMapper.updateDept(dept);
} @Test
public void testGetDeptById()
{
Dept dept = deptMapper.getDeptById(2);
System.out.println(dept.getDname());
} @Test
public void testGetAllDepts()
{
List<Dept> deptList = deptMapper.getAllDepts();
for(Dept dept : deptList)
{
System.out.println(dept.getDname());
}
} @Test
public void testGetDeptCount()
{
Integer count = deptMapper.getDeptCount();
System.out.println(count);
}
}

2.9添加日志文件

在src目录下建立,log4j.properties

 # Global logging configuration
log4j.rootLogger=DEBUG, 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 

总结:mybatis框架通过加载配置文件产生一个statement对象,而该对象的引用是通过namespace.id

3 数据选择的Mapper.xml配置参数

3.1 通过添加部门信息学习xml文件中的占位符

3.1.1#{xxx}占位符

相当于jdbc中sql语句预编译.(产生PreparedStatement对象),解决了sql注入的问题,提高安全性。

如果传入的参数为javabean对象占位符#{xxx},

xxx为javabean对象属性对应的get方法

如果为复合的javabean(A.B),

xxx为javabean对象属性链(b.x),相应属性都对应get方法

如果传入的参数为简单类(String,Integer)

xxx为任意值,保持和传入参数名称一样

3.1.2${xxx}占位符

相当于jdbc中的sql语句通过拼接产生(产生Statement对象),存在sql注入的问题

如果传入的参数为javabean对象占位符#{xxx},

xxx为javabean对象属性对应的get方法

如果为复合的javabean(A.B),

xxx为javabean对象属性链(b.x),相应属性都对应get方法

如果传入的参数为简单类(String,Integer)

xxx只能写value

MyBatis之CRUD的更多相关文章

  1. MyBatis:CRUD功能

    在前面已经自动生成了mapper和pojo,接下来我们实现mybatis的CRUD功能,先新建service.controller层的方法. 这里的sid是一个开源的id生成类,写完后,我们还需要在启 ...

  2. Mybatis的CRUD案例

    一.Mybatis增删改查案例 上一节<Mybatis入门和简单Demo>讲了如何Mybatis的由来,工作流程和一个简单的插入案例,本节主要继上一讲完整的展示Mybatis的CRUD操作 ...

  3. 【MyBatis】MyBatis实现CRUD操作

    1.实现基本CRUD功能 使用MyBatis对数据完整的操作,也就是CRUD功能的实现.根据之前的内容,要想实现CRUD,只需要进行映射文件的配置. 范例:修改EmpMapper.xml文件,实现CR ...

  4. SpringBoot 整合 Mybatis 进行CRUD测试开发

    今天来和大家分享下 Spring Boot 整合 MyBatis 的 CRUD 测试方法开发.因为 MyBaits 有两种开发形式,一种基于注解,一种基于 xml . SpringBoot配置文件也有 ...

  5. 基于mybatis的CRUD

    u  基于Mybatis的CRUD u  掌握MyBatis的结果类型-resultMap和resultType u  掌握MyBatis的参数类型 u  掌握#和$两种语法 1      基于myb ...

  6. 05 Mybatis的CRUD操作和Mybatis连接池

    1.CRUD的含义 CRUD是指在做计算处理时的增加(Create).读取(Retrieve)(重新得到数据).更新(Update)和删除(Delete)几个单词的首字母简写.主要被用在描述软件系统中 ...

  7. 03 Mybatis:05.使用Mybatis完成CRUD

    mybatis框架:共四天 明确:我们在实际开发中,都是越简便越好,所以都是采用不写dao实现类的方式.不管使用XML还是注解配置. 第二天:mybatis基本使用 mybatis的单表crud操作 ...

  8. mybatis(CRUD)

    3.mybatis(CRUD) 有了mybatis,我们要对数据库进行增删改查只需要操作接口和mapper.xml文件,然后进行测试就可以了. 实例代码如下: 接口 public interface ...

  9. MyBatis Tutorial – CRUD Operations and Mapping Relationships – Part 1---- reference

    http://www.javacodegeeks.com/2012/11/mybatis-tutorial-crud-operations-and-mapping-relationships-part ...

随机推荐

  1. nyoj 289 苹果 动态规划 (java)

    分析:0-1背包问题 第一次写了一大串, 时间:576  内存:4152 看了牛的代码后,恍然大悟:看来我现在还正处于鸟的阶段! 第一次代码: #include<stdio.h> #inc ...

  2. IE浏览器版本判断

    <script type="text/javascript"> var browser=navigator.appName var b_version=navigato ...

  3. RFM

    前面博客中讲到的聚类,聚类是对客户的一些特征进行分群,属于描述,不涉及客户价值的判断,然而在营销中,其实第一步应该是搞清楚谁才是你的关键客户,哪些用户的价值较高,这就需要用到RFM模型.RFM模型是众 ...

  4. test dword ptr [eax],eax ; probe page. visual studio

    当在函数中申请占用空间很大的数组.结构体时,会产生该问题. 由于局部变量的申请空间存放于栈中,windows里默认栈内存是1M 所以当申请空间大于1M时就会出现溢出错误 通过debug就会进入以下文件 ...

  5. mongodb python image 图像存储读取

    最近做一些数据库调研的工作,目标是实现影像更快的入库.出库.查询,并实现并行访问等操作. 将结果总结成一个mongoImg类,也算是小结吧. ''' Created on 2013-8-6 class ...

  6. Effective Java 读书笔记之六 方法

    一.检查参数的有效性 1.考虑参数有哪些限制,把限制写到文档中,在方法的开头处通过显式地检查来实施这些限制. 二.必要时进行保护性拷贝 1.如果类具有从客户端得到或者返回的可变组件,类就必须考虑保护性 ...

  7. C 语言 typedef

    虽然#define语句看起来象typedef,但实际上却有本质上的差别.对于#define来说,仅在编译前对源代码进行了字符串替换处理:而对于typedef来说,它建立了一个新的数据类型别名.由此可见 ...

  8. BZOJ1012——[JSOI2008]最大数maxnumber

    1.题目大意:求末尾L个数的最大值,强制在线 2.分析:这个拿线段树可以直接水过,然后我写了一个 维护单调栈, 二分求最大值的短代码,手懒.... #include <cstdio> #i ...

  9. GR32 TImage32的图层绘制原理

    转载:http://blog.sina.com.cn/s/blog_491aced20100ded4.html TImage32的继承顺序如下:TCustomControl->TCustomPa ...

  10. linux下编译qt5.6.0静态库——configure配置

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...