您的位置:首页 > 数据库 > MySQL

MyBatis入门实例

2017-01-09 17:13 633 查看

MyBatis入门实例

一、概述

MyBatis是一个优秀的持久层框架,ORM框架,可以使用XML配置文件或者接口加注解的方式来简化DAO操作,大大方便了SQL语句的管理。同时,MyBatis还支持动态SQL语句。由于注解的功能极为有限,这里采用XML配置文件的方式。

二、创建数据库和数据表

在MySQL创建数据库和数据表:

CREATE DATABASE test;
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`sex` char(1) NOT NULL,
`age` int(11) DEFAULT NULL,
`birthday` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;


三、在IDEA创建Maven项目

参考http://blog.csdn.net/ac_dao_di/article/details/54233520,最后在pom.xml添加MyBatis和MySQL依赖的jar包:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>com.baobao</groupId>
<artifactId>javaee_idea</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>javaee_idea Maven Webapp</name>
<url>http://maven.apache.org</url>

<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.5</version>
</dependency>

</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 注意此处的url,上传javaee_idea.war到url,此时本地的tomcat服务器必须开启 -->
<url>http://localhost:8080/manager/text</url>
<!-- 此处的名字必须和setting.xml中配置的ID一致,而该id对应的用户必须在tomcat的conf/tomcat-users.xml有配置-->
<server>tomcat8</server>
<!-- 此处的名字是项目发布的工程名 : http://localhost:8080/javaee_idea,也是war名--> <path>/javaee_idea</path>
</configuration>
</plugin>
</plugins>
<finalName>javaee_idea</finalName>
</build>
</project>


四、创建持久层类

4.1 创建JavaBean

对应上面的数据库表student新建一个JavaBean: src/main/java/com.baobao.Student:

package com.baobao;

import java.util.Date;

/**
* Created by gzx on 17-1-8.
*/
public class Student {
private int id;
private String name;

private Date birthday;
private String sex;
private int age;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

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

public Date getBirthday() {
return birthday;
}

public void setBirthday(Date birthday) {
this.birthday = birthday;
}

public String getSex() {
return sex;
}

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

public int getAge() {
return age;
}

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

@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}


4.2 创建MyBatis核心配置文件

在main/resources/下建立MyBatis的配置文件mybatis.xml,文件名可以任意取。这个文件主要是配置数据库的驱动信息和连接信息,以及配置好类的类型别名,所有JavaBean的Mapper文件路径。

<?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>
<!-- 类名比较长,起别名,在Mapper文件中可以使用-->
<typeAliases>
<typeAlias type="com.baobao.Student" alias="Student"/>
</typeAliases>
<environments default="development">
<environment id="development">
<!-- 事务管理类型,JDBC表示直接使用JDBC的提交和回滚设置,依赖于数据源得到的连接来管理事务 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池POOLED表示使用数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="201314" />
</dataSource>
</environment>
</environments>

<mappers>
<!-- SQL代码和映射信息配置文件 -->
<mapper resource="com/baobao/studentMapper.xml" />
</mappers>
</configuration>


4.3 创建Mapper文件,实现DAO

在main/resources/下建立上面mybatis.xml文件里的Mapper文件:com/baobao/studentMapper.xml。对于每个JavaBean,都可以写一个对应的Mapper文件。这个文件封装了数据表和JavaBean的映射关系,对该数据表的操作,主要是增删改查。

<?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="com.baobao.studentMapper">
<!-- id是主键,result是其他属性,完成JavaBean和数据库表字段的映射-->
<!-- 当名字不对应时,需要完成映射-->
<!--
<resultMap type="Student" id="studentResultMap">
<id column="id" jdbcType="int" property="id" javaType="int"/>
<result column="name" jdbcType="varchar" property="name" javaType="String"/>
<result column="sex" jdbcType="char" property="sex" javaType="String"/>
<result column="age" jdbcType="int" property="age" javaType="int"/>
<result column="birthday" jdbcType="Date" property="birthday" javaType="Date"/>
</resultMap>
-->
<!-- DAO 操作 -->
<!-- #{} 表示一个属性getId(),注意parameterType只能是Map或者基本类型或者自定义类,不能有多个parameterType-->
<select id="getStudentById" parameterType="int" resultType="Student">
<!-- #{id}:表示占位符,也就是调用时必须为其传一个id参数进来,注意是#不是$ -->
select * from student where id = #{id}
</select>

<!-- 输入字符串参数 -->
<select id="getStudentByName" parameterType="String" resultType="Student">
<!-- #{id}:表示占位符,也就是调用时必须为其传一个id参数进来,注意是#不是$ -->
select * from student where name = #{name}
</select>

