Mybatis-命名空间绑定接口的实现方式

关于命名空间的两种绑定方式

1.命名空间可以绑定接口 可以是持久化类
2.无论绑定接口还是绑定类 都以类路径的形式绑定
3.绑定接口:相当于把xml当作接口的实现类
4.<select> 等标签的 id必须与接口中的方法同名!!

绑定接口的案例

1.项目架构

在这里插入图片描述

2.编写实体类

package com.iflytek.domain;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class User {
	    private int id;
	    private String username;
	    private String password;
		@Override
		public String toString() {
			return "UserInfo [id=" + id + ", username=" + username + ", password=" + password + "]";
		}
}

toString()方法可以省略!!

3.编写UserDao接口

package com.iflytek.dao;

import java.util.List;

import com.iflytek.domain.User;

public interface UserDao {
	/* 接口中只承诺方法,不实现
	 * ��mybatis����Ҫ����ʵ���࣬implement�˽ӿ�
	 * ���Ǵ�����Ӧ��Mapper�ļ�  �˴���Ӧ����UserDaoMapper.xml*/
    List<User> getAllUser();
    User getOneById(int id);
    int insertNewUser(User user);
    int deleteUserById(int id);
    int updateUser(User user);
    
}

insertNewUser()、deleteUserById()、updateUser()返回值类型可以为void

4.编写Mybatis主配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
	"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
       <!--   为了引入外部properties文件:键值对的形式 -->
       <!--  相对路径从src开始寻找 -->
     <properties resource="db.properties"></properties>
       <!-- 给类取别名 是一个集合  可以有多个typeAlias-->
     <typeAliases>
             <!--      type:类名+包名 建议直接复制限定名 -->
         <typeAlias type="com.iflytek.domain.User" alias="User"/>
     </typeAliases>  
     <!-- 配置多个环境  default:当前使用的环境 --> 
     <environments default="development">
        <environment id="development">
           <transactionManager type="JDBC"/><!-- 事务管理 -->
           <dataSource type="POOLED"> <!-- 配置数据库连接池:存放连接 对程序来说本质就是一个数据源 -->
              <property name="driver" value="${driver}"/><!-- value="com.mysql.jdbc.Driver" 写法也可以-->
              <property name="url" value="${url}"/>
              <property name="username" value="${username}"/>
              <property name="password" value="${password}"/>
           </dataSource>
        </environment>
     </environments>
     
     <!-- 将 UserDaoMapper.xml包含到主配置文件中-->
     <mappers>
         <mapper resource="com/iflytek/mapper/UserDaoMapper.xml"/>
     </mappers>
</configuration>

5.编写UserDaoMapper.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.iflytek.dao.UserDao"><!-- 命名空间为接口 可以是持久化类   -->
  <!-- 此处为接口  以类路径的形式绑定  相当于把xml当作接口的实现类 -->
      <!-- 返回结果集 -->
   <!--  <resultMap type="User" id="UserList">
     <id column="id" property="id"/>id代表主键 column:表中的字段  property:实体类的属性
     result:普通字段
     <result column="username" property="username"/>
     <result column="password" property="password"/>
   </resultMap> -->
   <!-- id必须与接口中的方法同名!! resultType:返回值类型 在mybatis主配置文件中已经取郭别名,此处可以直接用User代替com.iflytek.domain.User-->
   <select id="getAllUser"    resultType="User">
    select * from user_info
   </select>
   
   <!-- parameterType:参数类型 int 同Integer #{id}:占位符-->
   <select id=" getOneById" parameterType="int" resultType="User">
     select * from user_info where id=#{id}
   </select>
   
    <insert id="insertNewUser" parameterType="User">
     insert into user_info(username,password) value (#{username},#{password})
    </insert>
    
    <update id="updateUser" parameterType="User">
   update  user_info set username=#{username} , password=#{password} where id=#{id}
    </update>
    
    <delete id="deleteUserById" parameterType="Integer">
    delete from user_info where id=#{id}
    </delete>
    
 </mapper>

6.在主配置文件中包含mapper文件

在这里插入图片描述

使用文件路径的方式 <mapper resource="文件路径/子路径/XXX.xml"/>
也可以 <mapper class=""/>

7.编写一个测试类

package com.iflytek.test;

import java.io.IOException;
import java.io.Reader;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.io.ResolverUtil.Test;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.iflytek.domain.User;

public class MybatisTest {

	/*从src路径开始查找*/
	private static final String PATH = "mybatis-config.xml";
	/* 创建SqlSession对象*/
	private SqlSession session = null;

	/* 初始化方法*/
	public void init() throws IOException {
		//字符流
		Reader reader = Resources.getResourceAsReader(PATH);
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
		session = sessionFactory.openSession();
	}
	public void updateUser(User user) {
		int id=session.update("updateUser", user);
		session.commit();
		System.out.println(id);	
	}
	
	public int insertNewUser(User user) {
		int id= session.insert("insertNewUser", user);
		session.commit();
		 System.out.println(id); 
		return id;	
		
		/* 
		 * return session.insert("insertNewUser", user); 
		 * 不能使用上述返回方法  因为insert()方法需要提交
		 * 否则只存在缓存区内,关闭程序会导致发生回滚
		 * */
	}
	
	public int deleteUserById(int id) {
		int idx = session.delete("deleteUserById", id);
		session.commit();
		System.out.println(idx);
		return idx;	
	}
	
	public List<User> getAllUser(){
		/* session.selectList()参数与mapper中id对应 */
		List<User> list=session.selectList("getAllUser");
		return list;		
	}
	
	public User getOneById(int id) {
		return session.selectOne("getOneById", id);
	}
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		 MybatisTest test=new MybatisTest();
		 test.init();		
		/* 查询用户列表
		 * List<User> list=test.getAllUser(); 
		 * System.out.println(list); 
		 * */
			
		/*插入一条数据
		 * User user=new User(); user.setUsername("王娜2"); user.setPassword("123"); int
		 * i=test.insertNewUser(user); if(i==1) { System.out.println("插入数据成功!!"); }
		 */
		
		/*根据id删除某条数据
		 *  test.deleteUserById(3); 
		 *  
		 *   */
		 	
		/*更新一条数据
		 * User user=new User(); user.setUsername("zhang"); user.setPassword("123");
		 * user.setId(2);
		 * 
		 * test.updateUser(user);
		 */
		 
		 		
		  List<User> list=test.getAllUser(); 
		  System.out.println(list);
 
	}

}

