我是一个初学者,学习mybatis框架。我查询可以查得出结果,但是添加就不能出结果。
首先这是实体数据类
package test;
public class Book1 {
private String name;
private String author;
public String getName() {
return name;
}
public String getAuthor() {
return author;
}
public void setName(String name) {
this.name = name;
}
public void setAuthor(String author) {
this.author = author;
}
public Book1(String name, String author) {
this.name = name;
this.author = author;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
'}';
}
public Book1() {
}
}
然后是mapper接口
public interface Bookmapper {
public List<Book1> select(String s);
public void add(Book1 book1);
}
两个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="test.Bookmapper">
<select id="select" resultType="test.Book1" parameterType="String">
select * from book where author = #{author}
</select>
<insert id="add" parameterType="test.Book1" databaseId="mysql">
insert into book (name,author) values(#{name}, #{author})
</insert>
</mapper>
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/class?verifyServerCertificate=false&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="weiziyao1214"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper.xml"/>
</mappers>
</configuration>
这是测试类
public class Text {
@Test
public void test() throws IOException {
Book1 b=new Book1("悉达多","黑塞");
String resource = "mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
Bookmapper mapper = session.getMapper(Bookmapper.class);
List<Book1> book = mapper.select("川端康成");
System.out.println(book);
mapper.add(b);
session.commit();
}
}
}
输出结果如下
[Book{name='雪国', author='川端康成'}, Book{name='雪国', author='川端康成'}]
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): test.Bookmapper.add
奇怪的是,我查询单条结果的时候返回为空,当我把返回值变成结果集的时候返回成功。但是添加操作就是不成。
通过查看你的异常:BindingException: Invalid bound statement (not found): test.Bookmapper.add
你的接口方法和xml文件中的add方法映射存在问题:
<insert id="add" parameterType="test.Book1" databaseId="mysql">
只需要把 databaseId="mysql" 删除就可以了,配置多数据库时用的,这还用不到.
改成这样就可以了:
<insert id="add" parameterType="test.Book1" >
插入时,定义的databaseId=“mysql”,这个属性并没有加载到。导致的报错。
你在mybayis中配置了mybatis数据库,如果配置的是多数据库,才需要用到这个属性来指定使用具体的数据库,否则不需要用该属性
各种可能原因有:
**1.你的mapper写在了java目录里面。*例如下图:这样会出现一个问题,即使你在properties里面配置了 mybatis.mapper-locations= classpath:com/lihaoyu/demo/dao/*.xml,也没有用,因为编译的时候这个xml文件并没有被自动拉到target里面,毕竟编译的是.java文件而不是xml嘛,所以这时候应该在pom文件里面加上:
</build>
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties,.xml文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
如果你把xml放到了resources文件下,那么就只需要配置mybatis.mapper-locations=classpath:*/mapper/*.xml 就可以了,因为构建的时候会把resources里的东西自动拉到classpath下,注意.classpath意思就是编译后target文件夹下的classes目录.
2.xml里面的namespace不对 或者id和mapper里面的方法名不一样,或者parameterType对应不上,都会出现这种问题。