视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
mybatis操作oracle数据库主键自增(触发器)
2020-11-09 15:49:31 责编:小采
文档


首先我们看对于同一张student表,对于mysql,sql server,oracle中它们都是怎样创建主键的 在mysql中 create table Student( Student_ID int(6) NOT NULL PRIMARY KEY AUTO_INCREMENT, Student_Name varchar(10) NOT NULL, Student_Age int(2) NOT NULL);ins

首先我们看对于同一张student表,对于mysql,sql server,oracle中它们都是怎样创建主键的

在mysql中

create table Student(
 Student_ID int(6) NOT NULL PRIMARY KEY AUTO_INCREMENT,
 Student_Name varchar(10) NOT NULL,
 Student_Age int(2) NOT NULL
);

insert into student(student_name,student_age) values('zhangsan',20);

在sql server中

create table Student(
 Student_ID int primary key identity(1,1),
 Student_Name varchar2(10) NOT NULL,
 Student_Age number(2) NOT NULL
);
insert into student(student_name,student_age) values('zhangsan',20);

在oracle中
create table Student(
 Student_ID number(6) NOT NULL PRIMARY KEY,
 Student_Name varchar2(10) NOT NULL,
 Student_Age number(2) NOT NULL
);

而oracle如果想设置主键自增长,则需要创建序列

CREATE SEQUENCE student_sequence 
INCREMENT BY 1
NOMAXVALUE
NOCYCLE
CACHE 10;

insert into Student values(student_sequence.nextval,'aa',20);
如果使用了触发器的话,就更简单了
create or replace trigger student_trigger
 before insert on student 
 for each row
begin
 select student_sequence.nextval into :new.student_id from dual;
end student_trigger;
/
此时插入的时候触发器会帮你插入id
insert into student(student_name,student_age) values('wangwu',20);

至此,mysql,sql server,oracle中怎样创建表中的自增长主键都已完成。看一看出oracle的主键自增较mysql和sql sever要复杂些,mysql,sqlserver配置好主键之后,插入时,字段和值一一对应即可,数据库就会完成你想做的,但是在oracle由于多了序列的概念,那么oracle怎样实现主键自增呢?且看下文

首先是mybatis框架的配置文件

jdbc.properties文件

username=go
password=go
url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
driver=oracle.jdbc.driver.OracleDriver

mybatis-config.xml文件


	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	

对应的实体类Student无变化,参考hibernate操作oracle数据库 主键自增

http://blog.csdn.net/thepeakofmountain/article/details/17173715

对应的Student.xml文件


	
 
 select student_sequence.nextval from dual
 
如果未使用触发器,请保留该注释
--!>
 insert into student(student_id,student_name,student_age) values(#{student_id},#{student_name},#{student_age})
 
	
	

	
	
	
	update student set student_name=#{student_name},student_age=#{student_age} where student_id=#{student_id}
	
	
	

测试类
public class TestMybatis {
	
	@Test
	public void testAdd() { //为原始的获取配置文件,自己创建session,一步一步走的
	try {
	InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
	SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);

	SqlSession session = factory.openSession();
	Student u = new Student();
	u.setStudent_name("sunwukong");
	u.setStudent_age(50);
	session.insert("com.bean.Student.add", u);
	session.commit();
	session.close();
	} catch (IOException e) {
	e.printStackTrace();
	}
	}
	
	@Test
	public void testUpdate(){
	SqlSession session = null;
	try {
	session = MyBatisUtil.createSession();
	Student stu = new Student();
	stu.setStudent_id(11);
	stu.setStudent_name("bajie");
	stu.setStudent_age(20);
	session.update(Student.class.getName()+".update", stu);
	session.commit();
	session.close();
	} catch (Exception e) {
	// TODO: handle exception
	e.printStackTrace();
	}
	}
	
	/*@Test
	public void testDelete() {
	SqlSession session= null;
	try {
	session = MyBatisUtil.createSession();
	session.delete(Student.class.getName()+".delete",105);
	session.commit();
	session.close();
	} catch (IOException e) {
	e.printStackTrace();
	}
	}*/
	
	@Test
	public void testLoad() {
	SqlSession session = null;
	try{
	session = MyBatisUtil.createSession();
	Student u = (Student)session.selectOne(Student.class.getName()+".load", 11);
	System.out.println(u.getStudent_name());
	} finally {
	MyBatisUtil.closeSession(session);
	}
	}
	
	@Test
	public void testList() {
	SqlSession session = null;
	try{
	session = MyBatisUtil.createSession();
	List us = session.selectList(Student.class.getName()+".list", null);
	System.out.println(us.size());
	} finally {
	MyBatisUtil.closeSession(session);
	}
	}
}
工厂类MyBatisUtil
public class MyBatisUtil {
	public static SqlSessionFactory factory;
	static {
	try {
	InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
	factory = new SqlSessionFactoryBuilder().build(is);
	} catch (IOException e) {
	e.printStackTrace();
	}
	}
	
	public static SqlSession createSession() {
	return factory.openSession();
	}
	
	public static void closeSession(SqlSession session) {
	if(session!=null) session.close();
	}
}

小结:mybatis+oracle主键自增实现的核心,就插入来说,就是先从序列中查找一个序列值,然后插入到对应的表中,也就是分两步走

先select student_sequence.nextval from dual

后insert into student(student_id,student_name,student_age) values(#{student_id},#{student_name},#{student_age})

比较hibernate和mybatis,实现oracle主键自增都是需要两步,而在hibernate中无论是注解版还是非注解版,都需要将id字段映射到创建的序列名上。

补充:mybatis框架导入的jar包为mybatis-3.3.2.jar版本,junit为junit-4.5.jar,连接oracle的jar包ojdbc14.jar,其中MyBatisUtil.java文件其实是一个创建简单工厂模式,如果有兴趣,可以看看设计模式方面的书

对于我来说,还是喜欢用sql语句,感觉更原始,更清楚的知道自己在干什么,当然越底层,效率的话,肯定是mybatis高一些,但是现在还是hibernate用的多吧,当然只是我一家之言,欢迎与各路朋友探讨相关问题。


如果文章有什么错误或者有什么建议,欢迎提出,大家共同交流,一起进步

下载本文
显示全文
专题