【MyBatis框架】MyBatis入门程序第二部分

我们通过写一个简单的MyBatis小项目来在实战中学习MyBatis,接着上一篇继续

我们开始实现需求中的添加和删除用户功能

(1)向数据库中添加用户数据
使用User.xml,加入添加用户的sql语句。

<!-- 添加用户
parameterType:指定输入参数类型是pojo(包括用户信息)
#{}中指定POJO的属性名,接收到POJO对象的属性值,mybatis通过OGNL获取对象的属性
-->
<insert id="insertUser" parameterType="cn.edu.hpu.mybatis.PO.User">
	insert into user(username,birthday,sex,address) value(#{username}.#{birthday,jdbcType=DATE}.#{sex},#{address})
</insert>

*注:在字段中有Date和DateTime类型,在插入数据时只要将实体的属性设置成Timestamp就会对应mysql的DateTime类型,Date会对应mysql的Date类型:
#{modified_date,jdbcType=TIMESTAMP}、#{date,jdbcType=DATE}。

测试方法:

//添加用户
	@Test
	public void insertUserTest(){

		//mybatis配置文件
		String resource="SqlMapConfig.xml";

		//将配置文件加载成流
		InputStream inputStream;

		try {

			inputStream = Resources.getResourceAsStream(resource);
			//创建会话工厂,传入mybatis配置文件的信息
			SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

			//通过工厂得到sqlSession
			sqlSession=sqlSessionFactory.openSession();

			//插入用户对象
			User user=new User();
			user.setUsername("李云华");
			user.setBirthday(new Date());
			user.setSex("男");
			user.setAddress("云南大理");
			//通过SqlSession操作数据库
			//第一个参数:映射文件中的statement的Id,等于=namespace+"."+statement的Id
			//第二个参数:指定和映射文件所匹配的parameterType类型的参数
			//sqlSession.selectOne最终结果与你映射文件中所匹配的resultType类型
			sqlSession.insert("test.insertUser",user);

			//提交事务
			sqlSession.commit();

		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			//释放资源
			sqlSession.close();
		}

	}

测试结果:
在数据库中插入了
李云华(String), 2015-06-07(Date), 男(String), 云南大理(String)

输出的日志信息:

DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 30685694.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@1d439fe]
DEBUG [main] - ==>  Preparing: insert into user(username,birthday,sex,address) value(?,?,?,?)
DEBUG [main] - ==> Parameters: 李云华(String), 2015-06-07(Date), 男(String), 云南大理(String)
DEBUG [main] - <==    Updates: 1
DEBUG [main] - Committing JDBC Connection [com.mysql.jdbc.Connection@1d439fe]
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.Connection@1d439fe]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.Connection@1d439fe]
DEBUG [main] - Returned connection 30685694 to pool.

(2)主键返回

a.自增主键的返回
mysql的自增主键,执行insert之前自动生成一个自增主键
通过mysql函数获取到刚插入记录的自增主键
LAST_INSERT_ID
(当插入一个数据后,立即用这个函数就会返回刚加的主键:SELECT LAST_INSERT_ID())

在刚刚的User.xml中这么写:

<!-- 添加用户
parameterType:指定输入参数类型是pojo(包括用户信息)
#{}中指定POJO的属性名,接收到POJO对象的属性值,mybatis通过OGNL获取对象的属性
-->
<insert id="insertUser" parameterType="cn.edu.hpu.mybatis.PO.User">
	<!-- 将插入数据的主键返回,返回到user对象中。
	SELECT_INSERT_ID():得到刚insert进去的主键值,只适用于自增主键
	KeyProperty:将查询到主键值设置到parameterType指定对象的哪个属性。
	order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序
	-->
	<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
		SELECT LAST_INSERT_ID()
	</selectKey>
	insert into user(username,birthday,sex,address) value(#{username},#{birthday,jdbcType=DATE},#{sex},#{address})
</insert>

我们在刚刚的方法后面输出user的ID

//插入用户对象
User user=new User();
user.setUsername("李云华");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("云南大理");
//通过SqlSession操作数据库
//第一个参数:映射文件中的statement的Id,等于=namespace+"."+statement的Id
//第二个参数:指定和映射文件所匹配的parameterType类型的参数
//sqlSession.selectOne最终结果与你映射文件中所匹配的resultType类型
sqlSession.insert("test.insertUser",user);

//提交事务
sqlSession.commit();

System.out.println(user.getId());

结果:6
为啥能得到,就是在配置文件里设置了当insert完成之后就把id取出来存到user对象中

b.非自增主键的返回
使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位。

执行思路:
先通过uuid()查询到主键,将主键输入到sql语句中。

执行uuid()语句顺序相对于insert语句之前执行。

在刚刚的User.xml中这么写:

<!-- 使用MySql的UUID来生成主键
		执行过程:
		首先通过uuid()得到主键,将主键设置到user对象的id属性中
		其次在insert执行时,从user对象中取出id属性值 -->
		<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
			SELECT uuid()
		</selectKey>
		insert into user(id,birthday,sex,address) value(#{id},#{birthday,jdbcType=DATE},#{sex},#{address})

如果使用的数据库是oracle那么通过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,jdbcType=DATE},#{sex},#{address})

测试略

(3)删除和更新用户
映射文件User.xml中添加的语句:

<!-- 删除用户 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
	delete from user where id=#{id}
</delete>

<!-- 更新用户
分析:
需要传入用户的id,需要传入用户的更新信息.
parameterType指定user对象,包括id和更新信息(注意:id必须存在)
#{id}:从输入user对象中获取id属性值-->
<update id="updateUser" parameterType="cn.edu.hpu.mybatis.PO.User">
	update user set username=#{username},birthday=#{birthday,jdbcType=DATE},sex=#{sex},address=#{address}
        where id=#{id}
</update>

测试代码:
删除测试代码:

//删除用户
	@Test
	public void deleteUserTest(){

		//mybatis配置文件
		String resource="SqlMapConfig.xml";

		//将配置文件加载成流
		InputStream inputStream;

		try {

			inputStream = Resources.getResourceAsStream(resource);
			//创建会话工厂,传入mybatis配置文件的信息
			SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

			//通过工厂得到sqlSession
			sqlSession=sqlSessionFactory.openSession();

			//传入id删除用户
			sqlSession.delete("test.deleteUser",6);

			//提交事务
			sqlSession.commit();

		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			//释放资源
			sqlSession.close();
		}

	}
	

测试结果:从数据库删除了id为6的数据

输出日志:

DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 30685694.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@1d439fe]
DEBUG [main] - ==>  Preparing: delete from user where id=?
DEBUG [main] - ==> Parameters: 6(Integer)
DEBUG [main] - <==    Updates: 1
DEBUG [main] - Committing JDBC Connection [com.mysql.jdbc.Connection@1d439fe]
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.Connection@1d439fe]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.Connection@1d439fe]
DEBUG [main] - Returned connection 30685694 to pool.

更新测试代码:

	//更新用户
	@Test
	public void updateUserTest(){

		//mybatis配置文件
		String resource="SqlMapConfig.xml";

		//将配置文件加载成流
		InputStream inputStream;

		try {

			inputStream = Resources.getResourceAsStream(resource);
			//创建会话工厂,传入mybatis配置文件的信息
			SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

			//通过工厂得到sqlSession
			sqlSession=sqlSessionFactory.openSession();

			//更新用户信息(更改id=5的用户数据)
			User user=new User();
			user.setId(5);
			user.setUsername("刘三姐");
			user.setBirthday(new Date());
			user.setSex("女");
			user.setAddress("云南大理");
			sqlSession.update("test.updateUser",user);

			//提交事务
			sqlSession.commit();

		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			//释放资源
			sqlSession.close();
		}

	}

测试结果:
id=5的数据被更新

输出日志:

DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 30685694.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@1d439fe]
DEBUG [main] - ==>  Preparing: update user set username=?,birthday=?,sex=?,address=? where id=?
DEBUG [main] - ==> Parameters: 刘三姐(String), 2015-06-07(Date), 女(String), 云南大理(String), 5(Integer)
DEBUG [main] - <==    Updates: 1
DEBUG [main] - Committing JDBC Connection [com.mysql.jdbc.Connection@1d439fe]
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.Connection@1d439fe]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.Connection@1d439fe]
DEBUG [main] - Returned connection 30685694 to pool.

小结:
a.parameterType
在映射文件中通过parameterType指定输入 参数的类型。

b.resultType
在映射文件中通过resultType指定输出结果的类型。

c.#{}和${}

