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.
工程结构图如下: