JavaEE 10.31作业

码云链接 https://gitee.com/Chuangzw/JavaEE_Learn/tree/master/student-springmvc-maven

结构

在这里插入图片描述
在这里插入图片描述

自动生成mybatis插件的实现

Springmvc整合mybatis,需要引入mybatis包,在pom.xml中添加以下依赖包:

 <!--mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!--mybatis spring整合-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.3</version>
        </dependency>

mybatis-generator插件

<plugins>
            <!--mybatis-generator插件-->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.2</version>
                <configuration>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
            </plugin>
        </plugins>

几个需要注意到的问题

mybatis-generator自动生成的代码 不能自动添加外键 所以要自己添加

Mapper.xml中的代码 自动生成的 参数都是bjid 需要改成 bj.ij

实现增删改查的两种方法

一是直接在Controller中 建立会话

//    BjDao bjDao=new BjDao();
//    Reader reader;
//    {
//        try {
//            reader = Resources.getResourceAsReader("mybatis-config.xml");
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
//
//    SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(reader);
//    SqlSession session = sessionFactory.openSession();

二是建立SqlSessionFactoryUtil

package cn.oneseek.student.util;

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 java.io.InputStream;

public class SqlSessionFactoryUtil {

	private static SqlSessionFactory sqlSessionFactory;
	
	private static SqlSessionFactory getSqlSessionFactory(){
		if(sqlSessionFactory==null){
			InputStream inputStream=null;
			try{
				inputStream= Resources.getResourceAsStream("mybatis-config.xml");
				sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		return sqlSessionFactory;
	}
	
	public static SqlSession openSession(){
		return getSqlSessionFactory().openSession();
	}
}

然后在Controller中

	private SqlSession session=SqlSessionFactoryUtil.openSession();
	private BjMapper bjDao = session.getMapper(BjMapper.class);

其他包

引入datasource数据源的包,引入了2种方式,但本次项目中,我们使用的是alibaba的Druid DataSource。

<!-- JDBC连接池 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
        <!-- DruidDataSource,本工程的dataSource配置使用的Druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.29</version>
        </dependency>

pom.xml build添加

<resources>
            <!--表示把java目录下的有关xml文件,properties文件编译/打包的时候放在resource目录下-->
            <resource>
                <directory>${basedir}/src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>${basedir}/src/main/resources</directory>
            </resource>
        </resources>

添加spring-jdbc

<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

问题

出现异常

	org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [spring-mvc.xml]; nested exception is java.lang.NoSuchMethodError: org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.getEnvironment()Lorg/springframework/core/env/Environment;

原因:忘记在mybatis-config.xml中配置

<typeAliases>
        <typeAlias alias="Bj" type="cn.oneseek.student.entity.Bj"/>
        <typeAlias alias="Student" type="cn.oneseek.student.entity.Student"/>
    </typeAliases>

<mappers>
        <mapper resource="cn/oneseek/student/mapping/BjMapper.xml"/>
        <mapper resource="cn/oneseek/student/mapping/StudentMapper.xml"/>
    </mappers>

Controller 里数据操作的两种方法

一种是:

session.selectList("cn.oneseek.student.dao.BjMapper.queryAll");

另一种

	private SqlSession session=SqlSessionFactoryUtil.openSession();
	private BjMapper bjDao = session.getMapper(BjMapper.class);
		List<Bj> bjList = bjDao.queryAll();

原生的mybatis-generator中没有一对一和一对多的关联关系的配置,所以反向生成代码的时候不会产生关联关系

手动添加一对多关系如下:

package cn.oneseek.student.entity;

import java.util.List;

public class Bj {
    private Integer id;

    private String bjname;
    
    List<Student> students;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getBjname() {
        return bjname;
    }

    public void setBjname(String bjname) {
        this.bjname = bjname;
    }
    public List<Student> getStudents() {
        return students;
    }
    public void setStudents(List<Student> students) {
        this.students = students;
    }
    @Override
    public String toString() {
        return "Bj [id=" + id + ", bjname=" + bjname + "]";
    }

}
package cn.oneseek.student.entity;

public class Student {
    private Integer id;

    private String sno;

    private String sname;

    private String sex;

//    private Integer bjid;
    private Bj bj;
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getSno() {
        return sno;
    }

    public void setSno(String sno) {
        this.sno = sno;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

//    public Integer getBjid() {
//        return bjid;
//    }
//
//    public void setBjid(Integer bjid) {
//        this.bjid = bjid;
//    }

    public Bj getBj() {
        return bj;
    }
    public void setBj(Bj bj) {
        this.bj = bj;
    }
    @Override
    public String toString() {
        return "Student [id=" + id + ", sno=" + sno + ", sname=" + sname + ", sex=" + sex + ", bj=" + bj + "]";
    }
}

控制台乱码

VM options;

-Dfile.encoding=UTF-8 

问题一:学生列表不显示班级

出现原因:控制台打印发现bj=null

[Student [id=1, sno=001, sname=����, sex=��, bj=null]]

未查询到班级

在Mapper里增加以下代码

<resultMap type="cn.oneseek.student.entity.Student" id="StudentWithBj">  <association property="bj" column="bjid" select="cn.oneseek.student.dao.BjMapper.selectByPrimaryKey"/></resultMap>
<select id="queryAllWithBj"  resultMap="StudentWithBj">
    select * from student
  </select>

问题二:增加学生时出错

原因:自动生成的entity没有bj.id属性

解决方法:

在StudentMapper.xml增加

<insert id="add" parameterType="Student"  >
    insert into student values(null,#{sno},#{sname},#{sex},#{bj.id})
  </insert>

StudentMapping.java

    void add(Student student);

问题三:出现错误

### Cause: org.apache.ibatis.reflection.ReflectionException: Could not set property 'bjid' of 'class cn.oneseek.student.entity.Student' with value '1' Cause: org.apache.ibatis.reflection.ReflectionException: There is no setter for property named 'bjid' in 'class cn.oneseek.student.entity.Student'

原因:

Student实体没有bjid

原文地址:https://www.cnblogs.com/ZCWang/p/12507463.html