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