Las notas de estudio MyBatis conexión de base

Pequeña estructura de proyecto de la práctica:

El primer paso: primeras referencias paquete frasco, dos paquetes utiliza aquí, mybaits y MySQL

Paso Dos: Configurar SqlMapConfig.xml y jdbc.properties

jdbc.properties

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/jtsys
jdbc.username=root
jdbc.password=root

mybaits-config.xml

<?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 resource="jdbc.properties"/>

    <!-- 设置驼峰命名规则 -->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <!-- 对事务的管理和连接池的配置 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClass}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>

    <!-- mapping 文件路径配置 -->
    <mappers>
        <mapper resource="mapper/UserMapper.xml" />
    </mappers>
</configuration>

Tercer paso: Escribir POJO, XXXMapper.xml, XXXDao Interfaz

cantar:

package pojo;

public class User {

    private Integer id;
    private String username;
    private String mobile;
    private String email;

    public Integer getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", mobile='" + mobile + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

Interfaz XXXDao

package mapper;

import org.apache.ibatis.annotations.Param;
import pojo.User;

public interface UserDao {
    /**
     * 根据id进行查询
     */
    User findById(@Param("id") Integer id);
}

XXXMapper.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="mapper.UserDao">
    <select id="findUsers" resultType="pojo.User">
        select id,username,email,mobile from sys_users
    </select>

    <select id="findById" resultType="pojo.User">
        select id,username,email,mobile from sys_users where id=#{id}
    </select>

</mapper>

Paso cuatro: mybaits empiezan a conectarse a la base de datos

package connTest;

import mapper.UserDao;
import pojo.User;
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.IOException;
import java.io.InputStream;
import java.util.List;

public class ConnDB {
    public static void main(String[] args) throws IOException {
        /**
         * mybatis连接数据库步骤:
         */
        //1.读取配置文件
        InputStream stream = Resources.getResourceAsStream("mybatis-config.xml");
        //2.获取sessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(stream);
        //3.创建session对象
        SqlSession session = sqlSessionFactory.openSession();
        /**
         * mybatis连接数据库,有三种方式:
         * 第一种同jdbc类似,通过获取连接,得到传输器,然后发送sql指令进行连接数据库。
         * 第二种方式,通过XXXmapper.xml方式连接数据库。
         * 第三种方式,通过创建XXXDao接口,调用XXXMapper.xml文件连接数据库。
         */
        //4:第一种,发送XXXMapper.xml中定义的方法
        String mapperId = "mapper.UserDao.findUsers";
        List<User> users = session.selectList(mapperId);
        for (User user : users) {
            System.out.println(user);
        }
        //4:第二种:通过接口调用XXXMapper.xml中定义的方法
        UserDao userDao = session.getMapper(UserDao.class);
        User user = userDao.findById(19);
        System.out.println(user);
        session.close();
    }
}

Aquí mybatis conexión con la base de datos se ha completado, la siguiente re-aprendizaje multi-mesa investigación conjunta:

Muchos consulta asociación: clases y mesa de estudiante

Clase objetos: clazz

package com.cy.pj.pojo;

import java.util.List;

public class Clazz {
    private Integer id;
    private String name;
    private Integer principalId;
    private Teacher principal;
    private List<Student> studentList;

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getPrincipalId() {
        return principalId;
    }

    public void setPrincipalId(Integer principalId) {
        this.principalId = principalId;
    }

    public List<Student> getStudentList() {
        return studentList;
    }

    public void setStudentList(List<Student> studentList) {
        this.studentList = studentList;
    }

    public Teacher getPrincipal() {
        return principal;
    }

    public void setPrincipal(Teacher principal) {
        this.principal = principal;
    }

    @Override
    public String toString() {
        return "Clazz{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", principalId=" + principalId +
                ", principal=" + principal +
                ", studentList=" + studentList +
                '}';
    }
}

Los estudiantes del objeto: estudiante

package com.cy.pj.pojo;

public class Student {
    private Integer id;
    private String name;
    private String gender;
    private Integer age;
    private String address;
    private Integer classId;

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Integer getClassId() {
        return classId;
    }

    public void setClassId(Integer classId) {
        this.classId = classId;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                ", classId=" + classId +
                '}';
    }
}

La creación de Dao y XXXMapper.xml:

OtherDao

package com.cy.pj.mapping;

import com.cy.pj.pojo.Clazz;
import com.cy.pj.pojo.Teacher;

import java.util.List;

public interface OtherDao {

    List<Clazz> findClassWithStudent();

    List<Teacher> findTeacher();
}

OtherMapper.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,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
例如namespace="com.springdemo.mapping.userMapper"就是com.springdemo.mapping(包名)+userMapper(userMapper.xml文件去除后缀)
 -->
<mapper namespace="com.cy.pj.mapping.OtherDao">

