1.首先根据创建以mybatis为基础的web项目(1)中的流程将web项目部署好
- 打开IDE,建立web工程
- 在lib下面粘贴mybatis的jar,log4j的jar,mysql 连接的jar 最后最最重要的是要添加到构建路径中去,这样才能够被项目所使用
- 新建一个源文件夹config,用于存放xml文件
- 在src目录把下面新建四个包,分别是:
-
- com.pojo:存放数据库表对应的实体类
- com.imp:存放接口类
- com.test:存放测试类
- com.util:存放工具类(最好写成静态方法,可以用类点方法的方式调用方法)
- 目录结构如下图所示:
-
- 在config下面新建一个com.imp包:存放接口类对应的xml文件(使用mapper代理接口方式: 使用接口和XML文件,在后台自动生成操作数据库的类)
- 在config下面新建一个main_config.xml文件用于配置数据库和一些相关的映射,环境,插件,别名,配置文件
- main_config.xml
- 相应的再建立一个main_config.properties(这是一个键值对的文件,可用于存放jdbc的连接,便于修改)
- main_config.properties
- 写一个工具类(MybatisConnection.java ),用于获取连接:
-
1 package com.util; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 6 import org.apache.ibatis.io.Resources; 7 import org.apache.ibatis.session.SqlSession; 8 import org.apache.ibatis.session.SqlSessionFactory; 9 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 10 11 public class MyBatisConnection { 12 13 public static SqlSession getSqlSession() throws IOException{ 14 //获取主配置文件 15 InputStream inputStream = Resources.getResourceAsStream("main_config.xml"); 16 //创建会话工厂 17 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 18 SqlSession sqlSession = sqlSessionFactory.openSession(); 19 return sqlSession; 20 21 22 } 23 24 }
-
- 写一个测试类(TestConnection):测试是否可以获取连接
-
1 package com.test; 2 3 import java.io.IOException; 4 5 import org.apache.ibatis.session.SqlSession; 6 7 import com.util.MyBatisConnection; 8 9 public class TestConnection { 10 11 public static void main(String[] args) throws IOException { 12 SqlSession sqlSession = MyBatisConnection.getSqlSession(); 13 System.out.println(sqlSession); 14 15 } 16
-
2.建立一个人的表(t_person),每个人对应一个身份证(一一对应关系)所以建立一个(t_card)表
表结构如下图所示
3.建立对应的实体类(pojo)
注意在person.java中cid对应写的是card的对象
1 package com.pojo; 2 3 public class Card { 4 private int id; 5 private int cardid; 6 public Card() { 7 super(); 8 // TODO 自动生成的构造函数存根 9 } 10 public int getId() { 11 return id; 12 } 13 public void setId(int id) { 14 this.id = id; 15 } 16 public int getCardid() { 17 return cardid; 18 } 19 public void setCardid(int cardid) { 20 this.cardid = cardid; 21 } 22 @Override 23 public String toString() { 24 return "Card [id=" + id + ", cardid=" + cardid + "]"; 25 } 26 27 }
1 package com.pojo; 2 3 public class Person { 4 5 private int id; 6 private String name; 7 private Card card; 8 public Person() { 9 super(); 10 // TODO 自动生成的构造函数存根 11 } 12 public int getId() { 13 return id; 14 } 15 public void setId(int id) { 16 this.id = id; 17 } 18 public String getName() { 19 return name; 20 } 21 public void setName(String name) { 22 this.name = name; 23 } 24 public Card getCard() { 25 return card; 26 } 27 public void setCard(Card card) { 28 this.card = card; 29 } 30 @Override 31 public String toString() { 32 return "Person [id=" + id + ", name=" + name + ", card=" + card + "]"; 33 } 34 35 }
4.写接口或者对应的xml文件(要注意三个规范:1.接口名和映射文件名相同,2.在同一目录下,3.使用mapper代理接口(接口和XML文件,在后台自动生成操作数据库的类))
建议先写接口,有了接口之后再考虑怎么实现
我先写了一个接口(IPerson.java)
1 package com.imp; 2 3 import java.util.List; 4 5 import com.pojo.Person; 6 7 public interface IPerson { 8 //查询所有 9 List<Person> sqlall(); 10 11 }
再写对应的xml文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > 3 <!-- namespace:命名空间, 用于隔离sql语句 --> 4 <mapper namespace="com.imp.IPerson"> 5 <!-- id是sql语句的唯一标识符,名字要与 接口中的方法名相同 --> 6 <select id="sqlall" resultMap="test"> 7 SELECT 8 t_person.id, 9 t_person.`name`, 10 t_person.cid, 11 t_card.id, 12 t_card.cardid 13 FROM 14 t_card 15 INNER JOIN t_person ON t_person.cid = t_card.id 16 </select> 17 <resultMap type="person" id="test"> 18 <id column="id" property="id" /> 19 <result column="name" property="name" /> 20 <!-- association 是一对一映射关系使用的标签 --> 21 <association property=""></association> 22 <association property="card" javaType="card"> 23 <id column="cid" property="id" /> 24 <result column="cardid" property="cardid" /> 25 </association> 26 </resultMap> 27 28 </mapper>
在IPerson.xml中namepace的值为对应的接口的全限定名(com.imp.IPerson)
在IPerson.xml的查询中我们没有使用resultType而是使用了resultMap
这是因为数据库表中的字段和实体类的属性不一致,这时候我们使用resultMap
id表示主键,
result 表示普通的字段
association:一对一关系
column表示:查询结果对应的字段
property:实体类对应的属性
查询语句可以直接通过工具直接生成(直接拖动到空白处即可生成查询语句)
5.接下来就应该是在主配置文件中写映射文件的路径了
大家发现没有,我在IPerson.xml文件中写的Type,javaType都是实体类名,没有加包名,(这里我们要注意,我在主配置
文件中写了别名,是通过包来加载的,所以只要写类名即可,首字母的大小写不作区分)
在主配置文件的mappers标签中我使用的也是package映射,这是为了使用更加方便,如果有很多的xml文件要映射,那不是要写很多,这里只写一句就够了。
1 <!-- 取别名 --> 2 <typeAliases> 3 <package name="com.pojo"/> 4 </typeAliases> 5 <!-- 添加映射文件 --> 6 <mappers> 7 <package name="com.imp"/> 8 </mappers>
注意标签的顺序,这个有严格的规定
Content Model : (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?,
objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)
6.接下来我们就要写一个测试文件,看看我们是否写成功了
1 package com.test; 2 3 import java.io.IOException; 4 import java.util.List; 5 6 import org.apache.ibatis.session.SqlSession; 7 8 import com.imp.IPerson; 9 import com.pojo.Person; 10 import com.util.MyBatisConnection; 11 12 public class TestSqlAll { 13 14 public static void main(String[] args) throws IOException { 15 SqlSession sqlSession = MyBatisConnection.getSqlSession(); 16 IPerson person = sqlSession.getMapper(IPerson.class); 17 List<Person> list = person.sqlall(); 18 for (Person person2 : list) { 19 System.out.println(person2); 20 } 21 } 22 }
可能测试的时候会发生错误,我们要仔细看看报的什么错误,找到错误所在,改正即可
7.测试结果如下(如果为空,那是因为你的数据库是空的啊)