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 文件 ...
随机推荐
- Openfire服务器和Spark客户端配置
一.Openfire服务器的配置 关于之前一直在进行的聊天app的项目,我们还没有完成,这次我们介绍一下,Openfire服务器的配置. 1.Openfire下载 Openfire下载地址:http: ...
- 一个基于ES5的vue小demo
由于现在很多vue项目都是基于ES6开发的,而我学vue的时候大多是看vue官网的API,是基于ES5的,所以对于刚接触项目的我来说要转变为项目的模块化写法确实有些挑战.因此,我打算先做一个基于ES5 ...
- linux基础简答(1)
linux基础简答题 扇区及其4个主分区的原因 在第一个扇区中,保存着引导记录和分区信息,容量为512bytes,主引导记录(相当于MBR)446 bytes,分区表64bytes,记录每个分区信息要 ...
- Request常用方法 (总结)
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
- Sublime Text 2安装图解
Sublime Text 2安装图解.. ---------------- ---------------- ---------------- ---------------- ----------- ...
- .net到Java那些事儿--structs做了那些事(二)
一.跟着项目先来看下structs怎么执行的 首先看下web.xml配置文件,下面有如下代码 <filter> <filter-name>struts2</fi ...
- SpringMVC获取页面数据乱码的解决get/post
一.post请求方式的乱码 在web.xml中加入: <filter> <filter-name>CharacterEncodingFilter</filter-name ...
- Servlet与JSP内置对象的对应关系、Servlet获取表单、Servlet路径跳转
项目的根目录指的是webroot: 服务器内部跳转: 或者使用../:“..”代表回到上一级目录
- Tomcat闪退的问题
问题:双击tomcat bin下的startup.bat,tomcat的窗口一闪而过,未成功启动: 原因是:在启动tomcat是,需要读取环境变量和配置信息,缺少了这些信息就会导致了tomcat的闪退 ...
- 浅析HTTP协议的请求报文和响应报文
1.HTTP协议与报文简介 HTTP(hypertext transport protocol),即超文本传输协议.这个协议详细规定了浏览器和万维网服务器之间互相通信的规则. 而客户端与服务端通信时 ...