    <!-- clazz表和student表设置为一对多关系
    association/collection中column可以理解为resultmap关联的表中存放着association/collection中关联表的何种关系,
    如果一对多,需要在多的一方存放resultMap关联表中的id,所以用id关联去查,可以查出多个。
    如果一对一,可能在resultMap表中存放了association表的id,用存放association表中id的列去查。-->
    <resultMap id="queryClazzStudent" type="com.cy.pj.pojo.Clazz">
        <id property="id" column="id"/>
        <association property="principal" column="principalId" javaType="com.cy.pj.pojo.Teacher" select="findTeacherByPId"></association>
        <collection property="studentList" column="id" ofType="com.cy.pj.pojo.Student" javaType="ArrayList" select="findStudent">
        </collection>
    </resultMap>

    <select id="findClassWithStudent" resultMap="queryClazzStudent">
        select * from clazz
    </select>
    <select id="findTeacherByPId" resultType="com.cy.pj.pojo.Teacher">
        select * from teacher where id=#{id}
    </select>
    <select id="findStudent" resultType="com.cy.pj.pojo.Student">
        select * from student where classId=#{id}
    </select>

    <!-- teacher表和course表设置为一对一关系 -->
    <resultMap id="queryTeacherWithCourse" type="com.cy.pj.pojo.Teacher">
        <id property="id" column="id"/>
        <association property="course" column="id" javaType="com.cy.pj.pojo.Course" select="findCourse"></association>
    </resultMap>

    <select id="findTeacher" resultMap="queryTeacherWithCourse">
        select * from teacher
    </select>
    <select id="findCourse" resultType="com.cy.pj.pojo.Course">
        select * from course where teacherId=#{id}
    </select>
</mapper>

clase de prueba por escrito para la prueba:

package com.cy.pj.conntest;

import com.cy.pj.mapping.DeptDao;
import com.cy.pj.mapping.OtherDao;
import com.cy.pj.pojo.Clazz;
import com.cy.pj.pojo.Dept;
import com.cy.pj.pojo.Role;
import com.cy.pj.pojo.Teacher;
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.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

public class ConnDatabase {
    public static void main(String[] args) throws IOException, SQLException {

        InputStream inputStream = Resources.getResourceAsStream("Mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        /**
         * mybatis连接数据库方式一:通过mapper.xml中的key连接数据库
         */
        /*String statement = "com.cy.pj.mapping.RoleMapper.getRole";
        Role role = sqlSession.selectOne(statement, 1);
        System.out.println(role);*/

        /**
         * mybatis连接数据库方式二:利用反射XXXmapper类连接数据库
         */
        /*DeptDao deptDao = sqlSession.getMapper(DeptDao.class);
        List<Dept> depts = deptDao.findAllDept();
        for (Dept dept : depts) {
            System.out.println(dept);
        }*/
        /**
         * clazz表和student表为一对多关系,利用collection进行联合查询
         */
        OtherDao otherDao = sqlSession.getMapper(OtherDao.class);
        List<Clazz> clazzList = otherDao.findClassWithStudent();
        for (Clazz clazz : clazzList) {
            System.out.println(clazz);
        }
        /**
         * course表和teacher表设置一对一关系,利用association进行联合查询
         */
        /*OtherDao otherDao = sqlSession.getMapper(OtherDao.class);
        List<Teacher> teacherList = otherDao.findTeacher();
        for (Teacher teacher : teacherList) {
            System.out.println(teacher);
        }*/

        /**
         * mybatis连接数据方式三:利用statement连接数据库
         */
        /*Connection connection = sqlSession.getConnection();
        Statement statement = connection.createStatement();
        ResultSet resultSet = statement.executeQuery("select * from sys_roles");
        while (resultSet.next()){
            String name = resultSet.getString("name");
            String note = resultSet.getString("note");
            System.out.println("name="+name+";note="+note);
        }*/
    }
}

resultados de la prueba son los siguientes:

 Se puede observar el uso de las dos tablas asociadas con muchas consultas, el uso principal de la colección de consulta y relación uno a uno entre el uso de la indagación asociación asociación, principalmente de la siguiente:

<resultMap id="queryClazzStudent" type="com.cy.pj.pojo.Clazz">
<!--将resultMap中的对象成为对象一,里面有两个属性,id为resultMap的唯一标识,type为关联的对象一
下面可以设置<id property="此为对象一的属性" column="此为对象对应表中的列名"/>一对多关联查询时,<id/>不可少,<result property="与id相同" column="与id相同">-->
    <id property="id" column="id"/>
    <association property="principal" column="principalId"         
         javaType="com.cy.pj.pojo.Teacher" select="findTeacherByPId">
    <!-- association关联对象为对象二,对象二与对象一一般为一对一关系,对象一中有一个属性是对象二,        <association property="对象一中关于对象二的属性" column="此属性为对象一与对象二的关联关系,比如对象一对应的表中存放对象二对象表的id之类的" javaType="对象二" select="查询对象二的方法">-->
    </association>
    <collection property="studentList" column="id" ofType="com.cy.pj.pojo.Student" 
         javaType="ArrayList" select="findStudent">
     <!---collection相关属性同association相似 不过这里关联对象三利用ofType,javaType为集合list类型->
    </collection>
</resultMap>

