最近在学习Mybatis的使用,在此把自己的学习笔记记录下来。
Mybatis版本:mybatis-3.2.3
数据库: mysql 5.1
环境: eclipse4.2
需要了解的知识:能熟练使用SQL(结构化查询)语言,与 Hibernate, Toplink 等持久化框架不同,ibatis 是一个 “半自动化”的 ORM 实现。ibatis 没有对数据库结构提供了较为完整的封装,而是提供了一个从 POJO 到数据库表的全套映射机制。这使得在开发 ibatis 的时候,需要手动的编写 sql 来提过数据库与类对象之间的映射,这在给开发提供了很大的灵活性的同时,大大增加了开发的工作量。因为更接近底层,所以它更快。
需要用到的jar包:
接下来做个小例子吧(建议你先了解一下mybatis的基本配置信息,推荐个http://mybatis.github.io/mybatis-3/zh/index.html):
(1) 首先,创建两个对象Person和Address,一个Person只能有一个Address,而一个Address可以拥有多个Person对象。也就是Address (1)——>(n)Person(一对多关系)
Person对象的代码如下:
public class Person { private Integer id;//用户id private String name;//用户名称 private Address address;//一个Person只能有一个Address public Person() { super(); } //构造方法,便于测试 public Person(String name, Address address) { this.name = name; this.address = address; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } }
Address对象:
import java.util.List; public class Address { private Integer id;//住址的id private String address;//住址描述 private Listpersons;//一个住址可以有多个Person的关系体现 public Address(){} public Address(String add , List p){ this.address = add; this.persons = p; } public Address(String add){ this.address = add; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public List getPersons() { return persons; } public void setPersons(List persons) { this.persons = persons; } }
(2)*然后非常重要的一步是在数据库中建表,你的表得手动建立,不能像Hibernate那样可以自动生成。所以你得要弄清表关系以及表结构。
Person与Address的关系为一对多,所以可以由Person表通过引入外键:Address的id来体现他们之间的关系。所以,Person和Address对应的建表SQL语句如下:
CREATE TABLE test.`address` ( `address_id` int(10) NOT NULL auto_increment, `address` varchar(20) NOT NULL unique, PRIMARY KEY (`address_id`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk ; CREATE TABLE test.`person` ( `person_id` int(10) NOT NULL auto_increment, `person_name` varchar(20) NOT NULL unique, `address_id` int(10), PRIMARY KEY (`person_id`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk ; alter table test.`person` add foreign key (address_id) references test.`address`(address_id);
(3)编写jdbc.properties配置文件,配置数据库连接所需要的元素,采用这种方式可以使你切换数据库或修改数据库连接选项的时候更加方便。
jdbc.properties:
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/test jdbc.username=root jdbc.password=521521
(4)配置mybatis.xml文件
mybatis.xml配置如下:
(5)那么接下来是最重要的实体的映射文件的配置。获取你可以参考以下内容帮你更快的了解各项配置的详细信息:
http://www.ibm.com/developerworks/cn/opensource/os-cn-ibatis/
AddressMapper.xml:
insert into address(address) values(#{address})
PersonMapper.xml配置(这个就不多做解释):
insert into person(person_name,address_id) values(#{name},#{address.id})
(6)剩下的就是测试了,测试代码如下:
先编写一个工具类,用于创建SqlSessionFactory(每 一 个 MyBatis 的 应 用 程 序 都 以 一 个 SqlSessionFactory 对 象 的 实 例 为 核 心 。):
MybatisSqlSessionFactoryUtil:
package com.mybatis.util; import java.io.IOException; import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MybatisSqlSessionFactoryUtil { public static SqlSessionFactory sqlSessionFactory; static { String resource = "mybatis.xml"; Reader reader = null; try { reader = Resources.getResourceAsReader(resource); } catch (IOException e) { // TODO Auto-generated catch block System.out.println(resource+" file read error!"); e.printStackTrace(); } sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); } public static SqlSessionFactory getSqlSessionFactory() { return sqlSessionFactory; } }
测试代码如下:
package com.mybatis.util; import java.util.ArrayList; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import com.mybatis.domain.Address; import com.mybatis.domain.Person; import com.mybatis.domain.User; public class PersonAddressTest { public static void main(String[] args) { //获得sqlSessionFactory SqlSessionFactory sqlSessionFactory = MybatisSqlSessionFactoryUtil .getSqlSessionFactory(); //开启sqlSession SqlSession session = sqlSessionFactory.openSession(); //插入address记录 for(int i=0;i<20;i++){ Address a = new Address("甘井子区"+i+"号"); session.insert("com.mybatis.domain.AddressMapper.addAddress",a); } //插入person记录 for(int i = 0;i<10;i++){ Address address = session.selectOne("com.mybatis.domain.AddressMapper.getAddressById", i); Person p = new Person(); p.setName("user"+i); p.setAddress(address); session.insert("com.mybatis.domain.PersonMapper.addPerson", p); } //根据id获取记录 Person p = session.selectOne("com.mybatis.domain.PersonMapper.getPersonById",10); Address add = p.getAddress(); System.out.println("User "+p.getName()+"'s address is "+add.getAddress()); //获取所有的记录 Listpersons = new ArrayList (); persons = session.selectList("com.mybatis.domain.PersonMapper.getAllPerson"); for(int i = 0;i (7)结果:
数据库中:
本人系初学,如有什么错误及不当的地方,请各位大神批评指正,愿与君共勉!(当然你也可以喷我,那只是你不了解我而已,等你了解我了,你会忍不住打我的!)
声明:请随意转载,请不要注明出处!