发表于: 2020-11-17 22:39:50

1 1471


今天完成的事情:

驼峰命名法

变量的命名规则如下:
小驼峰式命名法(lower camel case): 第一个单词以小写字母开始;第二个单词的首字母大写,例如:userName、sendAddress
大驼峰式命名法(upper camel case): 每一个单字的首字母都采用大写字母,例如:FirstName、LastName
不过在程序员中还有一种命名法比较流行,就是用下划线“_”来连接所有的单词,比如user_name
动态SQL
一开始在mySpringMybatis中做,然后发现在mapper接口写了接口,还要在service还有在写一次(事后发现其实不用)。然后跑去在MybatisTest项目中做,运行没有结果,在这里面也没有设置日志。最后觉得还是重新写一个mybatis项目,用来测试动态SQL,在写个过程中,发现自己对创建一个mybatis需要那些文件依旧不是熟悉,于是对着的一个网上找的项目一步一步来,做的进度很慢,因为老是没做完这个就跑去做另外一个,太着急了,结果导致什么都没完成,最后还是冷静下来,先做完一个,在去做另一个。
以后还是定一个顺序,
第一步,pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<modelVersion>4.0.0</modelVersion>
<groupId>com.kbk</groupId>
<artifactId>MybatisDynamicSQL</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
</project>
第二步,jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=wsj199599
第三步,mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
<configuration>
<!-- 配置properties-->
<properties resource="jdbc.properties"></properties>
<!--使用typeAliases配置别名,它只能配置domain中类的别名 -->
<typeAliases>
<package name="com.kbk.pojo"></package>
</typeAliases>
<!--配置环境-->
<environments default="mysql">
<!-- 配置mysql的环境-->
<environment id="mysql">
<!-- 配置事务 -->
<transactionManager type="JDBC"></transactionManager>
<!--配置连接池-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
</environment>
</environments>
<!-- 配置映射文件的位置 -->
<mappers>
<mapper resource="Mapper.xml"/>
</mappers>
</configuration>
第四步,实体类student
package com.kbk.pojo;
import java.util.Date;
public class Student{
private Integer id;
private String name;
private Integer studentId;
private Integer gender;
private Date birthday;
public Student(){
}
public Student(Integer idString name,Integer studentId,Integer gender,Date birthday){
this.id = id;
this.name = name;
this.studentId = studentId;
this.gender = gender;
this.birthday = birthday;
}
第五步,定义DAO接口
package com.kbk.dao;
import com.kbk.pojo.Student;
import java.util.List;
/**
@author
@Company
*
用户的持久层接口
*/
public interface StudentDao {
/**
根据传入参数条件
@param student 查询的条件:有可能有ID,有可能有Name,也有可能有学号,还有可能是都有
@return
*/
List<Student> findStudentByCondition(Student student);
/**
根据传入id,遍历结果集
@param idList 
@return
*/
List<Student> findStudentByIdList(List<Integer> idList);
}

第六步,mapper.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.kbk.dao.StudentDao">

   <!-- 根据条件查询-->
   <select id="findStudentByCondition"  resultType="com.kbk.pojo.Student">
       select * from student
<where>
       <if test="id != null">
         and id = #{id}
</if>
       <if test="name != null" >
           and name = #{name}
</if>
       </where>
   </select>


<!--    遍历结果集-->
    <select id="findStudentByIdList"  resultType="com.kbk.pojo.Student">
        select * from student
<where>
            <foreach collection="list" open="id in(" close=")" item="id" separator=",">
                #{id}
</foreach>

        </where>
    </select>
   
</mapper>


第七步,写测试类

package com.kbk;
import static org.junit.Assert.assertTrue;
import com.kbk.dao.StudentDao;
import com.kbk.pojo.Student;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
/**
* Unit test for simple App.
*/
public class MybatisTest {
private InputStream in;
private SqlSession sqlSession;
private StudentDao studentDao;
@Before//用于在测试方法执行之前执行
public void init()throws Exception{
//1.读取配置文件,生成字节输入流
in = Resources.getResourceAsStream("Mybatis-config.xml");
//2.获取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.获取SqlSession对象
sqlSession = factory.openSession(true);
//4.获取dao的代理对象
studentDao sqlSession.getMapper(StudentDao.class);
}
@After//用于在测试方法执行之后执行
public void destroy()throws Exception{
//提交事务
//6.释放资源
sqlSession.close();
in.close();
}
/**
根据传入参数条件
*/
@Test
public void testFindByCondition(){
Student s = new Student();
// s.setId(8);
s.setName("任逍遥");
// System.out.println("输出ID的值");
// System.out.println(s.getId());
//根据传入参数条件
List<Student> Students = studentDao.findStudentByCondition(s);
for(Student student : Students){
System.out.println(student);
}
}
/**
根据id遍历结果集
*/
@Test
public void testFindStudentByIds(){
List<Student> list = studentDao.findStudentByIdList(Arrays.asList(1,4,5));
for(Student student : list){
System.out.println(student);
}
}
}
这里碰到报错org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题,即在mybatis中dao接口与mapper配置文件在做映射绑定的时候出现问题,简单说,就是接口与xml要么是找不到,要么是找到了却匹配不到。
截图为网络中搜索到的常见原因:

发现是mybatis-config.xml,这个设置到DAO接口去了,应该设置为Mapper.xml
    <mappers>
        <package name="com.kbk.dao"></package>
    </mappers>
改成
    <!-- 配置映射文件的位置 -->
    <mappers>
        <mapper resource="Mapper.xml"/>
    </mappers>
查不到任逍遥的结果




在实体类中定义的int id有关,下面输出的id值为零(int的默认值为零)。所以SQL语句是select * from student WHERE id = ? and name = ?。将int修改成Integer(Integer的默认值为null),就可以的得到正确结果了


顺利查到遍历结果集


明天计划的事情:

继续做动态SQL剩下的学习标签, 使用自定义域名并通过配置本地Host来配置DB连接文件,ResultMap



遇到的问题:太着急了,想尽快完成动态SQL,做的过程太烦躁,静不下来。想太多了。而且mybatis还有很多不熟悉的地方,遇到不熟悉就会去搜,去了解,这个过程也比较急躁,也没有记住什么,还是先把它当作黑盒,做完动态SQL,在来整理一些mybatis中碰到的新问题。




收获:遇到不知道的值,可以直接输出它,试试。   比如:System.out.println("输出ID的值"); System.out.println(s.getId());



返回列表 返回列表
评论

    分享到