MyBatis快速入门
大背景
最近问答重构,发现DAO层还是在使用ibatis,之前使用过MyBatis,相比iBatis有了很多进步,趁着这次重构,把iBatis彻底换成MyBatis,一劳永逸...
说说MyBatis
GitHub站点:http://mybatis.github.com/mybatis-3/index.html
Google站点:https://code.google.com/p/mybatis/
iBatis退休声明:http://ibatis.apache.org/
MyBatis带来的好处
下面先来个快速入门实例.
CREATE TABLE USER (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(20),
create_time DATETIME,
PRIMARY KEY (id)
) ENGINE = innodb DEFAULT CHARSET = utf8;
INSERT INTO user (name, create_time) VALUES ('刘一', current_timestamp);
INSERT INTO user (name, create_time) VALUES ('陈二', current_timestamp);
INSERT INTO user (name, create_time) VALUES ('张三', current_timestamp);
INSERT INTO user (name, create_time) VALUES ('李四', current_timestamp);
INSERT INTO user (name, create_time) VALUES ('王五', current_timestamp);
INSERT INTO user (name, create_time) VALUES ('赵六', current_timestamp);
INSERT INTO user (name, create_time) VALUES ('孙七', current_timestamp);
INSERT INTO user (name, create_time) VALUES ('周八', current_timestamp);
INSERT INTO user (name, create_time) VALUES ('吴九', current_timestamp);
INSERT INTO user (name, create_time) VALUES ('郑十', current_timestamp);
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.20</version> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.1.1</version> </dependency>
package org.xiuyuan.mybatis.demo.domain;
public class User {
private Integer id;
private String name;
private Date createTime;
// getter, setter方法略
}
package org.xiuyuan.mybatis.demo.mapper;
public interface UserMapper {
List<User> findAll();
}
.mybatis.demo
.mapper包下。
<?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="org.xiuyuan.mybatis.demo.mapper.UserMapper ">
<select id="findAll" resultType="User"> select * from user </select> </mapper>
注意:
1.mapper文件名(UserMapper.xml)要和上一步的接口名一致;
2.namespace属性必须为上一步接口的全类名:org.xiuyuan.mybatis.demo
.mapper.UserMapper
<configuration> <properties resource="database.properties"/> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <typeAliases> <package name="org.xiuyuan.mybatis.demo.mapper.domain"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${database.driverClassName}"/> <property name="url" value="${database.url}"/> <property name="username" value="${database.username}"/> <property name="password" value="${database.password}"/> </dataSource> </environment> </environments> <mappers> <package name="org.xiuyuan.mybatis.demo.mapper.mapper"/> </mappers> </configuration>
说明:
1.src/main/resources/database.properties 数据库配置文件.
2.typeAliases顾名思义,是类型的别名,这里配置为第二步domain类的包名,这样mybatis的mapper文件中就可以直接写类名,不必写类的全名。
3.mappers配置第三步dao层接口类的包名,告诉mybatis接口类及mapper文件的位置。
4.mapUnderscoreToCamelCase参数用于将下划线的命名格式转换为驼峰命名,如表字段名create_time,在domain类中定义为createTime,执行sql语句后,mybatis会自动把create_time转换为createTime,省去了写sql时指定别名的麻烦。
至此,代码编写完成,现在编写测试用例:
public class MyBatisTest {
@Test
public void test() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
// 通过selectList查询
List<User> userList = sqlSession.selectList(UserMapper.class.getName() + ".findAll");
for (User user : userList) {
logger.debug(user.toString());
}
logger.debug("-----------------------------------");
// 通过接口类查询
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.findAll();
for (User user : users) {
logger.debug(user.toString());
}
} finally {
sqlSession.close();
}
}
}
User{id=1, name='刘一', createTime=Wed Mar 06 20:30:54 CST 2013}
User{id=2, name='陈二', createTime=Wed Mar 06 20:30:54 CST 2013}
User{id=3, name='张三', createTime=Wed Mar 06 20:30:54 CST 2013}
User{id=4, name='李四', createTime=Wed Mar 06 20:30:54 CST 2013}
User{id=5, name='王五', createTime=Wed Mar 06 20:30:54 CST 2013}
User{id=6, name='赵六', createTime=Wed Mar 06 20:30:54 CST 2013}
User{id=7, name='孙七', createTime=Wed Mar 06 20:30:54 CST 2013}
User{id=8, name='周八', createTime=Wed Mar 06 20:30:54 CST 2013}
User{id=9, name='吴九', createTime=Wed Mar 06 20:30:54 CST 2013}
User{id=10, name='郑十', createTime=Wed Mar 06 20:30:54 CST 2013}
------------------------------------------------------------------------
User{id=1, name='刘一', createTime=Wed Mar 06 20:30:54 CST 2013}
User{id=2, name='陈二', createTime=Wed Mar 06 20:30:54 CST 2013}
User{id=3, name='张三', createTime=Wed Mar 06 20:30:54 CST 2013}
User{id=4, name='李四', createTime=Wed Mar 06 20:30:54 CST 2013}
User{id=5, name='王五', createTime=Wed Mar 06 20:30:54 CST 2013}
User{id=6, name='赵六', createTime=Wed Mar 06 20:30:54 CST 2013}
User{id=7, name='孙七', createTime=Wed Mar 06 20:30:54 CST 2013}
User{id=8, name='周八', createTime=Wed Mar 06 20:30:54 CST 2013}
User{id=9, name='吴九', createTime=Wed Mar 06 20:30:54 CST 2013}
User{id=10, name='郑十', createTime=Wed Mar 06 20:30:54 CST 2013}