mybatis学习笔记(一)初识mybatis

MyBatis 是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis 摒除了大部分的JDBC代码、手工设置参数和结果集重获。MyBatis 只使用简单的XML 和注解来配置和映射基本数据类型、Map 接口和POJO 到数据库记录。相对hibernate“一站式”ORM解决方案而言,Mybatis 是一种“半自动化”的ORM实现。

orm工具的基本工作流程
无论是用过的hibernate,mybatis,你都可以看到他们有一个共同点:
1. 从配置文件(通常是XML配置文件中)得到 sessionfactory.
2. 由sessionfactory 产生 session
3. 在session 中完成对数据的增删改查和事务提交等.
4. 在用完之后关闭session 。


MyBatis的简单入门

(一)需要的jar包,本测试用mysql所需要以下包
mybatis-3.2.2.jar(mybatis核心包)
mysql-connector-java-5.0.8-bin(mysql的工具包)

(二)创建一个java工程,把上面的jar添加入内,工程的结构如下
[img]http://dl2.iteye.com/upload/attachment/0117/7564/45740c12-a345-3174-bce1-7d46dcb51e25.png[/img]


(三)添加Mybatis的配置文件mybatis-config.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>
<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/test?characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>

<mappers>
<!-- 注册映射xml文件,personMapper.xml位于com.lql.study.model这个包下,
所以resource写成com.lql.study.model/personMapper.xml-->
<mapper resource="com/lql/study/model/personMapper.xml"/>
</mappers>
</configuration>




(四)定义person表所对应的实体类,实体类中的属性命名与表字段命名保持一至,person的表结构如下图

[img]http://dl2.iteye.com/upload/attachment/0117/7597/cefac34b-0663-3e99-a26f-2cb3f55d6dd9.png[/img]




package com.lql.study.model;

import java.sql.Timestamp;
import java.util.HashSet;
import java.util.Set;

public class Person {

private Integer pid;
private String name;
private String sex;
private Integer age;
private String remark;
private Timestamp createtime;


// Constructors

/** default constructor */
public Person() {
}

/** full constructor */
public Person(String name, String sex, Integer age, String remark,
Timestamp createtime) {
this.name = name;
this.sex = sex;
this.age = age;
this.remark = remark;
this.createtime = createtime;

}

// Property accessors

public Integer getPid() {
return this.pid;
}

public void setPid(Integer pid) {
this.pid = pid;
}

public String getName() {
return this.name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return this.sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public Integer getAge() {
return this.age;
}

public void setAge(Integer age) {
this.age = age;
}

public String getRemark() {
return this.remark;
}

public void setRemark(String remark) {
this.remark = remark;
}

public Timestamp getCreatetime() {
return this.createtime;
}

public void setCreatetime(Timestamp createtime) {
this.createtime = createtime;
}


}




(五)定义操作person表的sql映射文件personMapper.xml


<?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">

<!-- 命名空间namespace:习惯上设置成包名+实体po映射文件名,这样就能够保证namespace的值是唯一的

例如namespace="com.lql.study.model.personMapper"就是com.lql.study.model(包名)+personMapper(personMapper.xml文件去除后缀)

-->

<!-- 根据id查询得到一个person对象-->
<mapper namespace="com.lql.study.model.personMapper">
<!-- 在select标签中编写查询的SQL语句
id:select标签的唯一标识
parameterType:指明查询时使用的参数类型
resultType:指明查询返回的结果集类型
#{pid}:代表查询参数值
-->
<select id="getPerson" parameterType="int" resultType="com.lql.study.model.Person">
select * from person where pid=#{pid}
</select>
</mapper>




(六)编写一个测试类


package com.lql.study.action;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.lql.study.model.Person;


public class TestPerson {

//mybatis的配置文件
private String resource = "mybatis-config.xml";

private SqlSessionFactory sessionFactory;
public TestPerson() throws IOException
{
//使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)
Reader reader = Resources.getResourceAsReader(resource);
//构建sqlSession的工厂
this.sessionFactory = new SqlSessionFactoryBuilder().build(reader);
}


public Person selectById(int pid)
{
//创建能执行映射文件中sql的sqlSession
SqlSession session = sessionFactory.openSession();
/*** 映射sql的标识字符串,
* * com.lql.study.model.personMapper是personMapper.xml文件中mapper标签的namespace属性的值,
* getPerson是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
* */

String statement = "com.lql.study.model.personMapper.getPerson";//映射sql的标识字符串由映射文件里的namespace+select id组成 执行查询返回一个唯一person对象的sql
//selectOnet顾名思义是查询单个对象,pid是输入参数,例如查询person中pid=46的记录
Person person1 = session.selectOne(statement,pid);
System.out.println(person1.getName());

session.close();
return person1;
}

public static void main(String[] args)
{


try {
TestPerson test= new TestPerson();
test.selectById(46);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}
}



(七)接口方式编程

上面这种方式是用SqlSession实例来直接执行已映射的SQL语句:
session.selectOne("com.lql.study.model.personMapper.getPerson", 46)
其实还有更好的方法,使用合理描述参数和SQL语句返回值的接口,这样子更简单更安全,没有容易发生的字符串文字和转换的错误.下面是详细过程:

1.建立接口类 IPersonOption , 内容如下:

package com.lql.study.action;
import com.lql.study.model.Person;

public interface IPersonOption {

public Person getPerson(int pid);
}


注意,这里面有一个方法名 getPerson必须与 PersonMapper.xml 里面配置的 select 的id 对应(<select id="getPerson")

2.修改PersonMapper.xml中的命名空间namespace使之指向接口


namespace="com.lql.study.action.IPersonOption"


3.修改测试类



public Person selectById(int pid)
{

//以下是接口方法方式
IPersonOption op=session.getMapper(IPersonOption.class);
Person person2=op.getPerson(pid);
System.out.println(person2.getName());
session.close();
return person2;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值