MyBatis框架(一)
MyBatis介绍:
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
使用步骤:
创建项目,导入Ojdbc.jar包和mybatis**.jar包,
设置数据库的信息的属性:
jdbc.username=test jdbc.password=test jdbc.url=jdbc:oracle:thin:@localhost:1521:xe jdbc.driver=oracle.jdbc.OracleDriver
配置mybatis的总配置文件: mybatis-config.xml:
格式:
配置根标签
<!-- 根标签 -->
<configuration>
<!--
引入属性文件
属性文件通常写数据库连接的信息
username(注意一个问题, 属性文件中不要单独写一个username)
password
url
driverClass
-->
<property resource="属性文件所在src下的位置" />
<!-- 或者直接定义属性值 -->
<properties>
<property name="jdbc.username" value="test" />
<property name="jdbc.password" value="test" />
<property name="jdbc.driverClassName" value="oracle.jdbc.OracleDriver" />
<property name="jdbc.url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
</properties>
<!-- 为实体类定义一个别名, 如果不定义别名, 在映射文件中就要写这个实体类的全路径名 -->
<typeAliases>
<!-- 这个写法取的别名是随意的, 可以自己任意定义 -->
<!-- <typeAlias type="类名的全路径名" alias="别名"></typeAlias> -->
<!-- 如果使用下面这个写法, 就是按照mybatis自己定义的规则, 这个包下的所有类的类名就是别名 -->
<package name="com.model"/>
<!-- 使用package标签实际是默认扫描model包下的所有的类, 如果在实体类的定义了注解@Alias(value = "..."), 则优先使用注解 -->
</typeAliases>
<!-- 配置mybatis的运行环境们 -->
<environments default="所使用的环境的标签id">
<environment id="default">
<!--
配置事务管理器的类型
JDBC
MANAGED--(托管, 商业服务器上才有的功能, Tomcat没有)
-->
<transactionManager type="JDBC" />
<!--
POOLED(基于连接池的数据源)
UNPOOLED(使用普通的数据库连接)
JNDI(使用应用服务器上的JNDI连接配置数据源, 很少使用)
-->
<dataSource type="POOLED">
<property name="username" value="${属性文件中配置的信息}"></property>
<property name="password" value="${属性文件中配置的信息}"></property>
<property name="url" value="${属性文件中配置的信息}"></property>
<property name="driver" value="${属性文件中配置的信息}"></property>
</dataSource>
</envirment>
</environments>
<mappers>
<!-- 挨个写明每个映射文件所在的位置 -->
<mapper resource="src下mapper映射文件的全路径名">
<!-- 写明每个映射文件所对应的接口的限定名, package引入的文件一定是接口,
所以如果使用这种方式, 必须是使用接口对应映射文件的方式 -->
<package name="接口所在的包" />
</mappers>
</configuration>
实例:
<?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>
<typeAliases>
<package name="model"/>
</typeAliases>
<environments default="hanqi">
<environment id="hanqi">
<!--
JDBC:
MANAGED:托管
-->
<transactionManager type="JDBC" />
<!--
配置数据库源
POOLED: 连接池
UNPOOLED: 非连接池
JNDI: 使用应用服务器上的数据库连接
-->
<dataSource type="POOLED">
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="url" value="${jdbc.url}"/>
<property name="driver" value="${jdbc.driver}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml" />
</mappers>
</configuration>
新建每个实体类的映射文件...Mapper.xml:
<!-- 定义每个实体类的映射文件 -->
<mapper namespace="唯一的id / 接口的全路径名">
<select id="被调用的id(唯一) / 需要执行的方法名"></select>
<insert></insert>
<update></update>
<delete></delete>
</mapper>
resultType: 类的全路径名 / 定义好的别名
resultMap: 指定返回结果的集合
parameterType: 指的是, 进行查询的时候所需要的参数类型
<?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">
<mapper namespace="UserMapper">
<resultMap type="user" id="UserList">
<result property="id" column="id" />
<result property="uname" column="uname" />
<result property="upassword" column="upassword" />
</resultMap>
<select id="selectUser" resultType="user">
select * from p_user
</select>
<select id="selectOneUser" parameterType="Integer" resultMap="UserList">
select * from p_User u where u.id=#{id}
</select>
<insert id="insertUser" parameterType="user" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into p_User values(test1.nextval,#{uname},#{upassword})
</insert>
<update id="updateUser" parameterType="Map">
update p_User u set u.uname=#{uname},u.upassword=#{upassword} where u.id=#{id}
</update>
<delete id="deleteUser" parameterType="Map">
delete p_user u where u.id=#{id}
</delete>
</mapper>
MyBatis工具类:
1, 构建SqlSessionFactory
InputStream in = Resources.getResourceAsStream("总配置文件所在的src下的路径");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
2, 构建SqlSession(注意SqlSession不能以一个class成员变量的身份被返回)
SqlSession ss = ssf.openSession();
3, 直接运行
a: 直接运行映射文件中的sql语句
ss.select...
ss.insert...
ss.update...
ss.delete...
b: 使用接口映射配置文件
ss.getMapper(接口类名.class);
调用接口的方法
package util;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtil {
private static SqlSessionFactory sqlSessionFactory;
private static SqlSession sqlSession;
public static void main(String[] args) {
System.out.println(getSqlSession());
}
public static void getSqlSessionFactory(){
String path="mybatis-config.xml";
try {
InputStream in=Resources.getResourceAsStream(path);
sqlSessionFactory =new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
SqlSession sqlSession=null;
if(sqlSession==null){
getSqlSessionFactory();
}
sqlSession=sqlSessionFactory.openSession();
return sqlSession;
}
public static void destory(SqlSession sqlSession){
sqlSession.commit();
sqlSession.close();
}
}
创建用户实体类,属性和表的列明相对应:
package model;
import org.apache.ibatis.type.Alias;
//别名
@Alias("user")
public class User {
private Integer id;
private String uname;
private String upassword;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpassword() {
return upassword;
}
public void setUpassword(String upassword) {
this.upassword = upassword;
}
@Override
public String toString() {
return "User [id=" + id + ", uname=" + uname + ", upassword=" + upassword + "]";
}
}
测试:
package test;
import static org.junit.Assert.*;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import model.User;
import util.MyBatisUtil;
public class JUTest {
private SqlSession ss;
@Before
public void setUp() throws Exception {
ss = MyBatisUtil.getSqlSession();
}
@After
public void tearDown() throws Exception {
MyBatisUtil.destory(ss);
}
@Test
public void test() {
//查询
//List<User> list=ss.selectList("UserMapper.selectUser");
//指定查询
//List<User> list1=ss.selectList("UserMapper.selectOneUser",1);
//增加
User u=new User();
u.setId(null);
u.setUname("ccc");
u.setUpassword("ccc");
int a = ss.insert("UserMapper.insertUser", u);
//修改
/*Map<String, Object> map = new HashMap<String, Object>();
map.put("id", 10);
map.put("uname", "233");
map.put("upassword", "123");
int a = ss.update("UserMapper.updateUser", map);*/
//删除
/*Map<String, Integer> map = new HashMap<String,Integer>();
map.put("id",113);
int a=ss.delete("UserMapper.deleteUser", map);*/
System.out.println(a);
}
}
p_user表:
prompt PL/SQL Developer import file
prompt Created on 2017年9月19日 by Administrator
set feedback off
set define off
prompt Dropping P_USER...
drop table P_USER cascade constraints;
prompt Creating P_USER...
create table P_USER
(
id NUMBER not null,
uname ) not null,
upassword ) not null
)
tablespace SYSTEM
pctfree
pctused
initrans
maxtrans
storage
(
initial 64K
next 1M
minextents
maxextents unlimited
);
alter table P_USER
add constraint PK_USER primary key (ID)
using index
tablespace SYSTEM
pctfree
initrans
maxtrans
storage
(
initial 64K
next 1M
minextents
maxextents unlimited
);
prompt Disabling triggers for P_USER...
alter table P_USER disable all triggers;
prompt Loading P_USER...
insert into P_USER (id, uname, upassword)
, ');
insert into P_USER (id, uname, upassword)
, ');
insert into P_USER (id, uname, upassword)
, ');
insert into P_USER (id, uname, upassword)
, 'ccc', 'ccc');
insert into P_USER (id, uname, upassword)
, ');
insert into P_USER (id, uname, upassword)
, ');
insert into P_USER (id, uname, upassword)
, ');
insert into P_USER (id, uname, upassword)
, ');
insert into P_USER (id, uname, upassword)
, ');
insert into P_USER (id, uname, upassword)
, ');
insert into P_USER (id, uname, upassword)
, ');
insert into P_USER (id, uname, upassword)
, ');
insert into P_USER (id, uname, upassword)
, ');
insert into P_USER (id, uname, upassword)
, 'ccc', 'ccc');
insert into P_USER (id, uname, upassword)
, 'ccc', 'ccc');
commit;
prompt records loaded
prompt Enabling triggers for P_USER...
alter table P_USER enable all triggers;
set feedback on
set define on
prompt Done.
MyBatis框架(一)的更多相关文章
- Mybatis框架的多对一关联关系(六)
一.一对多的关联映射 一对多关联查询多表数据 1接口 public interface IDeptDAO { //根据部门编号查询该部门单个查询 public Emp getEmpById(Integ ...
- Spring+SpringMvc+Mybatis框架集成搭建教程
一.背景 最近有很多同学由于没有过SSM(Spring+SpringMvc+Mybatis , 以下简称SSM)框架的搭建的经历,所以在自己搭建SSM框架集成的时候,出现了这样或者那样的问题,很是苦恼 ...
- Mybatis框架中实现双向一对多关系映射
学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢 ...
- Hibernate框架与Mybatis框架的对比
学习了Hibernate和Mybatis,但是一直不太清楚他们两者的区别的联系,今天在网上翻了翻,就做了一下总结,希望对大家有帮助! 原文:http://blog.csdn.net/firejuly/ ...
- 初识Mybatis框架,实现增删改查等操作(动态拼接和动态修改)
此第一次接触Mybatis框架确实是有点不适应,特别是刚从Hibernate框架转转型过来,那么为什么要使用Mybatis框架,Mybatis框架和Hibernate框架又有什么异同呢? 这个问题在我 ...
- Spring+MyBatis框架中sql语句的书写,数据集的传递以及多表关联查询
在很多Java EE项目中,Spring+MyBatis框架经常被用到,项目搭建在这里不再赘述,现在要将的是如何在项目中书写,增删改查的语句,如何操作数据库,以及后台如何获取数据,如何进行关联查询,以 ...
- SSM框架-----------SpringMVC+Spring+Mybatis框架整合详细教程
1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One ...
- Spring3.0 与 MyBatis框架 整合小实例
本文将在Eclipse开发环境下,采用Spring MVC + Spring + MyBatis + Maven + Log4J 框架搭建一个Java web 项目. 1. 环境准备: 1.1 创建数 ...
- 手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版)
手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版) SSM(Spring+SpringMVC+Mybatis),目前较为主流的企业级架构方案.标准的MVC设计模式, ...
- 详解Java的MyBatis框架中SQL语句映射部分的编写
这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...
随机推荐
- MySQL用户管理:添加用户、授权、删除用户
文章首发于[博客园-陈树义],请尊重原创保留原文链接. 添加用户 以root用户登录数据库,运行以下命令: create user zhangsan identified by 'zhangsan'; ...
- JsonArray和JsonObject遍历方法
一:遍历JsonArray String str = "[{name:'a',value:'aa'},{name:'b',value:'bb'},{name:'c',value:'cc'}, ...
- find the Nth highest salary(寻找第N高薪水)
Suppose that you are given the following simple database table called Employee that has 2 columns na ...
- js排序与重组
前几天同学发给我一个问题,思路想整理一下,也供大家参考.实际上这道题本质就是考察的是去重与排序的问题.好了闲话少说,上题. function input(req){ if(req<=10 ...
- 面试 | 商汤科技面试经历之Promise红绿灯的实现
说在前面 说实话,刚开始在听到这个面试题的实话,我是诧异的,红绿灯?这不是单片机.FPGA.F28335.PLC的实验吗?! 而且还要用Promise去写,当时我确实没思路,只好硬着头皮去写,下来再r ...
- 微信小程序结合后台数据管理实现商品数据的动态展示、维护
微信小程序给我们提供了一个很好的开发平台,可以用于展现各种数据和实现丰富的功能,本篇随笔介绍微信小程序结合后台数据管理实现商品数据的动态展示.维护,介绍如何实现商品数据在后台管理系统中的维护管理,并通 ...
- [2012-05-31]awk记录分割符RS
$awk -v RS= '{print $1}' test RS 默认值为\n 换行符. 此处设置RS= 等效于 RS="" 代表一个空行 (若理解有误请指正,在以下例子中符合) ...
- selenium实战学习第一课
#-*- coding:utf-8 -*- __author__ = "carry" from selenium import webdriver from selenium.we ...
- Personal Learning Path of Java——初识Java
初识Java 在我个人看来,Java是一门高大上的面向编程语言,这也是Java吸引我的地方.在自学Java之前,我在学校大概学过了一些C语言的知识,在学校学的那点C语言纯属是拿来打基础用的,大概了解了 ...
- 对The C programming language一书第6.6节代码的理解
代码如下(基本与书中一致) 1 #include <stdio.h> 2 #include <string.h> 3 #include <ctype.h> 4 #i ...