mybatis之mybatis操纵数据库

MyBatis数据库操作指南
本文详细介绍了使用MyBatis框架进行数据库操作的流程及代码实现,包括配置文件设置、SQL语句映射、会话工厂创建、增删改查等核心功能。

在上一文(springmvc之jdbc操纵数据库)中,我们分析了传统java的jdbc操纵数据库的流程以及使用因为该方法导致的一些bug,因此,本文的中心点就是探讨如何解决上一文出现的那些bug,要解决这些bug,Apache旗下的mybatis给出了很好的解决方案,接下来我们来看看mybatis的工作流程以及部分代码。

mybatis的工作流程:

以上就是mybatis的将要工作流程,我们接着看针对以上流程的具体代码,不过在这之前,我们需要配置一个log4j.propertiessql执行日志文件,在控制台输出sql语句,以方便我们查看执行情况:

  log4j.properties文件:

# Global logging configuration
#在开发环境下日志级别要设置成DEBUG,生产环境设置成info或error
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

现在就是到了以上流程的具体代码了:

一、编辑配置文件

    1、配置sqlMapConfig.xml文件

<?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>
	<!-- 和spring整合后 environments配置将废除 -->
	<environments default="development">
		<environment id="development">
			<!-- 使用jdbc事务管理 -->
			<transactionManager type="JDBC" />
			<!-- 数据库连接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url"
					value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
				<property name="username" value="数据库登录名" />
				<property name="password" value="数据库登录密码" />
			</dataSource>
		</environment>
	</environments>
	<!-- 加载映射文件:User.xml等(一般为数据表名.xml) -->
	<mappers>
		<mapper resource="sqlmap/User.xml" />
	</mappers>
</configuration>

以上是前期的sqlMapConfig.xml简单配置,到后期与spring整合以后,后有变动,在这里我们先用着先。

   2、配置实体类(数据表)对应的xml文件(以User表为例:因此文件名为: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="cn.itcast.mybatis.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="cn.itcast.mybatis.po.User">
		SELECT * FROM USER WHERE username LIKE '%${value}%'
	</select>
	
	<!-- 添加用户 
	parameterType:指定输入 参数类型是pojo(包括 用户信息)
	#{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值
	-->
	<insert id="insertUser" parameterType="cn.itcast.mybatis.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>
		insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
		<!-- 
		使用mysql的uuid()生成主键
		执行过程:
		首先通过uuid()得到主键,将主键设置到user对象的id属性中
		其次在insert执行时,从user对象中取出id属性值
		 -->
		<!--  <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}) -->
		
		
	</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="cn.itcast.mybatis.po.User">
		update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} 
		 where id=#{id}
	</update>
	
</mapper>


  这个文件的作用就是针对某一个表把sql语句写进配置文件里面,方便后期因为需求变动而给系统维护造成一些不必要的麻烦。

二、创建SqlSession会话工厂以及后续的步骤都以及包括在这个文件里面了(利用一些写好的方法/函数调用上一步的配置文件里面的一些语句):

package store.cloudspace.sessionFactory;

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 store.cloudspace.pojo.User;

/**
 * @ClassName: operatingUser
 * @Description:TODO(操作数据表中的数据)
 * @author: MyLover
 * @date: 2018年11月22日 下午8:33:58
 * @Copyright: 2018 www.cloudspace.store Inc. All rights reserved.
 */
public class findUser {
	@Test
	public void findUserById() 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.id
		// 第二个参数:指定和映射文件中说匹配的parameterType类型对象
		// sqlSession.selectOne结果是与映射文件中说匹配的resultType类型对象
		User user = sqlSession.selectOne("test.findUserByid", 3);
		System.out.println(user);

		// 释放资源
		sqlSession.close();
	}

	@Test
	public void findUserByName() throws IOException {

		// 定义mybatis配置文件
		String resource = "config/SqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);

		// 创建会话工厂,传入mybatis的配置文件信息
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		// 通过工厂得到sqlsession
		SqlSession sqlSession = sqlSessionFactory.openSession();

		List<User> user = sqlSession.selectList("test.findUserByName", "上官");
		System.out.println(user);

		// 释放资源
		sqlSession.close();
	}
	 
	public void innsertUser() throws IOException {
		// 定义mybatis配置文件
		String resource = "config/SqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);

		// 创建会话工厂,传入mybatis的配置文件信息
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		// 通过工厂得到sqlsession
		SqlSession sqlSession = sqlSessionFactory.openSession();

		User user = new User();
		user.setUsername("张晓军");
		user.setSex("男");
		user.setBirthday(new Date());
		user.setAddress("大学东路");
		
	   	sqlSession.insert("insertUser", user);
	   	
	   	sqlSession.commit();//提交事务

		// 释放资源
		sqlSession.close();
	}

   // 根据id删除用户信息
	@Test
	public void deleteUser() throws IOException {
		// mybatis配置文件
		String resource = "SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);

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

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

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

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

		// 关闭会话
		sqlSession.close();

	}

	// 更新用户信息
	@Test
	public void updateUser() throws IOException {
		// mybatis配置文件
		String resource = "SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);

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

		// 通过工厂得到SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 更新用户信息
		
		User user = new User();
		//必须设置id
		user.setId(41);
		user.setUsername("王大军");
		user.setBirthday(new Date());
		user.setSex("2");
		user.setAddress("大学西路");

		sqlSession.update("test.updateUser", user);
		
		// 提交事务
		sqlSession.commit();

		// 关闭会话
		sqlSession.close();

	}

以上就是mybatis操纵数据库的简单流程以及具体代码了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值