以map形式输出。
一、xml配置方法
(1)sql配置文件mapper.xml
1 2 3 4 5 6 |
<!-- namespace是id,必须唯一,有个命名方法就是包名+类名,这里就是test包下的miss类,这样就保证了id是唯一的 --> <mapper namespace="testcrud.mapper"> <select id="selectbyname2" resultType="Miss"> select * from miss </select> </mapper> |
当然也可以这样:
1 2 3 4 5 6 7 8 9 10 11 12 |
<!-- namespace是id,必须唯一,有个命名方法就是包名+类名,这里就是test包下的miss类,这样就保证了id是唯一的 --> <mapper namespace="testcrud.mapper"> <resultMap type="Miss" id="resultMapmiss"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="age" property="age"/> </resultMap> <select id="selectbyname2" resultMap="resultMapmiss"> select * from miss </select> </mapper> |
注意返回格式为一个bean,类的形式,也可以自己设返回的形式。
(2)在mybatis配置文件conf.xml中注册刚才的sql配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<configuration> <!-- db配置文件 --> <properties resource="db.properties"/> <!-- 配置实体类的别名 --> <typeAliases> <!-- <typeAlias type="test.miss" alias="Miss"/> --> <package name="test"/> </typeAliases> <!-- development 开发模式 word 工作模式 --> <environments default="development"> <!-- environment id 必须和环境属性一样 ,比如说都是work就可以,但是一个work一个development就会报错 --> <environment id="development"> <transactionManager type="JDBC"/> <!-- unpooled真正关闭连接 pooled关闭只是放在连接池里面 --> <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> <!-- 注册mapper --> <mappers> <mapper resource="testcrud/mapper.xml"/> </mappers> </configuration> |
(3)写一个测试方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package testcrud; import java.io.InputStream; import java.util.List; import java.util.Map; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import test.miss; public class testxml { public static SqlSessionFactory getFactory() { String resource = "conf.xml"; InputStream inputStream = testxml.class.getClassLoader().getResourceAsStream(resource); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); return factory; } @Test public void testselectbyname2() { SqlSession sqlSession = getFactory().openSession(true); String statement = "testcrud.mapper.selectbyname2"; Map<String, miss> map = sqlSession.selectMap(statement,null,"id"); System.out.println(map); } } |
解读一下:
1 |
Map<String, miss> map = sqlSession.selectMap(statement,null,"id"); |
statement为sql语句所在位置,null位置为参数,”id”为指定map的key值。
运行结果:
1 |
{1=miss [id=1, name=xie, age=20], 2=miss [id=2, name=godlikexie, age=18], 3=miss [id=3, name=yxin, age=20], 13=miss [id=13, name=yxinnnn, age=520]} |
可以看见返回了一个map,key值为指定的id,value为miss类。
二、注解方法(有误,存疑)
(1)首先写个接口类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package testcrud; import java.util.List; import org.apache.ibatis.annotations.Select; import test.miss; public interface missmapper { @Select(" select * from miss ") public List<miss> selectbyname(); // public List<Map<String, miss>> selectbyname(String name); } |
注意,注释掉的接口方法思路如下:
因为select返回多个结果,每个结果都是一个Map,所以必须用List<Map<String, miss>>装起来,不然就会报错。
那么问题来了,实际查询返回的结果是Map<String, miss>,我不知道怎么去指定String为查询的id,导致映射之后变成了List<Map<null, miss>>,之后的操作没办法进行下去了。
所以我认为完全没有必要采取List<Map<String, miss>>的写法。
我个人的写法是直接返回一个List<miss>,然后再考虑转化为Map。
(2)在mybatis配置文件conf.xml中注册刚才写的接口类(注意是类)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<configuration> <!-- db配置文件 --> <properties resource="db.properties"/> <!-- 配置实体类的别名 --> <typeAliases> <!-- <typeAlias type="test.miss" alias="Miss"/> --> <package name="test"/> </typeAliases> <!-- development 开发模式 word 工作模式 --> <environments default="development"> <!-- environment id 必须和环境属性一样 ,比如说都是work就可以,但是一个work一个development就会报错 --> <environment id="development"> <transactionManager type="JDBC"/> <!-- unpooled真正关闭连接 pooled关闭只是放在连接池里面 --> <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> <!-- 注册mapper --> <mappers> <mapper class="testcrud.missmapper" /> </mappers> </configuration> |
(3)写一个测试类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
package testcrud; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import test.miss; public class testannotation { public static SqlSessionFactory getFactory() { String resource = "conf.xml"; InputStream inputStream = testxml.class.getClassLoader().getResourceAsStream(resource); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); return factory; } @Test public void testselectbyname(){ SqlSession sqlSession = getFactory().openSession(true); missmapper missmapper = sqlSession.getMapper(missmapper.class); List<miss> list = missmapper.selectbyname(); Map<Integer, miss> map = new HashMap<Integer,miss>(); for (int i = 0; i < list.size(); i++) { map.put(list.get(i).getId(), list.get(i)); } System.out.println(map); } } |
可以看见我是用list转成map,结果和一开始xml的方式是一样的。
1 |
{1=miss [id=1, name=xie, age=20], 2=miss [id=2, name=godlikexie, age=18], 3=miss [id=3, name=yxin, age=20], 13=miss [id=13, name=yxinnnn, age=520]} |
算是比较简单易懂的方法。
三、总结
确实不太好理解List<Map<String, miss>>的直接映射,也许是我搞错了。