终于算是把Mybatis的入门做完了,做的时候各种bug,接下来我会一次讲解。
首先呢,我先大致讲解下过程吧(笔者以MySQL为例):
1.引入Mybatis和Mysql-connection的jar包。
2.编写通过Mybatis连接数据库的XML配置文件,这里两种方法,我会在后面一次介绍。
3.编写需要操作的Pojo类。
4.编写3步中的pojo与数据链接的XML配置文件。
5.编写DAO层。
然后给大家看一下整个目录结构,会有利于理解接下来的内容,因为很多人都会困惑这个或者那个文件应该放在那里:
好的,我来详细解释吧:第一步就略过了,看第二步,Mybatis连接数据库的XML配置文件的名字是任意起的,也可以放在任何地方,因为Mybatis是在客户端需要的时候来加载这个配置文件,所以你之需要能让客户端找到你的XML配置文件就好了,看一下它的俩面详细代码:
<?xml version="1.0" encoding="UTF-8"?>
<!-- !DOCTYPE指定文件使用DTD进行校验 <!DOCTYPE 根元素 PUBLIC "注册//组织//类型 标签//定义 语言" "文档类型定义位置" -->
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://localhost:8080/IBatisDemo/sql-map-config.dtd">
<sqlMapConfig>
<properties resource="com/saymagic/config/SqlMap.properties"/>
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="${driver}" />
<property name="JDBC.ConnectionURL" value="${url}" />
<property name="JDBC.Username" value="${username}" />
<property name="JDBC.Password" value="${password}" />
</dataSource>
</transactionManager>
<sqlMap resource="com/saymagic/config/character.xml"/>
</sqlMapConfig>
这里面需要注意的几点:
1.我们这个xml文件的dtd引入的是工程自己的,因此会有localhost--什么的,详细方法大家可以查看上一篇教程。
2 .<properties resource="com/saymagic/config/SqlMap.properties"/>这句话的意思是引入另外的配置文件SqlMap.properties,这就是我说为什么Mybatis连接数据库的XML配置文件有两种方法的原因,在引入了SqlMap.properties以后,我们就可以通过<propertyname="JDBC.Driver"value="${driver}" />的方法拿到SqlMap.properties里面driver对应的值,这样就把和数据库有关的信息封装到另外的配置文件里,起到数据隔离的作用,SqlMap.properties里面的内容如下,读者可根据自己的实际情况自行更改。
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/ibatissql
username=root
password=magic
第三步也很简单,我就直接略过了,只是简单便也一个bean,我这里写的是一个Character类(意思是三国杀游戏里的人物),里面有name,blood,skill等属性,贴一下代码吧:
package com.saymagic.pojo;
public class Character {
private String name;
private int blood;
private String skill;
private String country;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getBlood() {
return blood;
}
public void setBlood(int blood) {
this.blood = blood;
}
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
第四步是要编写3步中的pojo与数据链接的XML配置文件,这都是一些规定性的东西,不这么配置就不行,所以先直接看内容吧,我起它的名字为:character.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://localhost/sql-map-2.dtd">
<sqlMap>
<typeAlias alias="Character" type="com.saymagic.pojo.Character"/>
<insert id="addCharacter" parameterClass="Character">
INSERT INTO `character`(`blood`, `name`, `state`, `skill`) VALUES (#blood#,#name#,#country#,#skill#)
</insert>
<select id="selectCharacterByName" parameterClass="String" resultClass="Character">
select * from `character` where name=#name#
</select>
<delete id="deleteCharacterByName" parameterClass="String">
<!-- #id#里的id可以随意取,但是上面的insert则会有影响,因为上面的name会从Character里的属性里去查找 -->
<!-- 我们也可以这样理解,如果有#占位符,则ibatis会调用parameterClass里的属性去赋值 -->
delete from `character` where name=#name#
</delete>
<update id="updateCharacter" parameterClass="Character">
update `character` set
blood=#blood#,state=#country#,skill=#country# where name=#name#
</update>
</sqlMap>
解释几个词的意思吧:
1.insert,update等就是说你要对数据库进行操作的是插入还是更新等指令。
2id是一定要有的,这个是在客户端调用时候的依据。
3.parameterClass代表你要传给这个sql语句的参数类型,从这里我们也可以看出mybatis只能传递一个参数,这也就是它很不足的一个地方,
4.resultClass代表你要返回的类型。
5.#name# 、#country#这些#包起来的代表站位符,也就是你在客户端可以对他们赋值。
6.笔者数据库的原因,在执行select * from `character` where name=#name#等等sql语句的时候,表名必须要加`符号,读者可根据自己情况进行修改。
讲了这几点,这个配置文件就应该没什么问题了吧,最后看客户端是怎么调用的吧。
看dao文件:
private static SqlMapClient sqlMapClient = null;
static{
try {
Reader reader = Resources.getResourceAsReader("com/saymagic/config/SqlMapConfig.xml");
sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
这些的意思就是在读取配置文件,并将它转换为Mybatis里面的SqlMapClient对象,接下来我们以插入为例:看一下它的具体方法:
public void addCharacter(Character character) {
//Object object =null;
boolean flag = false;
try {
sqlMapClient.insert("addCharacter",character);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
核心代码只有一句
sqlMapClient.insert("addCharacter",character);