<!-- 指定ID为主键,并自动生成主键 -->
<insert id="insertStudent" parameterType="Student" useGeneratedKeys="true" keyProperty="id">
insert into student(name, sex, age, birthday) values(#{name}, #{sex}, #{age}, #{birthday})
</insert>

<!-- 输入Student参数-->
<update id="updateStudent" parameterType="Student">
update student set name=#{name}, sex=#{sex},age=#{age},birthday=#{birthday} where id=#{id}
</update>

<delete id="deleteStudent" parameterType="int">
delete from student where id=#{id}
</delete>
</mapper>


五、使用MyBatis API

5.1 创建获取SqlSessionFactory单例的工厂类

在src/main/java/下创建一个工厂类com.baobao.Factory,使得全局只用一个实例SqlSessionFactory。

package com.baobao;

import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

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

public class Factory{
private static SqlSessionFactory sqlSessionFactory;
static{
// 1. 加载MyBatis的配置文件:mybatis.xml(它也加载关联的映射文件,也就是mappers结点下的映射文件)
InputStream in = Factory.class.getClassLoader().getResourceAsStream("mybatis.xml");
assert(in != null);
// 2. SqlSessionFactoryBuidler实例将通过输入流调用build方法来构建 SqlSession 工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 整个应用只用一个单例的factory
* @return
*/
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory;
}
}


5.2 创建单元测试类

创建test/java/com.baobao.TestMybatis,实现对Student数据表操作的测试。这里主要是使用MyBatis的API:通过加载MyBatis的配置文件,实现对数据表的增删改查。

package com.baobao;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;

import java.util.Calendar;
import java.util.List;

public class TestMybatis {
@Test
public void testGetStudent(){
System.out.println(".............................getStudent.............................");
// 获取工厂
SqlSessionFactory sqlSessionFactory = Factory.getSqlSessionFactory();
// 通过工厂获取 SqlSession 实例,SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。
SqlSession session = sqlSessionFactory.openSession();

System.out.println("one...");
// 通过namespace.id定位SQL语句
String statement = "com.baobao.studentMapper.getStudentById";
// select API : 获取一条记录
Student student = session.selectOne(statement, 3);
System.out.println(student);

System.out.println("list...");
statement = "com.baobao.studentMapper.getStudentByName";
String name = "Tom";
// select API : 获取一个list
List<Student> list = session.selectList(statement, name);
for(Student tmp : list){
System.out.println(tmp);
}
// 关闭输入流和SqlSession实例。SqlSession当场销毁
session.close();
}

@Test
public void testInsertStudent(){
System.out.println(".............................insertStudent.............................");
SqlSessionFactory sqlSessionFactory = Factory.getSqlSessionFactory();
SqlSession session = sqlSessionFactory.openSession();

Student student = new Student();
student.setName("Tom");
student.setAge(27);
student.setSex("m");
Calendar calendar = Calendar.getInstance();
//calendar.set(1995, 8, 20, 11, 23, 47);
student.setBirthday(calendar.getTime());
// insert API
int cnt = session.insert("com.baobao.studentMapper.insertStudent", student);
assert(cnt == 1);
// 事务必须提交,否则不起作用
session.commit();
session.close();
}

@Test
public void testDeleteStudent(){
System.out.println(".............................deleteStudent.............................");
SqlSessionFactory sqlSessionFactory = Factory.getSqlSessionFactory();
SqlSession session = sqlSessionFactory.openSession();
// delete API
session.delete("com.baobao.studentMapper.deleteStudent", 2);
session.commit();
session.close();
}

@Test
public void testUpdateStudent(){
System.out.println(".............................updateStudent.............................");
SqlSessionFactory sqlSessionFactory = Factory.getSqlSessionFactory();
SqlSession session = sqlSessionFactory.openSession();
Student student = new Student();
student.setId(3);
student.setName("Amy");
student.setAge(20);
student.setSex("F");
Calendar calendar = Calendar.getInstance();
// calendar.set(1997, 2, 20);
student.setBirthday(calendar.getTime());
// System.out.println(calendar.getTime());
// update API
int cnt = session.update("com.baobao.studentMapper.updateStudent", student);
session.commit();
session.close();
}
}


最后直接在IDEA运行测试,或者在根目录下运行mvn clean test。测试通过。

项目的目录结构如下:



本项目的源码下载 : http://download.csdn.net/download/ac_dao_di/9732835

参考:

http://www.cnblogs.com/bluejoe/p/5115930.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息