Mybatis使用SqlSession发送SQL实现数据的CRUD

本文介绍如何使用MyBatis框架实现用户信息的增删改查操作,包括实体类定义、映射文件配置、全局配置及单元测试。

                                       以mysql数据库为例,该数据库中存在表user_info,该表存放用户信息

要操作数据库中的表,必须编写一个实体类UserInfo,该类的属性包含表中所有的列,为了方便,该实体类只引用id、userName、password、regDate实体类UserInfo的代码如下

UserInfo.java

package com.mybatis.entity;

import java.util.Date;

public class UserInfo {
	private int id;
	private String userName;
	private String password;
	private Date regDate;
	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 getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public Date getRegDate() {
		return regDate;
	}
	public void setRegDate(Date regDate) {
		this.regDate = regDate;
	}
	public UserInfo() {
		super();
		// TODO Auto-generated constructor stub
	}
	public UserInfo(String userName, String password, Date regDate) {
		super();
		this.userName = userName;
		this.password = password;
		this.regDate = regDate;
	}
	@Override
	public String toString() {
		return "UserInfo [id=" + id + ", userName=" + userName + ", password="
				+ password + ", regDate=" + regDate + "]";
	}

}

有了实体类还不能实现对数据库数据的操作,必须配置映射文件,将数据库user_info表和实体类UserInfo形成映射关系,并在映射文件中编写相应的sql语句,<select>元素中的id表示唯一标识这条sql语句、parameterType表示输入该sql语句的参数类型、resultType表示返回结果类型,该类型可以是类的别名,也可以是类的全限命名,sql语句中的#{}表示参数,该参数内部字符必须和输入类型的类的属性一致,例如<insert>元素中的#{userName}和UserInfo中的属性userName字符串对应相同。

<?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="com.mybatis.mybatis.UserInfoMapper">
   <!-- select元素查询数据 -->
   <select id="findUserInfoById" parameterType="int" resultType="UserInfo">
       select * from user_info where id=#{id}
   </select>
   <select id="findAllUserInfo" resultType="userInfo">
       select * from user_info
   </select>
   <!-- insert元素添加数据记录 -->
   <insert id="addUserInfo" parameterType="UserInfo">
       insert into user_info(userName,password,regDate) values(#{userName},#{password},#{regDate})
   </insert>
   <!-- update元素修改记录 -->
   <update id="updateUserInfo" parameterType="UserInfo">
       update user_info set userName=#{userName},password=#{password},regDate=#{regDate} where id=#{id}
   </update>
   <!-- delete元素删除记录 -->
   <delete id="deleteUserInfo" parameterType="int">
       delete from user_info where id=#{id}
   </delete>
</mapper>

有了实体类和映射文件外,还需要编写全局配置文件,该文件用于连接数据库、进行数据库参数设置、设置类的别名、设置日志方式、引入映射文件,编写完全局配置文件后,mybatis就可以通过全局配置文件找到相应的映射文件。 

mybatis-config.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> 
<!-- 加载属性文件 -->
<properties resource="db.properties"/>
<!-- 设置日志 -->
<settings>
   <setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
<!-- 设置类型别名 -->
<typeAliases>
  <typeAlias alias="UserInfo" type="com.mybatis.entity.UserInfo"/>
</typeAliases>
<environments default="development">    
 <environment id="development">     
  <transactionManager type="JDBC"/>      
  <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="com/mybatis/entity/UserInfoMapper.xml"/>  
</mappers> 
</configuration>

db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/zhang?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=zwj19970923

其中db.properties是我们自己编写的properties文件,里面存放有关数据库的配置属性,这样我们可以通过修改该文件来修改对数据库的参数配置,达到方便的目的。

编写单元测试,使用SqlSession实现对user_info表数据的CRUD

package com.mybatis.test;

import static org.junit.Assert.*;

import java.io.InputStream;
import java.util.Date;
import java.util.Iterator;
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.After;
import org.junit.Before;
import org.junit.Test;
import com.mybatis.entity.UserInfo;

public class MyBatisTest {

	private SqlSessionFactory sqlSessionFactory=null;
    private SqlSession session=null;
	@Before
	public void start(){
		try{
		String resource="mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource); 
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		session=sqlSessionFactory.openSession();
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}
	
	
	@Test
	public void testAddUserInfo() { //添加数据
	    UserInfo ui=new UserInfo("mybatis1","123",new Date());
	    session.insert("addUserInfo", ui);
	}
	
	@Test
	public void testGetUserInfoById(){ //根据id查询数据
		UserInfo ui=(UserInfo)session.selectOne("findUserInfoById", 62);
		System.out.println(ui.toString());
	}
	
	@Test
	public void testGetAllUserInfo(){ //查询所有数据
		List<UserInfo> uiList=session.selectList("findAllUserInfo");
		System.out.println(uiList.size());
	}
	
	@Test
	public void testUpdateUserInfo(){ //更新数据
		//获取要修改的UserInfo对象
		UserInfo ui=(UserInfo)session.selectOne("findUserInfoById",62);
		ui.setUserName("mybatis-2");
		session.update("updateUserInfo", ui);
	}
	
	@Test
	public void testDeleteUserInfo(){ //删除数据
		int result=session.delete("deleteUserInfo", 62);
		System.out.println(result);
	}
	

	@After
	public void destroy(){
		session.commit();
		session.close();
	}

}

执行testAddUserInfo函数后,表user_info添加了一条新纪录,在控制台输出一个整数,表示影响表中的记录数,这里只是向表插入一条记录,因此影响记录数为1,通过配置日志文件,我们还可以在控制台查看sql语句的执行情况,如下图。

 

执行testGetUserInfoById函数后,查询id为62的用户信息,在user_info表中id为62的用户信息就是刚刚我们插入的用户信息,执行后控制台应输出用户的基本信息

可见查询的用户信息就是刚刚插入的用户信息 

执行testGetAllUserInfo函数,使用SqlSession的selectList方法,返回一个List对象,该列表对象中每一个数据项的类型都是UserInfo,列表对象保存着所有的UserInfo对象,user_info表中的记录如下所示,执行完后在控制台输出该表应有的记录总数。

控制台的输出结果,总记录数是10。

执行testUpdateUserInfo实现对数据的跟新,将刚插入的数据进行更新,用selectOne进行数据的定位,确认需要更改的数据后再使用update更新数据,执行函数后刚刚插入的用户数据的userName应改变为mybatis-2,更新影响的记录数为1,控制台和数据表记录如下

执行testDeleteUserInfo删除刚插入的数据,执行后控制台输出影响的记录数为1, 而且数据表user_info中mybatis-2的数据将会被删除

对此,使用SqlSession发送SQL实现数据的CRUD已经基本完成了!

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值