MyBatis为JAVA的一种持久层框架(或者说是ORM框架),另一种ORM框架为Hibernate;说是MyBatis是半自动化的ORM框架,Hibernate是全自动的ORM框架。刚开始先用起来,理论先别管太多。
该教程参考自:一号门MyBatis从入门到精通
http://limingnihao.iteye.com/blog/781671
http://blog.csdn.net/chris_mao/article/details/48803545
需要添加的JAR包:
mybatis-3.4.1.jar(下载地址:https://github.com/mybatis/mybatis-3/releases)
mysql-connector-java-5.1.40-bin.jar(这里用的MySQL数据库)
1. 用户表:sys_user1;
CREATE TABLE `sys_user1` (
`id` INT(11) PRIMARY KEY AUTO_INCREMENT,
`userName` VARCHAR(50),
`birthday` DATE,
`salary` DECIMAL(8,2),
`address` VARCHAR(200)
) ENGINE=INNODB CHARSET=utf8;
INSERT INTO `sys_user1` VALUES(1, '陈三', '1992-02-29', 123456.78, '深圳市南山区');
INSERT INTO `sys_user1` VALUES(2, '张三', '1990-03-05', 8500, '深圳市宝安区');
INSERT INTO `sys_user1` VALUES(3, '李三', '1991-05-23', 123326.1, '深圳市福田区');
INSERT INTO `sys_user1` VALUES(4, '赵四', '1988-09-15', 8000, '深圳市龙华新区');
2. 实体类:SysUser1
public class SysUser1 {
private int id;
private String userName;
private Date birthday;
private Double salary;
private String address;
public String toString(){
return "SysUser1 : {id = " + id + ", userName = " + userName + ", birthday = " + birthday + ", salary = " + salary + ", address = " + address + "}";
}
//省略属性的setter、getter方法
}
3. 实体类SysUser1的映射文件SysUser1.xml
insert into `sys_user1`(userName, birthday, salary, address)
values(#{userName}, #{birthday}, #{salary}, #{address})
delete from `sys_user1` where id=#{id}
update `sys_user1` set userName=#{userName}
where id=#{id}
4. myBatis配置文件myBatisConfig.xml
5. 测试类MyBatisSysUser1Test
public class MyBatisSysUser1Test {
private static SqlSessionFactory sqlSessionFactory;
private static Reader resource;
//创建会话工厂
static{
try{
//读取MyBatis配置文件
resource = Resources.getResourceAsReader("myBatisConfig.xml");
//创建SqlSessionFactory会话工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);
}catch(Exception e){
e.printStackTrace();
}
}
public static SqlSessionFactory getSession(){
return sqlSessionFactory;
}
//插入一条数据
public void insert(){
SqlSession sqlSession = sqlSessionFactory.openSession();
SysUser1 sysUser1 = new SysUser1();
sysUser1.setUserName("王二");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
sysUser1.setBirthday(df.parse("1988-08-23"));
} catch (ParseException e) {
e.printStackTrace();
}
sysUser1.setSalary(7800.00);
sysUser1.setAddress("深圳市罗湖区");
sqlSession.insert("com.chensan.sys.entity.SysUser1.insert", sysUser1);
sqlSession.commit();//新增、修改、删除需要提交
sqlSession.close();
System.out.println(sysUser1);
}
//删除一条记录
public void delete(){
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.delete("com.chensan.sys.entity.SysUser1.delete", 4);
sqlSession.commit();
sqlSession.close();
}
//更新用户记录
public void update(){
SqlSession sqlSession = sqlSessionFactory.openSession();
SysUser1 sysUser1 = new SysUser1();
sysUser1.setId(5);
sysUser1.setUserName("王二小");
sqlSession.update("com.chensan.sys.entity.SysUser1.update", sysUser1);
sqlSession.commit();
sqlSession.close();
System.out.println(sysUser1);
}
public void getById(){
//开启会话实例sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
SysUser1 sysUser1 = sqlSession.selectOne("com.chensan.sys.entity.SysUser1.getById",1);
sqlSession.close();//关闭会话
System.out.println(sysUser1);
}
//根据其它字段查询记录
public void getByName(){
SqlSession sqlSession = sqlSessionFactory.openSession();
List sysUser1 = sqlSession.selectList("com.chensan.sys.entity.SysUser1.getByName","三");
sqlSession.close();
for(SysUser1 user : sysUser1){
System.out.println(user);
}
}
//查询所有用户记录
public void getAll(){
SqlSession sqlSession = sqlSessionFactory.openSession();
List sysUser1 = sqlSession.selectList("com.chensan.sys.entity.SysUser1.getAll");
sqlSession.close();
for(SysUser1 user : sysUser1){
System.out.println(user);
}
}
public static void main(String[] args) {
MyBatisSysUser1Test myBatisSysUser1Test = new MyBatisSysUser1Test();
//myBatisSysUser1Test.insert();
//myBatisSysUser1Test.delete();
//myBatisSysUser1Test.update();
//myBatisSysUser1Test.getById();
//myBatisSysUser1Test.getByName();
myBatisSysUser1Test.getAll();
}
}
注意点:
1)mapper元素的namespace属性,用来区分映射对应的实体类,绑定Dao接口,即面向接口编程。可用全限定名,直接找对对应的操作实体;也可用唯一名称标识来表示,在工程中唯一即可。
2)#{} 是一个占位符,通过#{}可实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止注入。#{}可以接收简单类型值或者pojo属性值。
${}表示拼接sql串,通过${}可以将preparedStatement传入的内容拼接在sql中,且不进行jdbc类型转换,${}可以接收简单类型值或者pojo属性值,如果parameterType传输单个简单类型,${}括号中只能是value。
3)在类映射文件的insert操作中属性useGeneratedKeys(默认为false)允许 JDBC 支持自动生成主键,必须驱动兼容(如:MySQL和SQLServer;Oracle只能依赖于sequence来实现自增长不支持该属性)。在useGeneratedKeys="true"时,keyProperty必须绑定主键对应的字段;(不过即使不用useGeneratedKeys="true",MySQL5.6只要在数据表中设置了auto_increment,仍能实现自增长,只是这个自增长是数据库自身的,而useGeneratedKeys是使用jdbc的getGenereatedKeys方法获取主键并赋值到keyProperty设置的属性)。在插入时,如果不同时设置useGeneratedKeys="true"和keyProperty属性,返回的插入数据SysUser1 : {id = 0, userName = 王二, birthday = Tue Aug 23 00:00:00 CDT 1988, salary = 7800.0, address = 深圳市罗湖区} 的id=0;因为这时的主键并不是由jdbc去生成,而此时的数据也仅是当前操作的对象,并非从数据库获取。
4)在MyBatis的配置文件myBatisConfig.xml中,typeAliases中加上typeAliase可对实体取别名,在实体的映射文件中parameterType或者resultType就可直接使用该实体类的别名;当然如果实体类映射中使用resultMap(设置实体类属性和数据表字段对应关系)后,resultMap的id属性即相当于实体类的别名,在该映射文件的parameterType和resultType中也可直接使用该简写(只作用于本映射文件内)。
还有批量新增、批量删除的例子没写;