#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,#{}中可以写成value或其它名称。
#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。
${}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,${}中只能写成value。
${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

d.selectOne和selectList
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

最后来说说hibernate与mybatis,大家如果用过hibernate,刚学mybatis就会很疑惑,mybatis的执行效率并不比hibernate高多少,而且还要多写sql语句,为什么要用它呢?下面来看一下它们的区别,你就会明白mybatis的存在是有一定道理的

看看mybatis和hibernate本质区别和应用场景:

hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。
对sql语句进行优化、修改比较困难的。
应用场景:
适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。。

mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。
应用场景:
适用与需求变化较多的项目,比如:互联网项目。

企业进行技术选型,以低成本 高回报作为技术选型的原则,根据项目组的技术力量进行选择。

转载请注明出处:http://blog.csdn.net/acmman/article/details/46455411

时间: 2024-09-28 12:34:54

【MyBatis框架】MyBatis入门程序第二部分的相关文章

【mybatis深度历险系列】mybatis的框架原理+入门程序解析

在前面的博文中,小编介绍了springmvc的相关知识点,在今天这篇博文中,小编将介绍一下mybatis的框架原理,以及mybatis的入门程序,实现用户的增删改查,她有什么优缺点以及mybatis和hibernate之间存在着怎么样的关系,接下来小编一一进行讲解,希望对小伙伴们有帮助,不足之处,还请多多指教. 什么是mybatis? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google co

Java Mybatis框架入门基础教程_基础知识

一.Mybatis介绍 MyBatis是一款一流的支持自定义SQL.存储过程和高级映射的持久化框架.MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去 设置参数和获取检索结果.MyBatis能够使用简单的XML格式或者注解进行来配置,能够映射基本数据元素.Map接口和POJOs(普通java对象)到数据库中的记录. 二.MyBatis工作流程 (1)加载配置并初始化 触发条件:加载配置文件 配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个

MyBatis入门程序_java

什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. (一).程序环境 1.jar包 2.classpath目录下建立SqlMapConfig.xml. mybatis的配置文件.全部设置有如下 同时,数据库的

Java Mybatis 框架入门教程

一.Mybatis介绍 MyBatis是一款一流的支持自定义SQL.存储过程和高级映射的持久化框架.MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去 设置参数和获取检索结果.MyBatis能够使用简单的XML格式或者注解进行来配置,能够映射基本数据元素.Map接口和POJOs(普通java对 象)到数据库中的记录. 二.MyBatis工作流程 (1)加载配置并初始化 触发条件:加载配置文件 配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个

mybatis原理概述入门教程_java

本文我将要介绍一下mybatis的框架原理,以及mybatis的入门程序,实现用户的增删改查,她有什么优缺点以及mybatis和hibernate之间存在着怎么样的关系,希望对小伙伴们有帮助,不足之处,还请多多指教. 什么是mybatis? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .2013年11月迁移到Github. MyBatis 是支持定

MyBatis框架之mybatis逆向工程自动生成代码_java

Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件,由于手动书写很容易出错,我们可以利用Mybatis-Generator来帮我们自动生成文件. 逆向工程 1.什么是逆向工程 mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的代码(mapper.java,mapper.xml.po..) 企业实际开发中,常用的逆向工程方式: 由于数据库的表生成java代码. 2.下载逆向工程 my

深入理解MyBatis框架的的配置信息

面对一个框架,最重要的不是说回用其代码就可以了,我们需要了解其思想,这样才能更快更好的掌握这个框架.而对于一个框架,最重要的就是其配置文件的作用及功能了.下面,我就来谈一谈我今天遇到的这个MyBatis框架. 核心思想 MyBatis的核心思想就是为了简化开发人员在编写和数据库打交道的时候的持久化的复杂的操作.其工作流程我们先不深究,就看看它实现的功能吧.那我们其实可以类比自己写的代码.我们实现和数据库打交道的操作不就是连接数据库,创建相关的JavaBean对象,然后使用DAO层的语法,借助于S

java持久层框架mybatis防止sql注入的方法_java

sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如"or '1'='1'"这样的语句,有可能入侵参数校验不足的应用程序.所以在我们的应用中需要做一些工作,来防备这样的攻击方式.在一些安全性很高的应用中,比如银行软件,经常使用将sql语句全部替换为存储过程这样的方式,来防止sql注入,这当然是一种很安全的方式,但我们平时开发中,可能不需要这种死板的方式. mybatis框架作为一款半自动化的持久层框架,其sql语句都要我们自己来手

Java的MyBatis框架中MyBatis Generator代码生成器的用法_java

关于Mybatis GeneratorMyBatis Generator (MBG) 是一个Mybatis的代码生成器 MyBatis 和 iBATIS. 他可以生成Mybatis各个版本的代码,和iBATIS 2.2.0版本以后的代码. 他可以内省数据库的表(或多个表)然后生成可以用来访问(多个)表的基础对象. 这样和数据库表进行交互时不需要创建对象和配置文件. MBG的解决了对数据库操作有最大影响的一些简单的CRUD(插入,查询,更新,删除)操作. 您仍然需要对联合查询和存储过程手写SQL和