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包,
设置数据库的信息的属性:
1 jdbc.username=test
2 jdbc.password=test
3 jdbc.url=jdbc:oracle:thin:@localhost:1521:xe
4 jdbc.driver=oracle.jdbc.OracleDriver
配置mybatis的总配置文件: mybatis-config.xml:
格式:
1 配置根标签
2 <!-- 根标签 -->
3 <configuration>
4 <!--
5 引入属性文件
6 属性文件通常写数据库连接的信息
7 username(注意一个问题, 属性文件中不要单独写一个username)
8 password
9 url
10 driverClass
11 -->
12 <property resource="属性文件所在src下的位置" />
13
14 <!-- 或者直接定义属性值 -->
15 <properties>
16 <property name="jdbc.username" value="test" />
17 <property name="jdbc.password" value="test" />
18 <property name="jdbc.driverClassName" value="oracle.jdbc.OracleDriver" />
19 <property name="jdbc.url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
20 </properties>
21
22 <!-- 为实体类定义一个别名, 如果不定义别名, 在映射文件中就要写这个实体类的全路径名 -->
23 <typeAliases>
24 <!-- 这个写法取的别名是随意的, 可以自己任意定义 -->
25 <!-- <typeAlias type="类名的全路径名" alias="别名"></typeAlias> -->
26 <!-- 如果使用下面这个写法, 就是按照mybatis自己定义的规则, 这个包下的所有类的类名就是别名 -->
27 <package name="com.model"/>
28 <!-- 使用package标签实际是默认扫描model包下的所有的类, 如果在实体类的定义了注解@Alias(value = "..."), 则优先使用注解 -->
29 </typeAliases>
30
31 <!-- 配置mybatis的运行环境们 -->
32 <environments default="所使用的环境的标签id">
33 <environment id="default">
34 <!--
35 配置事务管理器的类型
36 JDBC
37 MANAGED--(托管, 商业服务器上才有的功能, Tomcat没有)
38 -->
39 <transactionManager type="JDBC" />
40 <!--
41 POOLED(基于连接池的数据源)
42 UNPOOLED(使用普通的数据库连接)
43 JNDI(使用应用服务器上的JNDI连接配置数据源, 很少使用)
44 -->
45 <dataSource type="POOLED">
46 <property name="username" value="${属性文件中配置的信息}"></property>
47 <property name="password" value="${属性文件中配置的信息}"></property>
48 <property name="url" value="${属性文件中配置的信息}"></property>
49 <property name="driver" value="${属性文件中配置的信息}"></property>
50 </dataSource>
51 </envirment>
52 </environments>
53 <mappers>
54 <!-- 挨个写明每个映射文件所在的位置 -->
55 <mapper resource="src下mapper映射文件的全路径名">
56 <!-- 写明每个映射文件所对应的接口的限定名, package引入的文件一定是接口,
57 所以如果使用这种方式, 必须是使用接口对应映射文件的方式 -->
58 <package name="接口所在的包" />
59 </mappers>
60 </configuration>
实例:
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE configuration
3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4 "http://mybatis.org/dtd/mybatis-3-config.dtd">
5 <configuration>
6 <!-- 引入数据库的信息的属性文件 -->
7 <properties resource="db.properties"></properties>
8
9 <typeAliases>
10 <package name="model"/>
11 </typeAliases>
12
13 <environments default="hanqi">
14 <environment id="hanqi">
15 <!--
16 JDBC:
17 MANAGED:托管
18 -->
19 <transactionManager type="JDBC" />
20 <!--
21 配置数据库源
22 POOLED: 连接池
23 UNPOOLED: 非连接池
24 JNDI: 使用应用服务器上的数据库连接
25 -->
26 <dataSource type="POOLED">
27 <property name="username" value="${jdbc.username}"/>
28 <property name="password" value="${jdbc.password}"/>
29 <property name="url" value="${jdbc.url}"/>
30 <property name="driver" value="${jdbc.driver}"/>
31 </dataSource>
32 </environment>
33
34 </environments>
35
36 <mappers>
37 <mapper resource="mapper/UserMapper.xml" />
38 </mappers>
39
40 </configuration>
新建每个实体类的映射文件...Mapper.xml:
<!-- 定义每个实体类的映射文件 --> <mapper namespace="唯一的id / 接口的全路径名"> <select id="被调用的id(唯一) / 需要执行的方法名"></select> <insert></insert> <update></update> <delete></delete> </mapper>
resultType: 类的全路径名 / 定义好的别名 resultMap: 指定返回结果的集合 parameterType: 指的是, 进行查询的时候所需要的参数类型
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper
3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5 <mapper namespace="UserMapper">
6
7 <resultMap type="user" id="UserList">
8 <result property="id" column="id" />
9 <result property="uname" column="uname" />
10 <result property="upassword" column="upassword" />
11 </resultMap>
12
13 <select id="selectUser" resultType="user">
14 select * from p_user
15 </select>
16
17 <select id="selectOneUser" parameterType="Integer" resultMap="UserList">
18 select * from p_User u where u.id=#{id}
19 </select>
20
21 <insert id="insertUser" parameterType="user" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
22 insert into p_User values(test1.nextval,#{uname},#{upassword})
23 </insert>
24
25 <update id="updateUser" parameterType="Map">
26 update p_User u set u.uname=#{uname},u.upassword=#{upassword} where u.id=#{id}
27 </update>
28
29 <delete id="deleteUser" parameterType="Map">
30 delete p_user u where u.id=#{id}
31 </delete>
32
33 </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); 调用接口的方法
1 package util;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5
6 import org.apache.ibatis.io.Resources;
7 import org.apache.ibatis.session.SqlSession;
8 import org.apache.ibatis.session.SqlSessionFactory;
9 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
10
11 public class MyBatisUtil {
12
13 private static SqlSessionFactory sqlSessionFactory;
14 private static SqlSession sqlSession;
15
16 public static void main(String[] args) {
17 System.out.println(getSqlSession());
18 }
19
20 public static void getSqlSessionFactory(){
21 String path="mybatis-config.xml";
22 try {
23 InputStream in=Resources.getResourceAsStream(path);
24 sqlSessionFactory =new SqlSessionFactoryBuilder().build(in);
25
26 } catch (IOException e) {
27 // TODO Auto-generated catch block
28 e.printStackTrace();
29 }
30 }
31
32 public static SqlSession getSqlSession(){
33 SqlSession sqlSession=null;
34 if(sqlSession==null){
35 getSqlSessionFactory();
36 }
37 sqlSession=sqlSessionFactory.openSession();
38 return sqlSession;
39 }
40
41 public static void destory(SqlSession sqlSession){
42 sqlSession.commit();
43 sqlSession.close();
44 }
45 }
创建用户实体类,属性和表的列明相对应:
1 package model;
2
3 import org.apache.ibatis.type.Alias;
4 //别名
5 @Alias("user")
6 public class User {
7 private Integer id;
8 private String uname;
9 private String upassword;
10 public Integer getId() {
11 return id;
12 }
13 public void setId(Integer id) {
14 this.id = id;
15 }
16 public String getUname() {
17 return uname;
18 }
19 public void setUname(String uname) {
20 this.uname = uname;
21 }
22 public String getUpassword() {
23 return upassword;
24 }
25 public void setUpassword(String upassword) {
26 this.upassword = upassword;
27 }
28 @Override
29 public String toString() {
30 return "User [id=" + id + ", uname=" + uname + ", upassword=" + upassword + "]";
31 }
32
33 }
测试:
1 package test;
2
3 import static org.junit.Assert.*;
4
5 import java.util.Date;
6 import java.util.HashMap;
7 import java.util.List;
8 import java.util.Map;
9
10 import org.apache.ibatis.session.SqlSession;
11 import org.junit.After;
12 import org.junit.Before;
13 import org.junit.Test;
14
15 import model.User;
16 import util.MyBatisUtil;
17
18
19 public class JUTest {
20
21 private SqlSession ss;
22
23 @Before
24 public void setUp() throws Exception {
25 ss = MyBatisUtil.getSqlSession();
26 }
27
28 @After
29 public void tearDown() throws Exception {
30 MyBatisUtil.destory(ss);
31 }
32
33 @Test
34 public void test() {
35 //查询
36 //List<User> list=ss.selectList("UserMapper.selectUser");
37
38 //指定查询
39 //List<User> list1=ss.selectList("UserMapper.selectOneUser",1);
40
41 //增加
42 User u=new User();
43 u.setId(null);
44 u.setUname("ccc");
45 u.setUpassword("ccc");
46 int a = ss.insert("UserMapper.insertUser", u);
47
48 //修改
49 /*Map<String, Object> map = new HashMap<String, Object>();
50 map.put("id", 10);
51 map.put("uname", "233");
52 map.put("upassword", "123");
53 int a = ss.update("UserMapper.updateUser", map);*/
54
55 //删除
56 /*Map<String, Integer> map = new HashMap<String,Integer>();
57 map.put("id",113);
58 int a=ss.delete("UserMapper.deleteUser", map);*/
59 System.out.println(a);
60 }
61
62 }
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.
- 神经网络思想建立LR模型(DL公开课第二周答案)
- 如何用卷积神经网络从歌曲中提取纯人声?这里有教程+代码
- 排序算法对比、总结(Python代码)
- 记一道未能答出的算法面试题
- 关于numpy mean函数的axis参数
- 在Keras+TF环境中,用迁移学习和微调做专属图像识别系统
- Tensorflow的LRN是怎么做的
- 存储Tensorflow训练网络的参数
- 用Ansible部署ELK STACK
- 十六个有用的Linux命令行技巧
- keras系列︱深度学习五款常用的已训练模型
- 基于VGG19的识别中国人、韩国人、日本人分类器
- 机器学习算法GBDT的面试要点总结
- 了解、接受和利用Java中的Optional (类)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Android开发重写Animation实现下拉图片后弹射回去效果示例
- Android 中RxPermissions 的使用方法详解
- Android构建Material Design应用详解
- Android中DrawerLayout实现侧滑菜单效果
- Android获取系统储存以及内存信息的方法(一)
- Android开发实现读取excel数据并保存为xml的方法
- 详解Kotlin 中使用和配置 Dagger2
- Android开发使用自定义View将圆角矩形绘制在Canvas上的方法
- Android编程双重单选对话框布局实现与事件监听方法示例
- android调用H5显示加载中效果的示例代码
- Java工作中遇到的问题Method has too many Body parameters的处理办法SpringCloud Feign报错:Method has too many Body par
- Android view滑动悬浮固定效果实现代码示例
- Android编程实现变化的双重选择框功能示例
- Java中使用json存储文件
- Android自定view画圆效果