MyBatis的增删改查方法

本文详细介绍了一个基于MyBatis的CRUD操作案例,包括项目搭建、配置文件编写、实体类及SQL映射文件创建等关键步骤,并提供了完整的测试代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1.4 开发步骤(推荐)

新建JAVA项目或WEB项目

部署jar包(包括数据库驱动包):使用MyBatis需要先下载jar包

编写主配置文件

创建数据库及表(如已创建,可省略)

创建实体类及SQL映射文件

编写数据库接口及实现

编写测试类及测试

1.5 开发示例

1.5.1  新建项目

新建java项目或web 项目。我的工程目录结构如下图


1.5.2 导入JAR包

导入mybatis和数据库驱动包、日志包(配置日志配置文件),下载地址(http://pan.baidu.com/s/1kUARvc7)。

1.5.3  创建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>
<!--environments指定数据源环境,default指的是使用哪个数据源  -->
	<environments default="person">
	<!--environment定义数据源的信息  -->
		<environment id="person">
		<!-- type="JDBC"表示事务由jdbc连接管理,type="MANAGED"表示事务由容器来管理 -->
			<transactionManager type="JDBC" />
			<!-- type="POOLED"表示使用连接池, type="UNPOOLED"表示不使用连接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis_?useUnicode=true&characterEncoding=UTF-8" />
				<property name="username" value="root" />
				<property name="password" value="root" />
			</dataSource>
		</environment>

	</environments>
	<!-- 加入映射文件信息 -->
 	<mappers>
		<mapper resource="cn/wxz/entity/PersonMapper.xml" />
	</mappers> 
</configuration>


1.5.4  创建数据库及表

drop databaseif exists person;
create database person CHARACTERSET UTF8;
use person;
 
create table person(
    id int primarykey auto_increment,
    name varchar(50),
    age int
);
 
 
insert into 
person
(name,age) values('wxz',18);insert into person (name,age)values('wxz2',19);
insert into person (name,age) values(wxz3,20);
select * from person;


1.5.5  创建实体类:Person.java

package cn.wxz.entity;

import java.io.Serializable;

public class Person implements Serializable {


	private static final long serialVersionUID = -2525513725816258556L;
	private Integer id;
	private String name;
	private int age;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [age=" + age + ", id=" + id + ", name=" + name + "]";
	}
	
	

}


1.5.6  创建SQL映射文件及修改主配置文件

