myeclipse mybatis逆向工程生成一对多配置文件怎么写

[转载]myBatis的读取配置文件问题
!supportLists]--&1.&&&&&&
&!--[endif]--&MyBatis的命名空间(我们以下图的文件结构来说明)
MyBatis的命名空间说的是POJO的XXx.xml文件中的&mapper namespace=””
/&,主要是跟三个地方有关系,
第一个是Configuration.xml的mappers属性
第二个是POJO的mapper接口如EmployeeMapper的类路径
第三个是DAO程序中的session.getConfiguration().addMapper(EmployeeMapper.class)
下面我来说一下他们三个之间的关系,我们
1)当只使用XML(不使用Anotation)的来配置mapper接口时,就是我们把sql配置在EmployeeMap.xml中时,若我们把namespace指明namespace设置为mapper接口的路径,即&mapper
namespace="com.wildrain.mapper.EmployeeMapper"&时,这样我们在程序中使用MyBatis来进行CRUD时, session.getConfiguration().addMapper(EmployeeMapper.class)这段代码可以不用写。我们来具体看一下这个三个地方的代码形式。
Configuration.xml的mappers
&typeAliases&
&typeAlias
alias="Employee" type="com.wildrain.domain.Employee"
&/typeAliases&
namespace="com.wildrain.mapper.EmployeeMapper"&
程序代码:
testGetAllEmployees(){
SqlSessionFactory sqlSessionFactory =&
MyBatisUtil.getSessionFactory();
SqlSession session = sqlSessionFactory.openSession();
&&&&&&&&&&
EmployeeMapper mapper =
session.getMapper(EmployeeMapper.class);
&&&&&&&&&&
List&Employee& ems =
mapper.getAllEmployees();
&&&&&&&&&&
for(Employee
&&&&&&&&&&&&&
System.out.println(e);
&&&&&&&&&&
&&&&&&&&&&
session.close();
若我们在employee.xml中的namespace是任意取的名字,而不是EmployeeMapper.java的类路径名,那么当我们在进行测试时,必须要添加一行代码session.getConfiguration().addMapper(EmployeeMapper.class)进行注册,下代码如下:
testGetAllEmployees(){
SqlSessionFactory sqlSessionFactory =&
MyBatisUtil.getSessionFactory();
SqlSession session = sqlSessionFactory.openSession();
session.getConfiguration().addMapper(EmployeeMapper.class);
&&&&&&&&&&
EmployeeMapper mapper =
session.getMapper(EmployeeMapper.class);
&&&&&&&&&&
List&Employee& ems =
mapper.getAllEmployees();
&&&&&&&&&&
for(Employee
&&&&&&&&&&&&&
System.out.println(e);
&&&&&&&&&&
&&&&&&&&&&
session.close();
2)当使用注解时,为了减少配制xml的工作量,可以把Employee.xml省略,而把相应配制通过注解的形式写到EmployeeMapper.java的文件中,如下所示
getAllEmployees
"SELECT E.id,
name, type, salay, time "+
"FROM employee E
"left join
register r on r.eid = E.id "+
"left join time t
on t.eid = E.id";
@Select(getAllEmployees)
@TypeDiscriminator(column
&&&&&&&&&&
cases={&&&
&&&&&&&&&&
@Case(value="1",type=RegisterEmployee.class,results={
&&&&&&&&&&&&&
@Result(property="salay")
&&&&&&&&&&
&&&&&&&&&&
@Case(value="2",type=TimeEmployee.class,results={
&&&&&&&&&&&&&
@Result(property="time")
&&&&&&&&&&
 这样Configuration.xml中就不需要设置&mappers/&了,此时在测试程序时就必须加一行session.getConfiguration().addMapper(EmployeeMapper.class);的代码进行注册,这样在每一次CRUD时都需要添加一行这样的代码。还不如在建立一个空的Employee.xml文件,然后像上面一样设置好namespace,从而不用输入那一行代码。
上面的说明针对的是,仅针对使用mybats动态代理时的情况。写得比较乱,以后有时间再改。
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。1. 什么是逆向工程
  mybatis的一个主要的特点就是需要程序员自己编写sql,那么如果表太多的话,难免会很麻烦,所以mybatis官方提供了一个逆向工程,可以针对单表自动生成mybatis执行所需要的代码(包括mapper.xml、mapper.java、po..)。一般在开发中,常用的逆向工程方式是通过数据库的表生成代码。
2. 使用逆向工程
  使用mybatis的逆向工程,需要导入逆向工程的jar包,我用的是mybatis-generator-core-1.3.2,已经上传到下载频道了(),下面开始总结一下mybatis逆向工程的使用步骤。
2.1 新建一个工程(重要)
  我们要新建一个java工程,这个工程专门用来使用逆向工程生成代码的。有些人可能会问,为什么要新建一个工程呢?直接在原来工程中你想生成不就可以了么?确实是这样,可以在原来的工程中生成,但是有风险,因为mybatis是根据配置文件来生成的(下面会说到),如果生成的路径中有相同的文件,那么就会覆盖原来的文件,这样会有风险。所以开发中一般都会新建一个java工程来生成,然后将生成的文件拷贝到自己的工程中,这也不麻烦,而且很安全。如下:
  从上图中看,1就是要执行的java代码,执行它即可生成我们需要的代码;2是执行过程中新建的包,这个包都可以在4的配置文件中指定,最好是跟我们自己项目的包名一致,后面就可以直接拷贝了,就不需要修改包名了;3就是jar包咯;4是配置文件。下面会详细分析。
2.1 生成代码的配置文件
  mybatis逆向工程生成代码需要一个配置文件,名字随便起。然后mybatis会根据这个配置文件中的配置,生成相应的代码。下载好了jar包后,里面有帮助文档,打开后里面有配置文件的模板,这里就不再赘述了,下面先把配置文件写好:
&?xml version=&1.0& encoding=&UTF-8&?&
&!DOCTYPE generatorConfiguration
PUBLIC &-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN&
&http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd&&
&generatorConfiguration&
&context id=&testTables& targetRuntime=&MyBatis3&&
&commentGenerator&
&!-- 是否去除自动生成的注释 true:是 : false:否 --&
&property name=&suppressAllComments& value=&true& /&
&/commentGenerator&
&!--数据库连接的信息:驱动类、连接地址、用户名、密码 --&
&jdbcConnection driverClass=&com.mysql.jdbc.Driver&
connectionURL=&jdbc:mysql://localhost:3306/mybatis& userId=&root&
password=&root&&
&/jdbcConnection&
&!-- &jdbcConnection driverClass=&oracle.jdbc.OracleDriver&
connectionURL=&jdbc:oracle:thin:@127.0.0.1:1521:yycg&
userId=&yycg&
password=&yycg&&
&/jdbcConnection& --&
&!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL和NUMERIC类型解析为java.math.BigDecimal --&
&javaTypeResolver&
&property name=&forceBigDecimals& value=&false& /&
&/javaTypeResolver&
&!-- targetProject:生成PO类的位置,重要!! --&
&javaModelGenerator targetPackage=&mybatis.po&
targetProject=&.\src&&
&!-- enableSubPackages:是否让schema作为包的后缀 --&
&property name=&enableSubPackages& value=&false& /&
&!-- 从数据库返回的值被清理前后的空格 --&
&property name=&trimStrings& value=&true& /&
&/javaModelGenerator&
&!-- targetProject:mapper映射文件生成的位置,重要!! --&
&sqlMapGenerator targetPackage=&mybatis.mapper&
targetProject=&.\src&&
&property name=&enableSubPackages& value=&false& /&
&/sqlMapGenerator&
&!-- targetPackage:mapper接口生成的位置,重要!! --&
&javaClientGenerator type=&XMLMAPPER&
targetPackage=&mybatis.mapper&
targetProject=&.\src&&
&property name=&enableSubPackages& value=&false& /&
&/javaClientGenerator&
&!-- 指定数据库表,要生成哪些表,就写哪些表,要和数据库中对应,不能写错! --&
&table tableName=&items&&&/table&
&table tableName=&orders&&&/table&
&table tableName=&orderdetail&&&/table&
&table tableName=&user&&&/table&
&/context&
&/generatorConfiguration&
  从上面的配置文件中可以看出,配置文件主要要做的几件事是:
连接数据库,这是必须的,要不然怎么根据数据库的表生成代码呢?
指定要生成代码的位置,要生成的代码包括po类, mapper.xml和mapper.java
指定数据库中想要生成哪些表
2.3 执行生成程序
  配置文件搞好了,然后就执行以下生成程序即可生成了,生成的java程序,下载的逆向工程文档中都有示例,如下:
public class GeneratorSqlmap {
public void generator() throws Exception{
List&String& warnings = new ArrayList&String&();
boolean overwrite =
//指向逆向工程配置文件
File configFile = new File(&generatorConfig.xml&);
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
callback, warnings);
myBatisGenerator.generate(null);
public static void main(String[] args) throws Exception {
GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();
generatorSqlmap.generator();
} catch (Exception e) {
e.printStackTrace();
  运行一下即可,运行完了后刷新一下工程,就可以看到最新生成的代码了。
  这里可以看出有个细节,每个po类多了一个东西,就是xxxExample.java,这个类是给用户自定义sql是用的,后面我会提到。到这里就生成好了,下面我们就把生成的代码拷贝到自己的工程使用了,为了简便,这里我就拷贝ItemsMapper.java/ItemsMapper.xml/Items.java/ItemsExample.java这一类的,其他都一样。
3. 测试生成的代码
  我们针对ItemsMapper.java新建一个测试类,测试其中的几个方法:
public class ItemsMapperTest {
private SqlSessionFactory sqlSessionF
public void setUp() throws Exception {
// 创建sqlSessionFactory
String resource = &SqlMapConfig.xml&; // mybatis配置文件
// 得到配置文件的流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂SqlSessionFactory,要传入mybaits的配置文件的流
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//普通的插入,跟我们之前的插入是一样的
public void testInsert() {
SqlSession sqlSession = sqlSessionFactory.openSession();
ItemsMapper itemsMapper = sqlSession.getMapper(ItemsMapper.class);
Items items = new Items();
items.setName(&手机&);
items.setPrice(5000f);
items.setCreatetime(new Date());
itemsMapper.insert(items);
//还有一个insertSelective(items);方法,是插入的项不为空时,才将那个字段拼接到sql中
//可以下自动生成的xml文件就知道了。
//自定义查询
public void testSelectByExample() {
SqlSession sqlSession = sqlSessionFactory.openSession();
ItemsMapper itemsMapper = sqlSession.getMapper(ItemsMapper.class);
//自定义查询,这就用到了ItemsExample类了,里面有个Criteria内部类,专门用来封装自定义查询条件的
ItemsExample itemsExample = new ItemsExample();
ItemsExample.Criteria criteria = itemsExample.createCriteria();
//andNameEqualTo相当于在sql中拼接一个“AND name='背包'”
//还有其他很多方法,都是用来自定义查询条件的,可以自己看一下不同的方法
criteria.andNameEqualTo(&背包&);
List&Items& itemsList = itemsMapper.selectByExample(itemsExample);
System.out.println(itemsList);
//根据主键查询,跟原来一样
public void testSelectByPrimaryKey() {
ItemsMapper itemsMapper = sqlSessionFactory.openSession().getMapper(ItemsMapper.class);
Items items = itemsMapper.selectByPrimaryKey(1);
System.out.println(items);
//根据主键更新item,跟原来一样
public void testUpdateByPrimaryKey() {
SqlSession sqlSession = sqlSessionFactory.openSession();
ItemsMapper itemsMapper = sqlSession.getMapper(ItemsMapper.class);
Items items = itemsMapper.selectByPrimaryKey(1);
items.setPrice(3540f);
itemsMapper.updateByPrimaryKey(items);
  可以看出,逆向工程生成的代码,基本上和之前使用的差不多,只不过它更规范一点,而且还多了自定义查询条件的java类,用起来还是挺方便的。关于mybatis的逆向工程就总结到这吧。
  相关阅读:
  学习笔记源码下载地址:
—–乐于分享,共同进步!
—–我的博客主页:mybatis入门基础(九)----逆向工程 - 推酷
mybatis入门基础(九)----逆向工程
一、什么是逆向工程
mybaits 需要程序员自己编写 sql 语句, mybatis 官方提供逆向工程&可以针对单表自动生成 mybatis 执行所需要的代码( mapper.java,mapper.xml 、 po.. )
实际开发中,常用的逆向工程方式:由数据库的表生成java代码。
二、下载逆向工程
去官网下载逆向工程,截至今天最新版本是1.3.3. & &
我所用的是1.3.2版本的,下载地址:
三、使用方法
1.生成代码配置文件
generatorConfig.xml的配置
1 &?xml version=&1.0& encoding=&UTF-8&?&
2 &!DOCTYPE generatorConfiguration
PUBLIC &-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN&
&http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd&&
6 &generatorConfiguration&
&context id=&testTables& targetRuntime=&MyBatis3&&
&commentGenerator&
&!-- 是否去除自动生成的注释 true:是 : false:否 --&
&property name=&suppressAllComments& value=&true& /&
&/commentGenerator&
&!--数据库连接的信息:驱动类、连接地址、用户名、密码,这里配置的是mysql的,当然也可以配置oracle等数据库 --&
&jdbcConnection driverClass=&com.mysql.jdbc.Driver&
connectionURL=&jdbc:mysql://localhost:3306/mybatis& userId=&root&
password=&root&&
&/jdbcConnection&
&!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL
和 NUMERIC 类型解析为java.math.BigDecimal --&
&javaTypeResolver&
&property name=&forceBigDecimals& value=&false& /&
&/javaTypeResolver&
&!-- targetProject:生成PO类的位置 --&
&javaModelGenerator targetPackage=&com.mybatis.entity&
targetProject=&.\src&&
&!-- enableSubPackages:是否让schema作为包的后缀 --&
&property name=&enableSubPackages& value=&false& /&
&!-- 从数据库返回的值被清理前后的空格 --&
&property name=&trimStrings& value=&true& /&
&/javaModelGenerator&
&!-- targetProject:mapper映射文件生成的位置 --&
&sqlMapGenerator targetPackage=&com.mybatis.mapper&
targetProject=&.\src&&
&!-- enableSubPackages:是否让schema作为包的后缀 --&
&property name=&enableSubPackages& value=&false& /&
&/sqlMapGenerator&
&!-- targetPackage:mapper接口生成的位置 --&
&javaClientGenerator type=&XMLMAPPER&
targetPackage=&com.mybatis.mapper& targetProject=&.\src&&
&!-- enableSubPackages:是否让schema作为包的后缀 --&
&property name=&enableSubPackages& value=&false& /&
&/javaClientGenerator&
&!-- 指定数据库表 --&
&table tableName=&items&&&/table&
&table tableName=&orders&&&/table&
&table tableName=&orderdetail&&&/table&
&table tableName=&t_user&&&/table&
&/context&
50 &/generatorConfiguration&
2.执行生成程序
GeneratorSqlmap.java的代码:
1 import java.io.F
2 import java.util.ArrayL
3 import java.util.L
5 import org.mybatis.generator.api.MyBatisG
6 import org.mybatis.generator.config.C
7 import org.mybatis.generator.config.xml.ConfigurationP
8 import org.mybatis.generator.internal.DefaultShellC
10 public class GeneratorSqlmap {
public void generator() throws Exception{
List&String& warnings = new ArrayList&String&();
boolean overwrite = true;
//指定 逆向工程配置文件
File configFile = new File(&generatorConfig.xml&);
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
callback, warnings);
myBatisGenerator.generate(null);
public static void main(String[] args) throws Exception {
GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();
generatorSqlmap.generator();
} catch (Exception e) {
e.printStackTrace();
上面这段代码在官方文档中的代码,里面支持好多语言的,大家可以去官方看看。下面这张图是从官方截取的
配置好后,直接运行代码就会在配置的对应目录生成对应的实体和mapper以及mapper.xml文件。(类似hibernate的实体映射),当然除了这种方法生成,还可以下载mybatis_generator插件生成。
执行完毕后,刷新项目,就可以看到生成的对应文件。
3.逆向工程注意事项
mapper.xml文件已存在时,如果进行重新生成则mapper.xml文件内容不被覆盖而是进行内容增加,结果会导致mybatis解析失败。
解决办法:删除原来的已经生成的mapper.xml文件重新生成。
mybais自动生成的实体entity以及mapper.java文件不是内容追加而是直接覆盖没有问题。&
4.工程目录
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致一:resaultMap应场景如果sql查询的列名和pojo的属性名不一致,可以使用resultMap将列名和pojo的属性名作一个对应关系,就可以映射成功了.使用resultMap可以完成一些高级映射:将一些列聚合到一个pojo的对象中,完成一对一查询映射。将多行多列聚合到一个List中,完成一对多查询映射。&
select id id_,username username_,birthday birthday_ from user where username like '%${user.username}%'二:mybatis高级映射表结构:1.sql语句:&CREATE TABLE `items` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL COMMENT '商品名称',
`price` FLOAT(10,1) NOT NULL COMMENT '商品定价',
`detail` TEXT COMMENT '商品描述',
`pic` VARCHAR(64) DEFAULT NULL COMMENT '商品图片',
`createtime` DATETIME NOT NULL COMMENT '生产日期',
PRIMARY KEY (`id`)) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;/*Table structure for table `orderdetail` */CREATE TABLE `orderdetail` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`orders_id` INT(11) NOT NULL COMMENT '订单id',
`items_id` INT(11) NOT NULL COMMENT '商品id',
`items_num` INT(11) DEFAULT NULL COMMENT '商品购买数量',
PRIMARY KEY (`id`),
KEY `FK_orderdetail_1` (`orders_id`),
KEY `FK_orderdetail_2` (`items_id`),
CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE=INNODB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;/*Table structure for table `orders` */CREATE TABLE `orders` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`user_id` INT(11) NOT NULL COMMENT '下单用户id',
`number` VARCHAR(32) NOT NULL COMMENT '订单号',
`createtime` DATETIME NOT NULL COMMENT '创建订单时间',
`note` VARCHAR(100) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
KEY `FK_orders_1` (`user_id`),
CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE=INNODB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;/*Table structure for table `user` */CREATE TABLE `user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(32) NOT NULL COMMENT '用户名称',
`birthday` DATE DEFAULT NULL COMMENT '生日',
`sex` CHAR(1) DEFAULT NULL COMMENT '性别',`orderdetail`
`address` VARCHAR(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)) ENGINE=INNODB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;2.表关系图&二:一对一&1:resaultType&Mapper.xmlSELECT
address FROM
USER WHERE orders.user_id = user.id 实体类(使用resultType,保证指定的pojo中属性和sql查询列一一对应,因为原来的orders中没有用户信息的字段,需要定义一个扩展的pojo包括 所有字段,一般情况建议对扩展的pojo采取自定义方式):&&//对扩展对象,可以采用继承方式 ,让他继承拥有字段多的pojopublic class OrdersCustom extends Orders {//包括 用户信息private Sprivate Sprivate Spublic String getUsername() {}public void setUsername(String username) {this.username =}public String getSex() {}public void setSex(String sex) {this.sex =}public String getAddress() {}public void setAddress(String address) {this.address =}}OrdersMapper.java&&//查询订单关联查询用户public List findOrdersAndUserList() throws E测试类:&&public class OrdersMapperTest {private SqlSessionFactory sqlSessionF@Beforepublic void setUp() throws Exception {// 创建会话工厂// 全局配置文件String resource = &SqlMapConfig.xml&;// 创建配置文件的流InputStream inputStream = Resources.getResourceAsStream(resource);// 根据配置文件创建sqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic void testfindOrdersAndUserList() throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();//创建代理对象OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);//调用ordersMapper方法List list = ordersMapper.findOrdersAndUserList();System.out.println(list);sqlSession.close();}}&&&2:resaultMap&Mapper.xml(一对一用)&
address FROM
USER WHERE orders.user_id = user.id 实体类:(因为要映射User对象,因此Orders中要加入User对象)&&public class Orders implements Serializable {
private Integer userId;
//用户信息
//订单明细
private List
public Integer getId() {
public void setId(Integer id) {
public Integer getUserId() {
return userId;
public void setUserId(Integer userId) {
this.userId = userId;
public String getNumber() {
public void setNumber(String number) {
this.number = number == null ? null : number.trim();
public Date getCreatetime() {
public void setCreatetime(Date createtime) {
this.createtime =
public String getNote() {
public void setNote(String note) {
this.note = note == null ? null : note.trim();
}public User getUser() {}public void setUser(User user) {this.user =}public List getOrderdetails() {}public void setOrderdetails(List orderdetails) {this.orderdetails =}
}&OrdersMapper.java:&//一对一使用reusltMappublic List findOrdersAndUserListResultMap() throws E测试类:&&public class OrdersMapperTest {private SqlSessionFactory sqlSessionF@Beforepublic void setUp() throws Exception {// 创建会话工厂// 全局配置文件String resource = &SqlMapConfig.xml&;// 创建配置文件的流InputStream inputStream = Resources.getResourceAsStream(resource);// 根据配置文件创建sqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic void testfindOrdersAndUserListResultMap() throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();//创建代理对象OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);//调用ordersMapper方法List list = ordersMapper.findOrdersAndUserListResultMap();System.out.println(list);sqlSession.close();}}&&三:一对多&1.Mapper.xml(一对多用Collection)&&extends=&OrdersAndUserListResultMap&&SELECT
orderdetail.id orderdetail_id,
orderdetail.items_num,
orderdetail.items_id,
address FROM
orderdetailWHERE orders.user_id = user.id AND orders.id = orderdetail.orders_id通过继承前面写的resault省略部分代码&2.实体类(orders中添加List 属性)&&public class Orders implements Serializable {
private Integer userId;
//用户信息
//订单明细
private List
public Integer getId() {
public void setId(Integer id) {
public Integer getUserId() {
return userId;
public void setUserId(Integer userId) {
this.userId = userId;
public String getNumber() {
public void setNumber(String number) {
this.number = number == null ? null : number.trim();
public Date getCreatetime() {
public void setCreatetime(Date createtime) {
this.createtime =
public String getNote() {
public void setNote(String note) {
this.note = note == null ? null : note.trim();
}public User getUser() {}public void setUser(User user) {this.user =}public List getOrderdetails() {}public void setOrderdetails(List orderdetails) {this.orderdetails =}
}&3.OrdersMapper.java:&&//一对多public List findOrdersAndDetailList() throws E&4.测试类&&public class OrdersMapperTest {private SqlSessionFactory sqlSessionF@Beforepublic void setUp() throws Exception {// 创建会话工厂// 全局配置文件String resource = &SqlMapConfig.xml&;// 创建配置文件的流InputStream inputStream = Resources.getResourceAsStream(resource);// 根据配置文件创建sqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}//一对多@Testpublic void testfindOrdersAndDetailList() throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();//创建代理对象OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);//调用ordersMapper方法List list = ordersMapper.findOrdersAndDetailList();System.out.println(list);sqlSession.close();}}&&四:多对多&需求:&将用户信息映射到user对象中,最终所有用户生成一个List&用户创建的订单映射到user对象的List属性中&将订单所包括订单明细映射到orders中的List属性中。&将商品信息映射到orderdetail对象 的Item属性中&1.Mapper.xml&&
orderdetail.id orderdetail_id,
orderdetail.items_num,
orderdetail.items_id,
items.name,
items.priceFROM
orderdetail,
itemsWHERE orders.user_id = user.id AND orders.id = orderdetail.orders_id AND items.id=orderdetail.items_id&2.实体类(User中添加List ,Order 中添加User和List ,OrderDetail添加Items)&a:User&public class User implements Serializable {private S// 用户姓名private S// 性别private D// 生日private S// 地址//订单列表private Listpublic List getOrders() {}public void setOrders(List orders) {this.orders =}@Overridepublic String toString() {return &User [id=& + id + &, username=& + username + &, sex=& + sex+ &, birthday=& + birthday + &, address=& + address + &]&;}public int getId() {}public void setId(int id) {this.id =}public String getUsername() {}public void setUsername(String username) {this.username =}public String getSex() {}public void setSex(String sex) {this.sex =}public Date getBirthday() {}public void setBirthday(Date birthday) {this.birthday =}public String getAddress() {}public void setAddress(String address) {this.address =}}b:Orders&&public class Orders implements Serializable {
private Integer userId;
//用户信息
//订单明细
private List
public Integer getId() {
public void setId(Integer id) {
public Integer getUserId() {
return userId;
public void setUserId(Integer userId) {
this.userId = userId;
public String getNumber() {
public void setNumber(String number) {
this.number = number == null ? null : number.trim();
public Date getCreatetime() {
public void setCreatetime(Date createtime) {
this.createtime =
public String getNote() {
public void setNote(String note) {
this.note = note == null ? null : note.trim();
}public User getUser() {}public void setUser(User user) {this.user =}public List getOrderdetails() {}public void setOrderdetails(List orderdetails) {this.orderdetails =}
}c:OrderDetail&&public class Orderdetail {
private Integer ordersId;
private Integer itemsId;
private Integer itemsN
//商品信息
public Items getItems() {}public void setItems(Items items) {this.items =}public Integer getId() {
public void setId(Integer id) {
public Integer getOrdersId() {
return ordersId;
public void setOrdersId(Integer ordersId) {
this.ordersId = ordersId;
public Integer getItemsId() {
return itemsId;
public void setItemsId(Integer itemsId) {
this.itemsId = itemsId;
public Integer getItemsNum() {
return itemsN
public void setItemsNum(Integer itemsNum) {
this.itemsNum = itemsN
}d:Items&&public class Items {
public Integer getId() {
public void setId(Integer id) {
public String getName() {
public void setName(String name) {
this.name = name == null ? null : name.trim();
public Float getPrice() {
public void setPrice(Float price) {
this.price =
public String getPic() {
public void setPic(String pic) {
this.pic = pic == null ? null : pic.trim();
public Date getCreatetime() {
public void setCreatetime(Date createtime) {
this.createtime =
public String getDetail() {
public void setDetail(String detail) {
this.detail = detail == null ? null : detail.trim();
}}&3.OrdersMapper.java:&//多对多查询public List findUserAndItemsList()throws E&4.测试类&public class OrdersMapperTest {private SqlSessionFactory sqlSessionF@Beforepublic void setUp() throws Exception {// 创建会话工厂// 全局配置文件String resource = &SqlMapConfig.xml&;// 创建配置文件的流InputStream inputStream = Resources.getResourceAsStream(resource);// 根据配置文件创建sqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}//多对多查询@Testpublic void testfindUserAndItemsList() throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();//创建代理对象OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);//调用ordersMapper方法List list = ordersMapper.findUserAndItemsList();System.out.println(list);sqlSession.close();}}四:注意并不是一对多、多对多的操作必须使用resaultMap才能和完成,resaultType一样可以完成这些操作,但是在特定的的需求下要是用resaultMap进行操作,例如规定某个对象映射到某个对象之中,这时候就必须要视同resaultMap了,开发时要根据具体需求去执行。五:总结resultMap:也是对查询结果集进行输出映射,根据自己需求可以通过resultMap将查询结果集映射到pojo中pojo属性中,还可以将多条记录结果集映射到pojo中List集合属性中。一对多、多对多、一对多这是针对业务来说的,可以写成符合一对一、一对多、多对多业务的sql语句,sql语句的结果集的映射由mybatis完成。写成一个复杂的多对多的sql语句,使用resultMap或resultType完成结果集映射。就爱阅读网友整理上传,为您提供最全的知识大全,期待您的分享,转载请注明出处。
欢迎转载:
推荐:    

我要回帖

更多关于 mybatis逆向工程插件 的文章

 

随机推荐