研究ノートMyBatisのデータベース接続

小さな実践プロジェクト構造:

最初のステップ:最初の参照のjarパッケージには、二つのパッケージは、ここmybaitsとMySQLを使用しました

ステップ2:設定のMyBatisの-config.xmlのと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>

ステップ3:書き込みPOJO、XXXMapper.xml、XXXDaoインタフェース

歌います:

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 + '\'' +
                '}';
    }
}

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>

四ステップ:mybaitsは、データベースへの接続を開始

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();
    }
}

ここでは、データベースへの接続は、次の再学習マルチテーブル共同調査を完了したMyBatisの:

多くの関連クエリ:クラスと生徒のテーブル

クラスは、オブジェクト: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 +
                '}';
    }
}

学生は、オブジェクト:学生

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 +
                '}';
    }
}

ダオと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>

テストのために書かれたテストクラス:

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);
        }*/
    }
}

次のようにテスト結果は以下のとおりです。

 主に次のように、多くのクエリ、クエリのコレクションの主な用途、および関連団体の問い合わせの使用の間に1対1の関係に関連した2つのテーブルを使用して見ることができます。

<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>

要約:主にプロセスに関連するデータベース、データベース接続ステップはMyBatisの、構成プロファイル、階層クエリのクエリ処理、DAO操作mapper.xmlを、クエリMyBatisのmapper.xmlクエリデータおよび結果、ならびにマルチテーブルの結合などを返しますクエリ。

レビューを容易にするために、いくつかの動的SQLの知識を追加します。

動的SQL:

1. <ここ> </>動的条件場所を追加

<かどうかをテスト=「」> </ IF>動的決意、引数が正しく渡されたか否かを判断します

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. <foreachのコレクション= "IDS" 項目= "ID" セパレータ= "" オープン= "(" クローズ= ")"> </ 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. <セット> </セット>動的更新

<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>頻繁に使用される断片カプセル化SQL、参照は<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. <トリム接頭辞= "" prefixOverrides = "" サフィックス= "" suffixOverrides = "と">

接頭辞=「」:プレフィックス:トリムタブ本体の重要性は、文字列全体の文字列の結果を戦うために。接頭文字列を戦うために文字列全体をprifix

prifixOverrides =「」:オーバーライド・プレフィックス:余分の前の文字の文字列全体を削除

接尾辞=「」:サフィックス:文字列全体プラスサフィックス文字列を戦うために

suffixOverrides =「」:接尾カバー:過剰に続く文字の文字列全体を削除します

また、積分値は、全体の最終サフィックスの一部を交換することにより、接頭辞で始まります。

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. <選んだ> <ときテスト= ""> </場合> <ときテスト= ""> </場合> </選びました>

最初に設立されたときにすると、それがダウンして実行されません。限りフロントが保持していないとして、それは設立の終わりを見つけ、裁判官にダウンしています。

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>

 

公開された15元の記事 ウォンの賞賛0 ビュー277

おすすめ

転載: blog.csdn.net/weixin_45146962/article/details/104864641