发表于: 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"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<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 id, String 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());
评论