现在的位置: 首页 > 综合 > 正文

第二十二天 慵懒的投射在JDBC上的暖阳 —性能良好的半自动mybatis

2014年10月03日 ⁄ 综合 ⁄ 共 7801字 ⁄ 字号 评论关闭

              6月1日,晴天。“玉粒量米水次淘,裹将箬叶萱丝韬。炊余胀满峻嶒角,剥出凝成纤细膏。”

         
mybatis和Hibernate,半自动和自动,对象的存储促成了和关系数据库的相逢,数据的离合见证了对象的聚散。然而,究竟是对象改变了数据,还是数据改变了对象?对象的一设一取,关系的一映一,总会为我们津津有味地一一道来。

               下面,给出mybatis-3.2.7的入门实例,看看mybatis和Hibernate的异同。

              
1、下载mybatis

     
mybatis-3.2.7
的下载地址:https://github.com/mybatis/mybatis-3/releases

     
MySQL的jdbc驱动jar包。下载地址:http://dev.mysql.com/downloads/connector/j/5.0.html 

      
2、建立Java Project( 使用mybatis-3.2.7

     使用Eclipse新建一个名为mybatisApp01的工程,把下载的mybatis-3.2.7.zip解压。Add
to Build Path—将如下依赖的jar包加入工程依赖中,包括三个最基本的jar包:

      
log4j-1.2.17.jar,mybatis-3.2.7.jar和mysql-connector-java-5.0.8-bin.jar

   3、创建MySQL数据库

       见 第十九天 慵懒的投射在JDBC上的暖阳 —Hibernate的使用(一)

    4、在src下创建log4j.properties,用于日志输出

log4j.rootLogger=debug, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.org.apache=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

        5、创建POJO类UserInfo        

package edu.eurasia.mybatis;

public class UserInfo {
	private int id;
	private String username;
	private String password;
	
	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;
	}
}

        6、创建一个接口UserInfoMapper.java

package edu.eurasia.mybatis;

public interface UserInfoMapper {
	   /**保存**/
	   public void save(UserInfo userinfo);
	   /**修改**/
	   public void update(UserInfo userinfo);
	   /**查找**/
	   public UserInfo find(int id);
	   /**删除**/
	   public void delete(int id);
	}

        7、创建一个UserInfoMapper.xml(名字和UserInfoMapperr类对应,且放到同一目录下)  

