天天看点

mybatis入门-实现基本CRUD操作

mybatis入门-实现基本CRUD操作

    闲着没事,整理整理初学mybatis时候的笔记。另外上传了mybatis的jar包(包括开发jar包以及源代码jar),首先,建立一个java project,创建一个lib文件夹,放入mybatis的jar包跟mysql驱动的jar包,add to build path...。整体效果截图如下:

mybatis入门-实现基本CRUD操作

    然后,建立包目录结构和mybatis的配置文件,如上图所示。下面是User实体类:

package com.steadyjack.model;

public class User {
	private Integer id;
	private String userName;
	private int age;
	private String address;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", userName=" + userName + ", age=" + age
				+ ", address=" + address + "]";
	}
}
           

    建立数据库表:

CREATE Database mybatis
use mybatis
CREATE TABLE `tb_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userName` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

INSERT INTO `tb_user` VALUES ('1', 'jack', '12', 'foshan');
INSERT INTO `tb_user` VALUES ('2', 'sam', '21', 'guagnzhou');
INSERT INTO `tb_user` VALUES ('3', 'jerry', '22', 'sichuang');
INSERT INTO `tb_user` VALUES ('4', 'silly', '23', 'chengdu');
INSERT INTO `tb_user` VALUES ('8', 'july', '24', 'beijing');
           

    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>

	<!-- 别名 -->
	<typeAliases>
		<package name="com.steadyjack.model"/>
	</typeAliases>
	
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC"></transactionManager>
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<!-- url中还配置了字符编码,防止插入中文到数据库时候出现乱码,注意用&代替&; -->
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8"/>
				<property name="username" value="root"/>
				<property name="password" value="123456"/>
			</dataSource>
		</environment>
	</environments>
 	
	<mappers>
		<mapper resource="com/steadyjack/mappers/userMapper.xml" />
	</mappers>
</configuration>
           

    建立UserDao:

package com.steadyjack.mappers;

import java.util.List;

import com.steadyjack.model.User;

/**
 * 面向接口编程
 * @author android
 *
 */
public interface UserDao {
	
	public User getUserById(Integer id);
	
	public List<User> getUserList(User user);
	
	public void addUser(User user);
	
	public int updateUser(User user);
	
	public int deleteUser(Integer id);
}
           

    建立UserMapper,其实就是UserDao的实现(从namespace就可以看出来了)

<?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.steadyjack.mappers.UserDao">  
    
    <resultMap type="User" id="resultListUser">
    	<id column="id" property="id" />
    	<result column="userName" property="userName" />  
        <result column="age" property="age" />  
        <result column="address" property="address" />
    </resultMap>
    
    <select id="getUserById" parameterType="Integer" resultMap="resultListUser">  
        select * from tb_user where id = #{id}  
    </select>  
    
    <select id="getUserList" parameterType="User" resultMap="resultListUser">
    	<!-- select * from tb_user where userName like "%"#{userName}"%" -->
    	select * from tb_user
    	
    	<where>
    		<if test="userName!=null">
    			<!-- and userName like "%"#{userName}"%"  and mybatis会自动去掉的 -->
    			userName like "%"#{userName}"%"
    		</if>
    		<if test="address!=null">
    			or address like "%"#{address}"%"
    		</if>
    	</where>
    </select>
    
    <insert id="addUser" parameterType="User">
    	insert into tb_user(userName,age,address) values(#{userName},#{age},#{address})
    </insert>
    
    <update id="updateUser" parameterType="User">
    	<!-- update tb_user set userName=#{userName},age=#{age},address=#{address} where id=#{id} -->
    	update tb_user set
    	<set>
    		<if test="userName!=null">
    			userName=#{userName},
    		</if>
    		<if test="address!=null">
    			address=#{address}
    		</if>
    	</set>
		where id=#{id}    	
    </update>
    
    <delete id="deleteUser" parameterType="Integer">
    	delete from tb_user where id=#{id}
    </delete>
    
</mapper>  
           

    最后是UserTest,测试接口中的各个方法:

package com.steadyjack.test;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
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.steadyjack.mappers.UserDao;
import com.steadyjack.model.User;

public class UserTest {
	
	private static SqlSessionFactory sessionFactory;
	//private static Reader reader;
	private static final String loaction="mybatis-config.xml";
	
	static{
		try {
			//getResourceAsReader 发现底层实现的原理还是InputSteamReader(inputstream来实现的)
			//reader=Resources.getResourceAsReader("mybatis-config.xml");
			//sessionFactory = new SqlSessionFactoryBuilder().build(reader);
			
			InputStream stream=UserTest.class.getClassLoader().getResourceAsStream(loaction);
			sessionFactory=new SqlSessionFactoryBuilder().build(stream);
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	public static SqlSessionFactory getSession(){
		return sessionFactory;
	}
	
	@Test
	public void testGet(){
		SqlSession session=sessionFactory.openSession();
		
		UserDao userDao=session.getMapper(UserDao.class);
		User user=userDao.getUserById(4);
		System.out.println(user);
		
	}
	
	@Test
	public void testQueryList(){
		SqlSession session=sessionFactory.openSession();
		
		UserDao userDao=session.getMapper(UserDao.class);
		User user=new User();
		user.setAddress("州");
		List<User> userList=userDao.getUserList(user);
		for (User u : userList) {
			System.out.println(u);
		}
	}
	
	@Test
	public void testAdd(){
		SqlSession session=sessionFactory.openSession();
		
		UserDao userDao=session.getMapper(UserDao.class);
		User user=new User();
		user.setUserName("j");
		user.setAge(12);
		user.setAddress("f");
		
		try {
			userDao.addUser(user);
			session.commit();
			System.out.println("id: "+user.getId());
			
		} catch (Exception e) {
			System.out.println("提交事务发生异常: "+e.getMessage());
		} finally{
			session.close();
		}
	}
	
	@Test
	public void testUpdate(){
		SqlSession session=sessionFactory.openSession();
		
		UserDao userDao=session.getMapper(UserDao.class);
		User user=userDao.getUserById(12);
		System.out.println("原先的User: "+user);
		
		if (user!=null) {
			user.setUserName("steayjack");
			user.setAge(25);
			user.setAddress("上海");
			
			int res=0;
			try {
				res=userDao.updateUser(user);
				session.commit();
				System.out.println("提交成功: "+user.getId()+" -- 操作返回结果: "+res);
			} catch (Exception e) {
				System.out.println("提交事务发生异常:"+e.getMessage());
			} finally{
				session.close();
			}
		}else{
			throw new RuntimeException("没有该用户!");
		}
	}
	
	@Test
	public void testDelete(){
		SqlSession session=sessionFactory.openSession();
		UserDao userDao=session.getMapper(UserDao.class);
		
		try {
			int res=userDao.deleteUser(5);		
			System.out.println("执行结果:"+res);
			session.commit();
		} catch (Exception e) {
			System.out.println("提交事务发生异常: "+e.getMessage());
		} finally{
			session.close();
		}
		
	}
}
           

    没有涉及到什么关联映射之类的(其实,我在公司中实际的项目是不做实际的数据库关联的!)

    好了,就介绍到这里吧!我觉得这样入门的话,贼简单的!!!!后期会来一个spring springmvc mybatis的整合案例!!!

继续阅读