Mybatis学习(1)
一、原生态jdbc程序存在的问题:
mybatis框架原理、执行过程:
二、入门程序
完成入门程序的以下需求:
1)环境搭建:
mybatis下载地址:https://github.com/mybatis/
导入jar包,工程结构:
关于配置文件的配置:
/mybatis/config/log4j.properties:开发环境设置成debug:
- # Global logging configuration
- log4j.rootLogger=DEBUG, stdout
- # Console output...
- log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
/mybatis/config/db.properties:
- jdbc.driver=com.mysql.jdbc.Driver
- jdbc.url=jdbc:mysql://localhost:3306/mybatis
- jdbc.username=root
- jdbc.password=root
数据库配置
/mybatis/config/SqlMapConfig.xml:mybatis配置文件
这里的是mybatis独立运行的配置,并没有整合:
- <?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中还可以配置一些属性名和属性值 -->
- <!-- <property name="jdbc.driver" value=""/> -->
- </properties>
- <!-- 和spring整合后 environments配置将废除-->
- <environments default="development">
- <environment id="development">
- <!-- 使用jdbc事务管理,事务控制由mybatis-->
- <transactionManager type="JDBC" />
- <!-- 数据库连接池,由mybatis管理-->
- <dataSource type="POOLED">
- <property name="driver" value="${jdbc.driver}" />
- <property name="url" value="${jdbc.url}" />
- <property name="username" value="${jdbc.username}" />
- <property name="password" value="${jdbc.password}" />
- </dataSource>
- </environment>
- </environments>
- <!-- 加载 映射文件 -->
- <mappers>
- <mapper resource="sqlmap/User.xml"/>
- </mappers>
- </configuration>
POJO类:/mybatis/src/com/cy/po/User.java:
- package com.cy.po;
- import java.util.Date;
- public class User {
- //属性名和数据库表的字段对应
- private int id;
- private String username;// 用户姓名
- private String sex;// 性别
- private Date birthday;// 生日
- private String address;// 地址
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getSex() {
- return sex;
- }
- public void setSex(String sex) {
- this.sex = sex;
- }
- public Date getBirthday() {
- return birthday;
- }
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
- public String getAddress() {
- return address;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- @Override
- public String toString() {
- return "------->> User [id=" + id + ", username=" + username + ", sex=" + sex
- + ", birthday=" + birthday + ", address=" + address + "]";
- }
- }
User实体类
User.xmlp配置statement:增、删、改、查
/mybatis/config/sqlmap/User.xml:
- <?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">
- <!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
- 注意:使用mapper代理方法开发,namespace有特殊重要的作用
- -->
- <mapper namespace="test">
- <!-- =============================================================================== -->
- <!-- 在 映射文件中配置很多sql语句 -->
- <!-- 需求:通过id查询用户表的记录 -->
- <!-- 通过 select执行数据库查询
- id:标识 映射文件中的 sql
- 将sql语句封装到mappedStatement对象中,所以将id称为statement的id
- parameterType:指定输入 参数的类型,这里指定int型
- #{}表示一个占位符号
- #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称
- resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。
- -->
- <select id="findUserById" parameterType="int" resultType="com.cy.po.User">
- SELECT * FROM USER WHERE id=#{value}
- </select>
- <!-- =============================================================================== -->
- <!-- 根据用户名称模糊查询用户信息,可能返回多条
- resultType:指定就是单条记录所映射的java对象 类型
- ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。
- 使用${}拼接sql,引起 sql注入
- ${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value
- -->
- <select id="findUserByName" parameterType="java.lang.String" resultType="com.cy.po.User">
- SELECT * FROM USER WHERE username LIKE '%${value}%'
- </select>
- <!-- =============================================================================== -->
- <!-- 添加用户
- parameterType:指定输入 参数类型是pojo(包括 用户信息)
- #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值
- -->
- <insert id="insertUser" parameterType="com.cy.po.User">
- <!--
- 自增主键的返回:
- 将插入数据的主键返回,返回到user对象中
- SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用与自增主键
- keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性
- order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序
- resultType:指定SELECT LAST_INSERT_ID()的结果类型
- -->
- <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
- SELECT LAST_INSERT_ID()
- </selectKey>
- <!--
- 非自增主键返回(使用UUID())
- 使用mysql的uuid()生成主键 (需要修改表中id字段类型为String,长度设置成35位)
- 执行思路:
- 首先通过uuid()得到主键,将主键输入到sql语句中。
- 执行uuid()语句顺序相对于insert语句之前执行。
- -->
- <!-- <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
- SELECT uuid()
- </selectKey>
- insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address}) -->
- <!--通过oracle的序列,生成主键:-->
- <!-- <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
- SELECT 序列名.nextval()
- </selectKey>
- insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address}) -->
- insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
- </insert>
- <!-- =============================================================================== -->
- <!-- 根据id删除 用户,需要输入 id值-->
- <delete id="deleteUser" parameterType="java.lang.Integer">
- delete from user where id=#{id}
- </delete>
- <!-- =============================================================================== -->
- <!-- 根据id更新用户
- 分析:
- 需要传入用户的id
- 需要传入用户的更新信息
- parameterType指定user对象,包括 id和更新信息,注意:id必须存在
- #{id}:从输入 user对象中获取id属性值
- -->
- <update id="updateUser" parameterType="com.cy.po.User">
- update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
- where id=#{id}
- </update>
- </mapper>
测试增删改查的Test代码:
- package com.cy.first;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Date;
- import java.util.List;
- import org.apache.ibatis.io.Resources;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
- import org.junit.Test;
- import com.cy.po.User;
- public class MybatisFirst {
- /* ---------------------------------------------------------------------------------*/
- // 根据id查询用户信息,得到一条记录结果
- @Test
- public void findUserByIdTest() throws IOException {
- // mybatis配置文件
- String resource = "SqlMapConfig.xml";
- // 得到配置文件流
- InputStream inputStream = Resources.getResourceAsStream(resource);
- // 创建会话工厂,传入mybatis的配置文件信息
- SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- // 通过工厂得到SqlSession
- SqlSession sqlSession = sqlSessionFactory.openSession();
- // 通过SqlSession操作数据库
- // 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id
- // 第二个参数:指定和映射文件中所匹配的parameterType类型的参数
- // sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象
- // selectOne查询出一条记录
- User user = sqlSession.selectOne("test.findUserById", 1);
- System.out.println(user);
- // 释放资源
- sqlSession.close();
- }
- /* ---------------------------------------------------------------------------------*/
- // 根据用户名称模糊查询用户列表
- @Test
- public void findUserByNameTest() throws IOException {
- // mybatis配置文件
- String resource = "SqlMapConfig.xml";
- // 得到配置文件流
- InputStream inputStream = Resources.getResourceAsStream(resource);
- // 创建会话工厂,传入mybatis的配置文件信息
- SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- // 通过工厂得到SqlSession
- SqlSession sqlSession = sqlSessionFactory.openSession();
- // list中的user和映射文件中resultType所指定的类型一致
- List<User> list = sqlSession.selectList("test.findUserByName", "小明");
- System.out.println(list);
- sqlSession.close();
- }
- /* ---------------------------------------------------------------------------------*/
- // 添加用户信息
- @Test
- public void insertUserTest() throws IOException {
- String resource = "SqlMapConfig.xml";
- InputStream inputStream = Resources.getResourceAsStream(resource);
- SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- SqlSession sqlSession = sqlSessionFactory.openSession();
- // 插入用户对象
- User user = new User();
- user.setUsername("王小军");
- user.setBirthday(new Date());
- user.setSex("1");
- user.setAddress("河南郑州");
- sqlSession.insert("test.insertUser", user);
- // 提交事务
- sqlSession.commit();
- // 获取用户信息主键
- System.out.println("user id: " + user.getId());
- // 关闭会话
- sqlSession.close();
- }
- /* ---------------------------------------------------------------------------------*/
- // 根据id删除 用户信息
- @Test
- public void deleteUserTest() throws IOException {
- String resource = "SqlMapConfig.xml";
- InputStream inputStream = Resources.getResourceAsStream(resource);
- SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- SqlSession sqlSession = sqlSessionFactory.openSession();
- // 传入id删除 用户
- sqlSession.delete("test.deleteUser", 29);
- sqlSession.commit();
- sqlSession.close();
- }
- /* ---------------------------------------------------------------------------------*/
- // 根据id删除 用户信息
- @Test
- public void updateUserTest() throws IOException {
- String resource = "SqlMapConfig.xml";
- InputStream inputStream = Resources.getResourceAsStream(resource);
- SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- SqlSession sqlSession = sqlSessionFactory.openSession();
- // 更新用户信息
- User user = new User();
- //必须设置id
- user.setId(28);
- user.setUsername("王大军");
- user.setBirthday(new Date());
- user.setSex("2");
- user.setAddress("河南郑州");
- sqlSession.delete("test.updateUser", user);
- sqlSession.commit();
- sqlSession.close();
- }
- }
Juit测试代码
入门程序总结:
1.parameterType和resultType:
parameterType:在映射文件中通过parameterType指定输入 参数的类型。
resultType:在映射文件中通过resultType指定输出结果的类型。
2.#{}和${}:
selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。
selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。
如果使用selectOne报错:
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4
注意点:
1.写xml映射文件,statement的sql insert。select之间的sql语句不要有分号结尾;
Mybatis学习(1)的更多相关文章
- MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作(转载)
本文转载自:http://www.cnblogs.com/jpf-java/p/6013540.html 上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybati ...
- MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合(转载)
孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(八)--Mybatis3.x与Spring4.x整合 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: m ...
- MyBatis学习总结(七)——Mybatis缓存(转载)
孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...
- (原创)mybatis学习二,spring和mybatis的融合
mybatis学习一夯实基础 上文介绍了mybatis的相关知识,这一节主要来介绍mybaits和spring的融合 一,环境搭建 1,jar包下载,下载路径为jar包 2,将包导入到java工程中 ...
- (原创)mybatis学习一,夯实基础
一,what?(是什么) MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可 ...
- MyBatis学习--简单的增删改查
jdbc程序 在学习MyBatis的时候先简单了解下JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: Public static void main(String[] args) ...
- MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
上一篇博文MyBatis学习总结(一)——MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对u ...
- 【Todo】Mybatis学习-偏理论
之前写过好几篇Mybatis相关的文章: http://www.cnblogs.com/charlesblc/p/5906431.html <SSM(SpringMVC+Spring+Myba ...
- MyBatis学习系列三——结合Spring
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...
- MyBatis学习系列二——增删改查
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...
随机推荐
- Android Touch事件之一:Touch事件在父ViewGroup和子View之间的传递篇
2015-11-26 17:00:22 前言:Android的Touch事件传递和View的实现紧密相连,因此理解Touch事件的传递,有助于我们更好的理解View的工作原理. 1. 几个重要的方法: ...
- 2.2 C++类的成员变量和成员函数
参考:http://www.weixueyuan.net/view/6334.html 总结: 类成员的声明和定义: 类成员函数的定义分类内定义(内联)和类外定义(可用 inline 关键字 强制转换 ...
- DevExpress v18.1新版亮点——ASP.NET篇(二)
用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress ASP.NET v18.1 的新功能,快来下载试用新版本!点 ...
- Beta 冲刺(6/7)
前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/10129063.html 作业博客:https://edu.cnblogs.com/campus ...
- iOS开发UI之Quartz2D使用(绘制基本图形)
iOS开发UI篇—Quartz2D使用(绘制基本图形) 一.简单说明 图形上下文(Graphics Context):是一个CGContextRef类型的数据 图形上下文的作用:保存绘图信息.绘图状态 ...
- WEB接口测试之Jmeter接口测试自动化 (一)
软件测试自动化从不同的测试阶段分类,可从下层到上层依次分为单元测试-->接口测试-->界面自动化测试. 单元测试一般有开发人员自行完成,而界面自动化测试合适的测试条件又很难达到,测试人员在 ...
- 动态更新 HTML 内容 —— AJAX
通过 JavaScript 加载数据,在不刷新网页的情况下,更新网页内容的技术,称为 AJAX(Asynchronous JavaScript and XML,异步 JavaScript 和 XML) ...
- uva1482:Playing With Stones (SG函数)
题意:有N堆石子,每次可以取一堆的不超过半数的石子,没有可取的为输. 思路:假设只有一堆,手推出来,数量x可以表示为2^p-1形式的必输. 但是没什么用,因为最后要的不是0和1,而是SG函数:所以必输 ...
- 20155224 2016-2017-2 《Java程序设计》第5周学习总结
20155224 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 第八章 Java中的错误都会被打包为对象,可以尝试(try)捕捉(catch)代表错误的对象 ...
- AngularJS的简单订阅发布模式例子
控制器之间的交互方式广播 broadcast, 发射 emit 事件 类似于 js中的事件 , 可以自己定义事件 向上传递直到 document 在AngularJs中 向上传递直到 rootScop ...