    <select id="findClassWithStudent" resultMap="queryClazzStudent">
        select * from clazz
    </select>
    <select id="findTeacherByPId" resultType="com.cy.pj.pojo.Teacher">
        select * from teacher where id=#{id}
    </select>
    <select id="findStudent" resultType="com.cy.pj.pojo.Student">
        select * from student where classId=#{id}
    </select>

Resumen: principalmente relacionados con el proceso mybatis consulta la base de datos, los pasos de conexión de base de datos mybatis, perfiles de configuración, el proceso de consulta de consultas jerárquicas, DAO mapper.xml operación, mapper.xml consulta los datos y devolver los resultados, así como de varias uniones de tablas consulta.

Añadir un poco de conocimiento SQL dinámico para facilitar el examen:

SQL dinámico:

1. <donde> </> donde las condiciones dinámicas donde complemento

<Si la prueba = ""> </ si> determinación dinámica, determina si el argumento pasado correctamente

select * from emp
<where>
<if test="name != null and name !=''">
    name like concat('%',#{name},'%')
</if>
<if test="job != null and job != ''">
    and job = #{job}
</if>
</where>

2. <colección foreach = item "ids" = "id" separador = "" = abiertos "(" close = ")"> </ froeach>

<insert id="addBatchSave" >
  	insert into tbl_employee(last_name,email,gender) values
  	<foreach collection="emps" item="emppp" separator=",">
		(#{emppp.lastName},#{emppp.email},#{emppp.gender})
	</foreach>
 </insert> 

3. <set> </ set> actualizaciones dinámicas

<update id="updateEmp">
	 	update emp 
	 		<set>
	 		<if test="name != null and name != ''">
	 			name=#{name},
	 		</if>
	 		<if test="job != null and job != ''">
	 			job=#{job}
	 		</if>
	 	</set>
	 	where id=#{id}
	 </update>

4. <sql id = "idName"> </ sql> usado con frecuencia fragmento encapsulación sql, la referencia es <includ refid = "idName">

<sql id="insertColumn">
		<if test="_databaseId=='mysql'">
			id,last_name,email,gender
		</if>
		<if test="_databaseId=='oracle'">
			id,last_name,email,department_id
		</if>
	</sql>
	<insert id="addEmployeeBysql" databaseId="mysql">
		insert into tbl_employee(
			<!-- 引用外部定义的sql -->
			<include refid="insertColumn" ></include>
		) 
		values (#{id},#{lastName},#{email},#{gender})
	</insert>

5. <ajuste prefijo = "donde" prefixOverrides = "" sufijo = "" suffixOverrides = "y">

prefix = "": Prefijo: Ajuste del cuerpo de lengüeta de importancia para luchar contra el resultado de toda la cadena de cadena. prifix toda la cadena para luchar contra una cadena de prefijo

prifixOverrides = "": anulación de prefijo: la eliminación de toda la cadena de caracteres delante de la adicional

sufijo = "": Sufijo: para luchar contra toda la cadena de caracteres más una cadena sufijo

suffixOverrides = "": cubierta sufijo: Eliminación de toda la cadena de caracteres seguido por exceso

Alternativamente valores integrales que comienza con el prefijo, mediante la sustitución de parte del sufijo final global.

select * from emp
    <trim prefix="where" prefixOverrides="" suffix="" suffixOverrides="and">
    <if test="job != null and job != ''">
    	job=#{job} and
    </if>
    <if test="topid != null and topid != ''">
    	topid=#{topid} and
    </if>
    </trim>

6. <eligió> <cuando test = ""> </ cuando> <cuando test = ""> </ cuando> </ eligió>

Cuando primera vez establecido, no ejecutará hacia abajo. Mientras un frente no se sostiene, se ha reducido a juez, encuentre el final de la creación.

select * from emp 
<where>
    <choose>
        <when test="name != null and name != ''">
        	name like concat('%',#{name},'%')
        </when>
        <when test="job != null and job !=''">
        	and job=#{job}
        </when>
    </choose>
</where>

 

Publicado 15 artículos originales · ganado elogios 0 · Vistas 277

Supongo que te gusta

Origin blog.csdn.net/weixin_45146962/article/details/104864641
Recomendado
Clasificación