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 文件 ...
随机推荐
- noip普及组2007 奖学金
奖学金 描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果两个同学总分相同,再按语文成绩 ...
- java程序给short变量赋0xff报异常
在java程序中以二进制或十六进制表示的数比如0x01默认类型为int.所以付给short类型时要强制类型转换. short q = (short) 0b1111111111111111; Syste ...
- 使用angular4搭建博客(一)
本文长期更新,未经运行,严禁转载. 博客(制作中) http://101.200.58.228/ Github https://github.com/Teloi/TEIndex 框架选择 Angula ...
- 怎么检测JDK环境变量是否配置正确
怎么检测JDK环境变量是否配置正确.. 点击开始--运行--输入cmd,点击确定. 在命令行窗口输入java 然后Enter.没有出现java既不是内部命令也不是外部命令.说明配置是正确的. 在命令 ...
- Properties类随笔
1. 体系介绍 Properties类继承自HashTable,勉强属于集合框架体系一员,键值对形式存储数据,当然键肯定是唯一的,底层哈希表保证键的唯一,此类一般用于表示配置文件. 2. 基本用法 由 ...
- LF模式是个坑,ZeroIce中间件让你体会这个痛
LF模式是个坑,一个小小的失误就可能使你的网络处理瘫痪,Ice就很好地展现了出来,换句话说,Ice中间件或是LF模式就是一个坑,如果你一不小心. LF模式的官方论文中,论述了此模式用于高性能网络并发模 ...
- tomcat设置文件编码
tomcat修改bin文件夹下面的catalina.bat文件可以解决乱码在文件中加上JAVA_OPTS="-server -Xms128M -Xmx4096M -XX:PermSize=5 ...
- Ext.data.Store添加动态参数
多条件查询页面的参数都是动态的,并且我们通常还会有默认加载页面.此时,动态添加参数非常重要,其中baseparam是解决问题的关键. @ 将查询条件定义为一个全局变量 var param_01 = & ...
- Tornado模板
--------------------静态文件-------------------- 1.static_path:通过向web.Application类的构造函数传递一个名为static_path ...
- 单表ORM框架
基本描述 1.首先是一个单表的ORM框架,多表连接查询请使用视图或者使用SqlHelper查询,然后转换成实体集合. 2.目前仅完成基本结构和MySQL部分. 3.目前欠缺Lambda表达式解析,所以 ...