SQL映射文件:personMapper.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的值是自己定义的-->
<mapper namespace="cn.wxz.PersonMapper">
<!-- type指定的是对应的实体类 -->
<resultMap type="cn.wxz.entity.Person" id="personResultMap">
<!-- id用来配置表的主键与类的属性的映射关系 ,column指定的是表的字段名; property指定的是类的属性名-->
<id column="id" property="id"/>
<!-- result用来配置 普通字段与类的属性的映射关系 ,column指定的是表的字段名; property指定的是类的属性名-->
<result column="name" property="name"/>
<result column="age" property="age"/>
</resultMap>
<!-- 添加一第记录 ; 定义插入的sql语句,通过命名空间+id方式被定位 -->
<insert id="insertDept" parameterType="cn.wxz.entity.Person">
<!-- #{} 用来获取传过来的参数 -->
	insert into person(name,age) values(#{name},#{age})
</insert>
<update id="update" parameterType="cn.wxz.entity.Person">
			update person set name=#{name} where  age=#{age} 
</update>

<delete id="delete" parameterType="cn.wxz.entity.Person">
		delete from person  where age=#{age}
</delete>

<!-- 省略其它的配置信息 -->
	<!--返回单条记录,表字段和对应实体属性命名一致时可以不使用resultMap属性配置,直接使用resultType="返回的全类名或别名",建议使用前者;查询结果为所有字段时,也可以用*表示  -->
	<select id="selectOne" parameterType="cn.wxz.entity.Person"  resultMap="personResultMap"  >
		select name,id,age from person where age=#{age}	
</select>

<!-- 返回多条记录,返回结果配置的不是集合类型,而是集合元素的类型;参数也可以通过Map等方式封装  -->
	<select id="selectList" parameterType="cn.wxz.entity.Person"  resultMap="personResultMap">
		select * from person where  name like #{deptName}
</select>

</mapper>

1.5.7  编写数据库操作

包括操作接口及实现,接口略,实现类为:PersonDaoImpl.java


package cn.wxz.dao.impl;

import java.io.IOException;
import java.io.Reader;
import java.util.List;
import java.util.Map;

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 cn.wxz.entity.Person;
import cn.wxz.tool.MyBatisUtil;
public class PersonDaoImpl {
	/*
	 * 1.读取配置文件信息
	 * 2。构建session工厂
	 * 3。创建session
	 * 4.开启事务(可选)
	 * 5。处理数据
	 * 6。提交、回滚事务
	 * 7。关闭session 
	 * 
	 */
	SqlSession session = null;
	
	public int  save(Person person){
	
		int i=0;

		try {
			session=MyBatisUtil.getSession();
			//方法的第一个参数为DeptMapper.xml文件的命名空间+id
			 i=session.insert("cn.wxz.PersonMapper.insertDept",person);
			System.out.println("受影响行数:"+i);
			session.commit();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			session.rollback();
			
		}finally{
				MyBatisUtil.closeSession();
		}	
		return i;
}

	
	
	public int  update(Person person){

		int i=0;

		try {
			session=MyBatisUtil.getSession();
			//方法的第一个参数为DeptMapper.xml文件的命名空间+id
			 i=session.update("cn.wxz.PersonMapper.update",person);
			System.out.println("受影响行数:"+i);
			session.commit();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			session.rollback();
			
		}finally{
				MyBatisUtil.closeSession();
		}	
		return i;
}

	
	
	
	
	public int  delete(Person person){
		SqlSession session = null;
		int i=0;

		try {
			session=MyBatisUtil.getSession();
			//方法的第一个参数为DeptMapper.xml文件的命名空间+id
			 i=session.update("cn.wxz.PersonMapper.delete",person);
			System.out.println("受影响行数:"+i);
			session.commit();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			session.rollback();
			
		}finally{
				MyBatisUtil.closeSession();
		}	
		return i;
}

	
	
	public Person query(int  age){
		
		Person person=null;
		try {
			session=MyBatisUtil.getSession();
			person=(Person)session.selectOne("cn.wxz.PersonMapper.selectOne",age);
			System.out.println("dept:"+person);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			MyBatisUtil.closeSession();
		}
		return person;

}
	
	
	public List<Person> selectList(Map map){
		List<Person> persons=null;
		try {
			session=MyBatisUtil.getSession();
			persons=session.selectList("cn.wxz.PersonMapper.selectList",map);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			MyBatisUtil.closeSession();
		}
		return persons;
}

	
	
	
	
	public List<Person> selectListUseIf(Person person){
		List<Person> persons=null;
		try {
			session=MyBatisUtil.getSession();
			persons=session.selectList("cn.wxz.PersonMapper.selectListUseIf",person);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			MyBatisUtil.closeSession();
		}
		return persons;
}


	
	public List<Person> selectListUseWhere(Person person){
		List<Person> persons=null;
		try {
			session=MyBatisUtil.getSession();
			persons=session.selectList("cn.wxz.PersonMapper.selectListUseIf",person);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			MyBatisUtil.closeSession();
		}
		return persons;
}

	
}


1.5.8  编写测试类

需要导入junit包

package cn.wxz.test;

import static org.junit.Assert.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import cn.wxz.dao.impl.PersonDaoImpl;
import cn.wxz.entity.Person;
public class TestDeptDaoImpl {
	private static PersonDaoImpl personDaoImpl;

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		personDaoImpl = new PersonDaoImpl();
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception {
		personDaoImpl = null;
	}

	@Test
	public void test() {
		Person person = new Person();
		person.setName("222");
		person.setAge(25);
		System.out.println("受影响 的行数:"+personDaoImpl.save(person));
	}
	
	@Test
	public void testUpdate() {
		Person person = new Person();
		person.setName("ni shi a  ");
		person.setAge(25);
		System.out.println("受影响 的行数:"+personDaoImpl.update(person));
	}

	@Test
	public void testDelete() {
		Person person = new Person();

		person.setAge(25);
		System.out.println("受影响 的行数:"+personDaoImpl.delete(person));
	}
	
	@Test
	public void testQuery() {
		Person person = new Person();

		person.setAge(25);
	 Person query = personDaoImpl.query(person.getAge());
		System.out.println("受影响 的行数:"+query);
	}
	
	@Test
	public void testSelectList() {
		Map map=new HashMap();
		map.put("deptName", "%真%");
		List<Person> persons=personDaoImpl.selectList(map);
		for(Person person:persons){
			System.out.println("person:"+person);
		}
}
	@Test
	public void testSelectListUseIf() {
	Person person2 = new Person();
	person2.setAge(25);
person2.setName("222");
		List<Person> persons=personDaoImpl.selectListUseIf(person2);
		for(Person person:persons){ 
			System.out.println("person:"+person);
		}
}
	
	
	@Test
	public void testSelectListUseWhere() {
	Person person2 = new Person();
	person2.setId(13);
	person2.setAge(25);
person2.setName("真棒");
		List<Person> persons=personDaoImpl.selectListUseIf(person2);
		for(Person person:persons){
			System.out.println("person:"+person);
		}
}
	
	
	
}


 

2.基本的CRUD操作

2.1           准备工作(继续使用前面的库表和代码)

2.2           别名与自定义别名

2.2.1  内置别名

对常用的 java 类型,已经内置了一些别名支持。这些别名都是不区分大小写的。(详细参看用户手机)

2.2.2  自定义别名

在myBatis的主配置文件给cn.itcast.entity.Dept类创建别名Dept,后继的DeptMapper.xml配置文件中可以使用别名

<!-- 通过别名简化对类的使用 -->

<typeAliases>

      <typeAliastype="cn.itcast.entity.Dept"alias="Dept"/>

</typeAliases>

2.3  MyBatisUtil工具类

 

package cn.wxz.tool;

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatisUtil {

	   
	private static final ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
    private static SqlSessionFactory sessionFactory;
	
    private static String CONFIG_FILE_LOCATION = "myBatis-config.xml";

	static {
    	try {
    		buildSessionFactory();
		} catch (Exception e) {
			System.err.println("%%%% Error Creating SessionFactory %%%%");
			e.printStackTrace();
		}
    }
    private MyBatisUtil() {
    }
	
	/**
     * Returns the ThreadLocal Session instance.  Lazy initialize
     * the <code>SessionFactory</code> if needed.
     *
     *  @return Session
     *  @throws Exception
     */
    public static SqlSession getSession() throws Exception {
        SqlSession session = (SqlSession) threadLocal.get();

		if (session == null) {
			if (sessionFactory == null) {
				buildSessionFactory();
			}
			session = (sessionFactory != null) ? sessionFactory.openSession()
					: null;
			threadLocal.set(session);
		}

        return session;
    }

	/**
     *  build  session factory
     *
     */
	public static void buildSessionFactory() {
		Reader reader=null;
		try {
			reader=Resources.getResourceAsReader(CONFIG_FILE_LOCATION);
			sessionFactory = new SqlSessionFactoryBuilder().build(reader);
		} catch (Exception e) {
			System.err.println("%%%% Error Creating SessionFactory %%%%");
			e.printStackTrace();
		}finally{
			try {
				reader.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	/**
     *  Close the single  session instance.
     *
     */
    public static void closeSession(){
        SqlSession session = (SqlSession) threadLocal.get();
        threadLocal.set(null);

        if (session != null) {
            session.close();
        }
    }

	/**
     *  return session factory
     *
     */
	public static SqlSessionFactory getSessionFactory() {
		return sessionFactory;
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值