1.4 开发步骤(推荐)
新建JAVA项目或WEB项目
部署jar包(包括数据库驱动包):使用MyBatis需要先下载jar包
编写主配置文件
创建数据库及表(如已创建,可省略)
创建实体类及SQL映射文件
编写数据库接口及实现
编写测试类及测试
1.5 开发示例
1.5.1 新建项目
新建java项目或web 项目。我的工程目录结构如下图
1.5.2 导入JAR包
导入mybatis和数据库驱动包、日志包(配置日志配置文件),下载地址(http://pan.baidu.com/s/1kUARvc7)。
1.5.3 创建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指的是使用哪个数据源 -->
<environments default="person">
<!--environment定义数据源的信息 -->
<environment id="person">
<!-- type="JDBC"表示事务由jdbc连接管理,type="MANAGED"表示事务由容器来管理 -->
<transactionManager type="JDBC" />
<!-- type="POOLED"表示使用连接池, type="UNPOOLED"表示不使用连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_?useUnicode=true&characterEncoding=UTF-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 加入映射文件信息 -->
<mappers>
<mapper resource="cn/wxz/entity/PersonMapper.xml" />
</mappers>
</configuration>
1.5.4 创建数据库及表
drop databaseif exists person;
create database person CHARACTERSET UTF8;
use person;
create table person(
id int primarykey auto_increment,
name varchar(50),
age int
);
insert into person
(name,age) values('wxz',18);insert into
person (name,age)values('wxz2',19);insert into person (name,age) values(wxz3,20);
select * from person;
1.5.5 创建实体类:Person.java
package cn.wxz.entity;
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = -2525513725816258556L;
private Integer id;
private String name;
private int age;
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [age=" + age + ", id=" + id + ", name=" + name + "]";
}
}
1.5.6 创建SQL映射文件及修改主配置文件
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的值是自己定义的-->
<mapper namespace="cn.wxz.PersonMapper">
<!-- type指定的是对应的实体类 -->
<resultMap type="cn.wxz.entity.Person" id="personResultMap">
<!-- id用来配置表的主键与类的属性的映射关系 ,column指定的是表的字段名; property指定的是类的属性名-->
<id column="id" property="id"/>
<!-- result用来配置 普通字段与类的属性的映射关系 ,column指定的是表的字段名; property指定的是类的属性名-->
<result column="name" property="name"/>
<result column="age" property="age"/>
</resultMap>
<!-- 添加一第记录 ; 定义插入的sql语句,通过命名空间+id方式被定位 -->
<insert id="insertDept" parameterType="cn.wxz.entity.Person">
<!-- #{} 用来获取传过来的参数 -->
insert into person(name,age) values(#{name},#{age})
</insert>
<update id="update" parameterType="cn.wxz.entity.Person">
update person set name=#{name} where age=#{age}
</update>
<delete id="delete" parameterType="cn.wxz.entity.Person">
delete from person where age=#{age}
</delete>
<!-- 省略其它的配置信息 -->
<!--返回单条记录,表字段和对应实体属性命名一致时可以不使用resultMap属性配置,直接使用resultType="返回的全类名或别名",建议使用前者;查询结果为所有字段时,也可以用*表示 -->
<select id="selectOne" parameterType="cn.wxz.entity.Person" resultMap="personResultMap" >
select name,id,age from person where age=#{age}
</select>
<!-- 返回多条记录,返回结果配置的不是集合类型,而是集合元素的类型;参数也可以通过Map等方式封装 -->
<select id="selectList" parameterType="cn.wxz.entity.Person" resultMap="personResultMap">
select * from person where name like #{deptName}
</select>
</mapper>
1.5.7 编写数据库操作
包括操作接口及实现,接口略,实现类为:PersonDaoImpl.java
package cn.wxz.dao.impl;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
import java.util.Map;
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 cn.wxz.entity.Person;
import cn.wxz.tool.MyBatisUtil;
public class PersonDaoImpl {
/*
* 1.读取配置文件信息
* 2。构建session工厂
* 3。创建session
* 4.开启事务(可选)
* 5。处理数据
* 6。提交、回滚事务
* 7。关闭session
*
*/
SqlSession session = null;
public int save(Person person){
int i=0;
try {
session=MyBatisUtil.getSession();
//方法的第一个参数为DeptMapper.xml文件的命名空间+id
i=session.insert("cn.wxz.PersonMapper.insertDept",person);
System.out.println("受影响行数:"+i);
session.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
session.rollback();
}finally{
MyBatisUtil.closeSession();
}
return i;
}
public int update(Person person){
int i=0;
try {
session=MyBatisUtil.getSession();
//方法的第一个参数为DeptMapper.xml文件的命名空间+id
i=session.update("cn.wxz.PersonMapper.update",person);
System.out.println("受影响行数:"+i);
session.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
session.rollback();
}finally{
MyBatisUtil.closeSession();
}
return i;
}
public int delete(Person person){
SqlSession session = null;
int i=0;
try {
session=MyBatisUtil.getSession();
//方法的第一个参数为DeptMapper.xml文件的命名空间+id
i=session.update("cn.wxz.PersonMapper.delete",person);
System.out.println("受影响行数:"+i);
session.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
session.rollback();
}finally{
MyBatisUtil.closeSession();
}
return i;
}
public Person query(int age){
Person person=null;
try {
session=MyBatisUtil.getSession();
person=(Person)session.selectOne("cn.wxz.PersonMapper.selectOne",age);
System.out.println("dept:"+person);
} catch (Exception e) {
e.printStackTrace();
}finally{
MyBatisUtil.closeSession();
}
return person;
}
public List<Person> selectList(Map map){
List<Person> persons=null;
try {
session=MyBatisUtil.getSession();
persons=session.selectList("cn.wxz.PersonMapper.selectList",map);
} catch (Exception e) {
e.printStackTrace();
}finally{
MyBatisUtil.closeSession();
}
return persons;
}
public List<Person> selectListUseIf(Person person){
List<Person> persons=null;
try {
session=MyBatisUtil.getSession();
persons=session.selectList("cn.wxz.PersonMapper.selectListUseIf",person);
} catch (Exception e) {
e.printStackTrace();
}finally{
MyBatisUtil.closeSession();
}
return persons;
}
public List<Person> selectListUseWhere(Person person){
List<Person> persons=null;
try {
session=MyBatisUtil.getSession();
persons=session.selectList("cn.wxz.PersonMapper.selectListUseIf",person);
} catch (Exception e) {
e.printStackTrace();
}finally{
MyBatisUtil.closeSession();
}
return persons;
}
}
1.5.8 编写测试类
需要导入junit包
package cn.wxz.test;
import static org.junit.Assert.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import cn.wxz.dao.impl.PersonDaoImpl;
import cn.wxz.entity.Person;
public class TestDeptDaoImpl {
private static PersonDaoImpl personDaoImpl;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
personDaoImpl = new PersonDaoImpl();
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
personDaoImpl = null;
}
@Test
public void test() {
Person person = new Person();
person.setName("222");
person.setAge(25);
System.out.println("受影响 的行数:"+personDaoImpl.save(person));
}
@Test
public void testUpdate() {
Person person = new Person();
person.setName("ni shi a ");
person.setAge(25);
System.out.println("受影响 的行数:"+personDaoImpl.update(person));
}
@Test
public void testDelete() {
Person person = new Person();
person.setAge(25);
System.out.println("受影响 的行数:"+personDaoImpl.delete(person));
}
@Test
public void testQuery() {
Person person = new Person();
person.setAge(25);
Person query = personDaoImpl.query(person.getAge());
System.out.println("受影响 的行数:"+query);
}
@Test
public void testSelectList() {
Map map=new HashMap();
map.put("deptName", "%真%");
List<Person> persons=personDaoImpl.selectList(map);
for(Person person:persons){
System.out.println("person:"+person);
}
}
@Test
public void testSelectListUseIf() {
Person person2 = new Person();
person2.setAge(25);
person2.setName("222");
List<Person> persons=personDaoImpl.selectListUseIf(person2);
for(Person person:persons){
System.out.println("person:"+person);
}
}
@Test
public void testSelectListUseWhere() {
Person person2 = new Person();
person2.setId(13);
person2.setAge(25);
person2.setName("真棒");
List<Person> persons=personDaoImpl.selectListUseIf(person2);
for(Person person:persons){
System.out.println("person:"+person);
}
}
}
2.基本的CRUD操作
2.1 准备工作(继续使用前面的库表和代码)
2.2 别名与自定义别名
2.2.1 内置别名
对常用的 java 类型,已经内置了一些别名支持。这些别名都是不区分大小写的。(详细参看用户手机)
2.2.2 自定义别名
在myBatis的主配置文件给cn.itcast.entity.Dept类创建别名Dept,后继的DeptMapper.xml配置文件中可以使用别名
<!-- 通过别名简化对类的使用 -->
<typeAliases>
<typeAliastype="cn.itcast.entity.Dept"alias="Dept"/>
</typeAliases>
2.3 MyBatisUtil工具类
package cn.wxz.tool;
import java.io.IOException;
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;
public class MyBatisUtil {
private static final ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
private static SqlSessionFactory sessionFactory;
private static String CONFIG_FILE_LOCATION = "myBatis-config.xml";
static {
try {
buildSessionFactory();
} catch (Exception e) {
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
private MyBatisUtil() {
}
/**
* Returns the ThreadLocal Session instance. Lazy initialize
* the <code>SessionFactory</code> if needed.
*
* @return Session
* @throws Exception
*/
public static SqlSession getSession() throws Exception {
SqlSession session = (SqlSession) threadLocal.get();
if (session == null) {
if (sessionFactory == null) {
buildSessionFactory();
}
session = (sessionFactory != null) ? sessionFactory.openSession()
: null;
threadLocal.set(session);
}
return session;
}
/**
* build session factory
*
*/
public static void buildSessionFactory() {
Reader reader=null;
try {
reader=Resources.getResourceAsReader(CONFIG_FILE_LOCATION);
sessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}finally{
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* Close the single session instance.
*
*/
public static void closeSession(){
SqlSession session = (SqlSession) threadLocal.get();
threadLocal.set(null);
if (session != null) {
session.close();
}
}
/**
* return session factory
*
*/
public static SqlSessionFactory getSessionFactory() {
return sessionFactory;
}
}