详情网址:http://www.mybatis.org/mybatis-3/zh/index.html;
Mybatis-3.4.4 jar 包下载网址:https://github.com/mybatis/mybatis-3/releases
eclipse中propertise插件的安装教程:https://my.oschina.net/u/3422045/blog/902165
-
一、Mybatis简介
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
通俗来说,首先Mybatis是一种框架,javabean类将数据库的记录映射成java对象,Mybatis自动取得对象的结果集(避免 object.id = xx;object.name = xx)。
Mybatis使用普通的xml文件构造,需将 mybatis-x.x.x.jar 文件置于 classpath 中,如果使用maven(项目管理软件)进行构造,jar包不需要放在项目里,只需联网,从maven仓库下载即可。阿里maven仓库网址:http://maven.aliyun.com/nexus/content/groups/public/;
-
二、Mybatis应用目录结构
/my_application /bin /devlib /lib <-- MyBatis *.jar文件在这里。 /src /org/myapp/ /action /data <-- MyBatis配置文件在这里, 包括映射器类, XML配置, XML映射文件。 /mybatis-config.xml /BlogMapper.java /BlogMapper.xml /model /service /view /properties <-- 在你XML中配置的属性 文件在这里。 /test /org/myapp/ /action /data /model /service /view /properties /web /WEB-INF /web.xml
此次项目的目录结构如下:
-
三、Mybatis配置及使用
以Mysql数据库atm数据库下 a_card表为例,进行阐述,a_card表结构为:
1.导入jar包
项目lib文件夹下加载数据库驱动mysql-connector-java-5.1.42-bin.jar和Mybatis的mybatis-3.4.4.jar文件并建立路径。
2. 配置主文件mybatis-config.xml
需要主要配置property,typeAlias,environment,mapper等。
<?xml version="1.0" encoding="UTF-8" ?>
<!--要注意 XML 头部的声明,用来验证 XML 文档正确性。 -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="config.properties" />
<typeAliases>
<typeAlias alias="Card" type="com.dayuan.data.Card" />
</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>
<mappers>
<package name="com.dayuan.data" />
</mappers>
</configuration>
property配置所依赖的文件:
<properties resource="config.properties" />
config.properties文件的内容是:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/atm?useSSL=true
username=root
password=123123
property元素引用jdbc.properties文件中的属性值, #{username}是指需要动态配置的变量。
typeAlias定义mybatis操作的类的简化名称 ,在Mybatis主配置文件中定义的假名在mybatis使用的全局生效。
<typeAliases>
<typeAlias alias="Card" type="com.dayuan.data.Card" />
</typeAliases>
environment 元素体中包含了事务管理和连接池的配置。
mappermappers 元素则是包含一组 mapper 映射器(这些 mapper 的 XML 文件包含了 SQL 代码和映射定义信息),指定 SQL语句编写 的位置,例如指定某个.xml文件:
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
3. 创建与表格相对应的三个文件(实体类(javabean)、mapper.java(映射类)、mapper.xml(映射文件))
-
①.与表a_card相对应的Card实体类
数据库字段与类中变量相对应
package com.dayuan.data;
public class Card {
private Integer id;
private String cardNo;
private String password;
private Integer money;
private Integer persionId;
private Integer version;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getMoney() {
return money;
}
public void setMoney(Integer money) {
this.money = money;
}
public Integer getPersionId() {
return persionId;
}
public void setPersionId(Integer persionId) {
this.persionId = persionId;
}
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
}
-
②定义xml映射文件CardMapper.xml
文件中最基本的有两个部分,一是 CardMapper.xml关联到哪个接口(一个表格一个接口),二是文件执行的Sql语句如何定义。
第一个问题通过文件的namespace元素定义:
<mapper namespace="com.dayuan.data.CardMapper">
第二个问题sql语句:
<select id="selectCardById2" parameterType="int" resultType="Card">
select id, card_no as cardNo, password from a_card where id = #{id}
</select>
在命名空间“com.dayuan.data.CardMapper”中定义了一个名为“selectCardById2”的映射语句,这样它就允许你使用指定的完全限定名“com.dayuan.data.CardMapper.selectCardById2”来调用映射语句,前提是使用正确的路径。
语句中,Card类并不存在,但是可以使用是因为在mybatis-config.xml文件中定义了别名
<typeAlias alias="Card" type="com.dayuan.data.Card" />注意路径
-
③定义映射类CardMapper接口
package com.dayuan.data;
public interface CardMapper {
public Card selectCardById2(int param);
}
sql语句和接口中的方法相对应, id="selectCardById2"即为方法名,parameterType="int" 方法中传入参数类型,resultType="Card"方法返回值类型,where id = #{id}方法传入id的值。
4.创建测试类test.java
public class Test {
public static void main(String[] args) {
SqlSession session = null;
try {//1. 用配置文件构建SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);//2. 利用SqlSessionFactory打开一个和数据库的SqlSession,并设置为自动提交,默认是开启事务不会自动提交
session = sqlSessionFactory.openSession(true);
//3. 利用这个SqlSession获取要使用的mapper接口
CardMapper mapper = session.getMapper(CardMapper.class);
//4. 使用mapper接口和数据库交互,运行mapper.xml文件中的SQL语句
Card card = mapper.selectCardById2(1);
System.out.println(card.getCardNo());
} catch (Exception e) {
e.printStackTrace();
} finally {//5. 关闭SqlSession
if (session != null) {
session.close();
}}
}
}
-
四、完整版的CardMapper.xml和接口类CardMapper.java 及测试类
CardMapper.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">
<mapper namespace="com.dayuan.data.CardMapper">
<select id="selectCardById" parameterType="int" resultType="hashmap">
select * from a_card where id = #{id}
</select>
<select id="selectCardById2" parameterType="int" resultType="Card">
select id, card_no as cardNo, password from a_card where id = #{id}
</select>
<!-- 动态sql实例 -->
<select id="selectCardById3" parameterType="hashmap" resultType="Card">
select id, card_no as cardNo, password from a_card
where 1=1
<if test="id != null">
and id = #{id}
</if>
<if test="cardNo != null">
and card_no = #{cardNo}
</if>
</select>
<!-- 动态sql实例 -->
<select id="selectCardById4" parameterType="hashmap" resultType="Card">
select id, card_no as cardNo, password from a_card
where 1=1
<choose>
<when test="id != null">
and id = #{id}
</when>
<when test="cardNo != null">
and card_no = #{cardNo}
</when>
<otherwise></otherwise>
</choose>
</select>
<!-- 动态sql实例 -->
<select id="selectCardById5" parameterType="hashmap" resultType="Card">
select id, card_no as cardNo, password from a_card
<where>
<!-- <trim prefix="WHERE" prefixOverrides="AND |OR "> -->
<if test="id != null">
and id = #{id}
</if>
<if test="cardNo != null">
and card_no = #{cardNo}
</if>
<!-- </trim> -->
</where>
</select>
<!-- 动态sql实例 -->
<select id="selectCardById6" parameterType="list" resultType="Card">
select id, card_no as cardNo, password from a_card
where id in
<foreach item="item" index="index" collection="list" open="("
separator="," close=")">
#{item}
</foreach>
</select>
<insert id="insertCard" parameterType="Card" keyProperty="id"
useGeneratedKeys="true">
insert into a_card
(card_no,password,money,persion_id) values
(#{cardNo},#{password},#{money},#{persionId})
</insert>
<update id="updateCardById" parameterType="Card">
update a_card set
password=#{password} where id=#{id}
</update>
<delete id="deleteCardById" parameterType="int">
delete from a_card
where id=#{id}
</delete>
</mapper>
映射接口类CardMapper.java
package com.dayuan.data;
import java.util.List;
import java.util.Map;
public interface CardMapper {
public Map<String,Object> selectCardById(int param);
public Card selectCardById2(int param);
public List<Card> selectCardById3(Map<String,Object> map);
public List<Card> selectCardById5(Map<String,Object> map);
public List<Card> selectCardById6(List<Integer> list);
public int insertCard(Card card);
public int updateCardById(Card card);
public int deleteCardById(int id);
}
测试类test.java
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
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 com.dayuan.data.Card;
import com.dayuan.data.CardMapper;
public class Test {
public static void main(String[] args) {
SqlSession session = null;
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
session = sqlSessionFactory.openSession(true);
// Card card = (Card)
// session.selectOne("com.dayuan.selectCardById2",
// 1);
// System.out.println(card.getCardNo());
// System.out.println(card.getPassword());
// Map<String, Object> map = session.selectOne(
// "com.dayuan.selectCardById", 1);
// System.out.println(map.get("card_no"));
// System.out.println(map.get("money"));
// CardMapper mapper = session.getMapper(CardMapper.class);
// Card card = mapper.selectCardById2(1);
// System.out.println(card.getCardNo());
// System.out.println(card.getPassword());
// CardMapper mapper = session.getMapper(CardMapper.class);
// Card card = new Card();
// card.setCardNo("67899999");
// card.setMoney(5000);
// card.setPassword("tgghjkl");
// card.setPersionId(1);
// int c = mapper.insertCard(card);
// System.out.println("影响行数:"+c);
// System.out.println("自增主键:"+card.getId());
// CardMapper mapper = session.getMapper(CardMapper.class);
// Card card = new Card();
// card.setId(11);
// card.setPassword("666666");
// int c = mapper.updateCardById(card);
// System.out.println("影响行数:"+c);
// CardMapper mapper = session.getMapper(CardMapper.class);
// int c = mapper.deleteCardById(9);
// System.out.println("影响行数:"+c);
// 动态sql(重点)
// CardMapper mapper = session.getMapper(CardMapper.class);
// Map<String,Object> paramMap = new HashMap();
paramMap.put("id", 1);
// paramMap.put("cardNo", "6225666666666666");
// List<Card> list = mapper.selectCardById3(paramMap);
// System.out.println(list.size());
// CardMapper mapper = session.getMapper(CardMapper.class);
// Map<String,Object> paramMap = new HashMap();
// paramMap.put("id", 1);
// paramMap.put("cardNo", "6225666666666666");
// List<Card> list = mapper.selectCardById5(paramMap);
// System.out.println(list.size());
CardMapper mapper = session.getMapper(CardMapper.class);
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
List<Card> list2 = mapper.selectCardById6(list);
System.out.println(list2.size());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
}
}