<?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="edu.eurasia.mybatis.UserInfoMapper"><!--注意:此处的命名空间是UserInfoMapper的全限定类名-->

   <!-- 保存 -->
   <insert id="save" parameterType="UserInfo">
      insert into userinfo(username,password) values(#{username},#{password})
   </insert>

   <!-- 更新 -->
   <update id="update" parameterType="UserInfo">
      update userinfo set username=#{username},password=#{password} where id=#{id}
   </update>

   <!-- 查找 -->
   <select id="find" parameterType="int" resultType="UserInfo">
      select * from userinfo where id=#{id}
   </select>

   <!-- 删除 -->
   <delete id="delete" parameterType="int" >
      delete from userinfo where id=#{id}
   </delete>
</mapper>

        9、在src下创建configuration.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>
   <settings>
   <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。默认:true -->
   <setting name="lazyLoadingEnabled" value="true"/>

   <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载 -->
   <setting name="aggressiveLazyLoading" value="false"/>
 </settings>

 <typeAliases>
     <typeAlias type="edu.eurasia.mybatis.UserInfo" alias="UserInfo"/><!--设置别名-->
 </typeAliases>

 <environments default="development">
     <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
           <property name="driver" value="com.mysql.jdbc.Driver"/>
           <property name="url" value="jdbc:mysql://127.0.0.1:3306/hib?useUnicode=true&characterEncoding=UTF-8"/><!--url中的&要用&代替,否则会出错-->
           <property name="username" value="root"/>
           <property name="password" value="root"/>
       </dataSource>
     </environment>
 </environments>

<mappers>
    <mapper resource="edu/eurasia/mybatis/UserInfoMapper.xml"/><!--mapper对应的xml配置文件-->
</mappers>
</configuration>

          10、建立MybatisUtil类,用于获取SqlSessionFactory

package edu.eurasia.mybatis;

import java.io.Reader;

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

public class MybatisUtil {
	private static SqlSessionFactory sqlMapper;
	private static Reader reader;

	static {
		try {
			reader = Resources.getResourceAsReader("configuration.xml");
			sqlMapper = new SqlSessionFactoryBuilder().build(reader);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static SqlSessionFactory getInstance() {
		return sqlMapper;
	}
}

      11、建立测试类MybatisTest.java

package edu.eurasia.mybatis;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;

public class MybatisTest {
	private SqlSessionFactory sessionFactory = MybatisUtil.getInstance();

	@Test
	public void save() {
		SqlSession session = sessionFactory.openSession();
		try {
			UserInfoMapper userMapper = session.getMapper(UserInfoMapper.class);

			UserInfo user = new UserInfo();
			//user.setId(1);
			user.setUsername("齐白石");
			user.setPassword("123");

			userMapper.save(user);
			session.commit();// 提交事务
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			session.close();
		}
	}

	@Test
	public void update() {
		SqlSession session = sessionFactory.openSession();
		try {
			UserInfoMapper userMapper = session.getMapper(UserInfoMapper.class);

			UserInfo user = userMapper.find(2);
			user.setUsername("徐悲鸿");

			userMapper.update(user);
			session.commit();// 提交事务
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			session.close();
		}
	}

	@Test
	public void find() {
		SqlSession session = sessionFactory.openSession();
		try {
			UserInfoMapper userMapper = session.getMapper(UserInfoMapper.class);

			UserInfo user = userMapper.find(1);

			System.out.println("id : " + user.getId() + ", name : "
					+ user.getUsername() + ", password : " + user.getPassword());
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			session.close();
		}
	}

	@Test
	public void delete() {
		SqlSession session = sessionFactory.openSession();
		try {
			UserInfoMapper userMapper = session.getMapper(UserInfoMapper.class);

			userMapper.delete(2);
			session.commit();// 提交事务
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			session.close();
		}
	}
}

        12、运行测试结果

           选中MybatisTest,右键->Run AS->JUnit Test 。注意:测试时,一个一个测试,测试一个是时候,可以屏蔽另外三个。

       测试save()方法的结果:查看数据库userinfo表中已经增加一条记录。

     

        日志输出:

2014-06-01 20:43:28,188 [main] DEBUG [org.apache.ibatis.logging.LogFactory] - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
2014-06-01 20:43:28,219 [main] DEBUG [org.apache.ibatis.datasource.pooled.PooledDataSource] - PooledDataSource forcefully closed/removed all connections.
2014-06-01 20:43:28,219 [main] DEBUG [org.apache.ibatis.datasource.pooled.PooledDataSource] - PooledDataSource forcefully closed/removed all connections.
2014-06-01 20:43:28,219 [main] DEBUG [org.apache.ibatis.datasource.pooled.PooledDataSource] - PooledDataSource forcefully closed/removed all connections.
2014-06-01 20:43:28,219 [main] DEBUG [org.apache.ibatis.datasource.pooled.PooledDataSource] - PooledDataSource forcefully closed/removed all connections.
2014-06-01 20:43:28,469 [main] DEBUG [org.apache.ibatis.transaction.jdbc.JdbcTransaction] - Opening JDBC Connection
2014-06-01 20:43:28,996 [main] DEBUG [org.apache.ibatis.datasource.pooled.PooledDataSource] - Created connection 11229040.
2014-06-01 20:43:28,996 [main] DEBUG [org.apache.ibatis.transaction.jdbc.JdbcTransaction] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@ab5770]
2014-06-01 20:43:29,002 [main] DEBUG [edu.eurasia.mybatis.UserInfoMapper.save] - ==>  Preparing: insert into userinfo(username,password) values(?,?) 
2014-06-01 20:43:29,091 [main] DEBUG [edu.eurasia.mybatis.UserInfoMapper.save] - ==> Parameters: 齐白石(String), 123(String)
2014-06-01 20:43:29,191 [main] DEBUG [edu.eurasia.mybatis.UserInfoMapper.save] - <==    Updates: 1
2014-06-01 20:43:29,191 [main] DEBUG [org.apache.ibatis.transaction.jdbc.JdbcTransaction] - Committing JDBC Connection [com.mysql.jdbc.Connection@ab5770]
2014-06-01 20:43:29,191 [main] DEBUG [org.apache.ibatis.transaction.jdbc.JdbcTransaction] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.Connection@ab5770]
2014-06-01 20:43:29,191 [main] DEBUG [org.apache.ibatis.transaction.jdbc.JdbcTransaction] - Closing JDBC Connection [com.mysql.jdbc.Connection@ab5770]
2014-06-01 20:43:29,191 [main] DEBUG [org.apache.ibatis.datasource.pooled.PooledDataSource] - Returned connection 11229040 to pool.

        工程结构图如下:


       

        

抱歉!评论已关闭.