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:
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 VARCHAR2(20) not null,
- upassword VARCHAR2(20) not null
- )
- tablespace SYSTEM
- pctfree 10
- pctused 40
- initrans 1
- maxtrans 255
- storage
- (
- initial 64K
- next 1M
- minextents 1
- maxextents unlimited
- );
- alter table P_USER
- add constraint PK_USER primary key (ID)
- using index
- tablespace SYSTEM
- pctfree 10
- initrans 2
- maxtrans 255
- storage
- (
- initial 64K
- next 1M
- minextents 1
- 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)
- values (10, '233', '123');
- insert into P_USER (id, uname, upassword)
- values (102, 'aaa', '123');
- insert into P_USER (id, uname, upassword)
- values (103, 'bbb', '456');
- insert into P_USER (id, uname, upassword)
- values (233, 'ccc', 'ccc');
- insert into P_USER (id, uname, upassword)
- values (104, '测试', '456');
- insert into P_USER (id, uname, upassword)
- values (105, '测试', '456');
- insert into P_USER (id, uname, upassword)
- values (106, '测试', '456');
- insert into P_USER (id, uname, upassword)
- values (107, '测试', '456');
- insert into P_USER (id, uname, upassword)
- values (108, '测试', '456');
- insert into P_USER (id, uname, upassword)
- values (109, '测试', '456');
- insert into P_USER (id, uname, upassword)
- values (110, '测试', '456');
- insert into P_USER (id, uname, upassword)
- values (111, '测试', '456');
- insert into P_USER (id, uname, upassword)
- values (112, '测试', '456');
- insert into P_USER (id, uname, upassword)
- values (115, 'ccc', 'ccc');
- insert into P_USER (id, uname, upassword)
- values (116, 'ccc', 'ccc');
- commit;
- prompt 15 records loaded
- prompt Enabling triggers for P_USER...
- alter table P_USER enable all triggers;
- set feedback on
- set define on
- prompt Done.
来源: http://www.cnblogs.com/jiangwz/p/7554029.html