您的位置:首页 > 其它

MyBatis入门教程及基础进阶

2016-05-03 17:31 1056 查看
转载请注明出处:http://blog.csdn.net/qq_15002323/article/details/51306354

MyBatis简介

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。

用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类—-Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。

MyBatis之初体验

1.准备工作

创建“初体验”数据库(MySQL),设计简单表结构,填充测试数据:





下载相关jar包(mybatis-3.1.1.jar,mysql-connector-java-5.1.6-bin.jar)

2.创建工程

新建一个普通Java工程



新建libs文件夹,将上面的两个jar包添加进来,然后add to build path:



3.编码实现

在src目录新建三个package:model,mapper,test;

model中新建User类:

package model;

public class User {

private int id;

private String name;

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 int getAge() {
return age;
}

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

@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}


mapper中添加userMapper.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的唯一,通常包名+文件名 -->
<mapper namespace="mapper.userMapper">
<select id="findAll" resultType="model.User">
select * from user
</select>
</mapper>


conf.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://localhost:3306/mybatis-tutorial" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>

<!-- resource需要写成路径的形式 -->
<mappers>
<mapper resource="mapper/userMapper.xml"/>
</mappers>
</configuration>


在test包下新建测试类Test.java:

package test;

import java.io.InputStream;
import java.util.List;

import model.User;

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

public class Test {

public static void main(String[] args) {
String resource = "mapper/conf.xml";
InputStream is = Test.class.getClassLoader().getResourceAsStream(
resource);
// build接受不同的参数,可采取其他方法创建SqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
.build(is);
SqlSession session = sessionFactory.openSession();
String statement = "mapper.userMapper.findAll";
// session拥有多个方法,可以自行研究
List<User> users = session.selectList(statement);
for (User user : users) {
System.out.println(user);
}
}
}


完成了的效果就是这样滴:



4.激情测试

运行Test.java,观看控制台输出:



提高

虽然只是个入门篇,但我们都有颗求知的心。嗯,学习学习= ̄ω ̄=

参数传递

修改上述userMapper.xml,添加单个查询:

<!-- 查询参数用#{}表示,注明parameterType类型 -->
<select id="findUserByName" parameterType="String" resultType="model.User">
select * from user where name = #{name}
</select>


那么调用语句随之也会改变:

String statement = "mapper.userMapper.findUserByName";
List<User> users = session.selectList(statement, "科比");




那么传递多个参数咧,有几种方法,但是适合自己就是最好的,我比较喜欢用map:

<select id="findUserByNameAndAge" parameterType="Map" resultType="model.User">
select * from user where name = #{name} and age = #{age}
</select>


同时修改调用代码:

String statement = "mapper.userMapper.findUserByNameAndAge";
Map<String, String> params = new HashMap<String, String>();
params.put("name", "科比");
params.put("age", "18");
List<User> users = session.selectList(statement, params);


测试通过:



配置优化

程序猿都是非常懒的,反正我就这样。。上面mapper里面每次用到User类时,都需要写出全名
resultType="model.User"
。若是工程大了,写的地方多了,忒累了啊。我们可以给这个类起一个别名,这个需要在conf.xml的
<configuration></configuration>
里面配置:

<typeAliases>
<typeAlias alias="user" type="model.User"/>
</typeAliases>


这样我们用的时候就不用写全称了,直接写这个别名就行:

<select id="findAll" resultType="user">
select * from user
</select>


可能,我们编写的model与数据库字段不对应,这样还能正常运行程序吗?一试便知,修改User代码:

package model;

public class User {

private int id;

private String name;

private int score;

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 int getScore() {
return score;
}

public void setScore(int score) {
this.score = score;
}

@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", score=" + score + "]";
}
}


就只是将age换成了score了,运行程序:



很明显score这个属性没有被正常赋值,这个时候我们就需要用resultMap了,修改mapper下的userMapper.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的唯一,通常包名+文件名 -->
<mapper namespace="mapper.userMapper">

<resultMap type="user" id="user">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="score"/>
</resultMap>

<select id="findAll" resultMap="user">
select * from user
</select>
</mapper>


运行程序,期待结果吧:



这样就完美解决了表字段与类属性不对应的情况了。嗯嗯~~

那么数据库配置就这样写在xml里面是不是有失妥当,额,新建一个db.properties:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis-tutorial
username=root
password=123456


同时需要修改conf.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>
<!-- 注意:每个标签必须按顺序写,不然蛋疼的DTD会提示错误:The content of element type "configuration"
must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?,mappers?)". -->
<properties resource="db.properties" />

<typeAliases>
<typeAlias alias="user" type="model.User" />
</typeAliases>

<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>

<!-- resource需要写成路径的形式 -->
<mappers>
<mapper resource="mapper/userMapper.xml" />
</mappers>
</configuration>


完美运行啊有木有,目前就知道这么多了,我也是小白一枚,第一次学就写这个当笔记吧,要是有错误的地方读者一定要吐槽下,定当改正。拜拜(^__^) 嘻嘻……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息