绑定接口和绑定持久化类的区别

1.绑定接口:id与方法名相同
2.绑定类:id可以随便取

附1:数据库和表设计

user_info表设计:
在这里插入图片描述

附2:db.properties文件示例

#MySql infomation
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/train?useUnicode=true&characterEncoding=UTF-8
username=root
password=

换成自己的数据库登录信息等!!

我的联系方式:QQ:1207787189
如您有问题可与我联系

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Mybatis-plus的invalid bound statement (not found)错误通常是因为在mapper XML文件中,没有义对应的SQL语句导致的。这种错误通常会在运行时抛出,提示找不到指的SQL语句。解决这种错误的方法是在mapper XML文件中,义相应的SQL语句,并使用正确的方法名进行引用。 首先,我们需要检查mapper XML文件中的方法名和Java接口中的方法名是否一致。如果不一致,需要修改Java接口中的方法名,以和mapper XML文件中的方法名保持一致。 如果方法名一致,我们需要检查mapper XML文件中是否存在对应的SQL语句。如果不存在,需要手动添加SQL语句,并在Java接口中引用该SQL语句的方法名。 最后,我们可以使用Mybatis-plus的日志输出功能来位该错误。在控制台中查看日志,可以看到具体的错误信息,从而更快地找到解决方法。 总之,要解决mybatis-plus的invalid bound statement (not found)错误,我们需要检查方法名是否一致并在mapper XML文件中义相应的SQL语句。另外,使用日志输出功能可以更快地位错误并解决问题。 ### 回答2: Mybatis-plus的无效语句(找不到)是指在Mybatis-plus中的mapper.xml文件中,找不到所义的语句。这种错误通常会在应用程序在执行SQL语句时发生。 这种错误通常是由于mapper.xml文件中的SQL语句拼写错误、缺失或者是没有正确的义,以及在映射接口中指命名空间与mapper.xml文件中所义的不相符等原因。 要解决这个问题,需要检查mapper.xml文件中的SQL语句是否正确,如果存在拼写错误,需要进行修改;同时还需要确认命名空间是否正确,并且确保映射接口中的方法名与mapper.xml文件中所义的语句名相同。 如果上述步骤都没有解决问题,可以尝试重新生成mapper.xml文件和映射接口,以确保代码中的所有文件都是正确的,并且都具有一致性。此外,还可以尝试查看应用程序日志文件,以了解是否有其他的错误信息。 ### 回答3: 这个错误通常是由于MyBatis-Plus未能找到指的SQL语句而引起的。 可能是以下任何一种原因: 1. 没有正确的映射器文件或映射器接口。请检查映射器文件和接口是否在正确的位置,并且是否正确设置了命名空间和方法名。 2. SQL语句拼写错误或命名不一致。请确保查询语句或参数与映射器文件或接口文件中的正确匹配,并且SQL语句的命名义相同。 3. 数据库连接出现问题。检查数据库连接设置并确保数据库能够正确连接。可以使用ping命令或数据库客户端测试连接。 4. MyBatis-Plus版本与其他依赖项不匹配。请确保MyBatis-Plus与其他依赖项的版本兼容,并且没有版本冲突。 要解决这个问题,可以尝试使用MyBatis-Plus提供的日志工具来调试,并检查以上可能的原因。如果无法解决,可以分享到官方社区或GitHub上,以寻求帮助和解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值