Mybatis(1)---入门篇单表查询

1.Mybatis介绍

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

2.Mybatis配置

1.创建工程配置pom.xml

首先在idea中创建Maven工程,构建好项目后会在项目的根目录发现一个叫做pom.xml的配置文件。
以下是pom.xml的配置
ps: 记得导入jar包哟

<?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"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.test</groupId>
    <artifactId>day03_mybatis_many2many</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</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>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
    </dependencies>

</project>

2. 创建全局配置文件SqlMapConfig.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 可以在该标签内配置连接数据库的信息,也可以通过属性引用外部配置文件信息
        resources属性 用于指定配置文件的位置,是按照类路径写法来写的,且必须存在于类路径下。
        url属性 是按照url的写法来写的 file:///c://xxx/xxx 类似这样
    -->
    <properties resource="JDBC.properties">
       <!-- <property name="driver" value="com.mysql.jdbc.Driver"/>-->  <!--这种写法就是在标签内直接配置-->
        <!--使用 resource属性这种的就是引用外部的配置文件 这里是用resource下的JDBC.properties文件-->
    </properties>

    <!--typeAliases 是取别名  typeAlias是为type属性的取一个alias中的别名

    -->
    <typeAliases>

<!--        <typeAlias type="com.test.domain.User" alias="user"></typeAlias>-->
       <!--用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写-->
        <package name="com.test.domain"/>

    </typeAliases>

    <!--配置环境-->
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED"> <!--连接池配置  dataSource中 type属性是连接池的种类 推荐用POOLED-->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!-- <mapper resource="com/test/Dao/IUserDao.xml"></mapper> -->
        <!-- 这里的package标签是用于指定dao接口的所在的包,当指定了之后就不需要再写mapper及其他的属性resource 或者 class -->
        <package name="com.test.Dao"/>

    </mappers>


</configuration>

在标签properties里可以导入外部的配置文件也可以直接用property标签进行设置属性,这边本人建议使用外部导入的配置文件 导入配置文件可以用url 属性或是resource属性 我建议用resource属性,因为把文件放入resources文件夹下的话,使用resource属性只需要写文件名就行了。

typeAliases标签可以设置别名,就是在一些sql标签中如果没有设置别名 ,在引入该类的时候就要写全限定类名,这样针对开发来说是比较麻烦的。typeAliases标签下的typeAlias标签的功能是设置别名的,type是要要设置别名的全限定类名,alias是别名。但是typeAliases标签有有个package标签 ,这个标签用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写。强烈推荐使用package。

environments标签是用来配置sql环境的

<!--mybatis的主配置文件-->
<configuration>
    <!--配置环境-->
    <environments default="mysql">
        <!--配置mysql环境-->
        <environment id="mysql">
            <!--配置事务类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源(连接池)-->
            <dataSource type="POOLED"> <!--连接池配置  dataSource中 type属性是连接池的种类 推荐用POOLED-->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

enviroment标签中的id属性的值要与environments标签中的default属性一致

mappers标签是用来指定映射配置文件的位置 , 映射配置文件指的是每个dao独立的配置文件

mappers标签下的mapper标签是用来映射配置文件的 ,resource用来映射dao的配置文件的位置 (这种是采用xml配置),还有一种是使用注解配置,该配置方式要使用class属性来配置-------对应dao的接口文件的全限定类名

当然这种映射对于开发来讲是比较麻烦的,不过我们可以采用mappers标签下的package标签 这个标签可以用于指定dao接口的所在的包,当指定了之后就不需要再写mapper及其他的属性resource 或者 class

3. 配置mapper映射文件

Ps:mapper映射文件的名称最好要和对应的DAO接口的名称一致。例如IUserDao.java接口,对应的mapper的文件名就是IUserDao.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.test.dao.IUserDao">
    <!--配置查询所有--> <!--有了它就有了执行的sql语句,就可以获取PreparedStatement对象-->
    <select id="findAll" resultType="com.test.domain.User" >
        select *from user;
    </select><!--此配置中还有封装的实体类全限定类名-->
</mapper>

mapper标签中的namespace属性就是对应Dao的全限定类名

select标签的id属性就是对应Dao中的方法名称 resultType就是映射封装类型
Ps:当取了别名之后resultType这边就可以用别名来代替

3.入门案例

1.配置JavaBean

JavaBean得继承配置Serializable序列化接口,为了是接下来的Mybatis的使用

package com.test.domain;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

public class User implements Serializable {

    private Integer id;
    private String username;
    private String address;
    private String sex;
    private Date birthday;

    /*多对多的关系映射 :一个用户可以具有多个角色*/
   /* private List<Role> roles; */

   /* public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }*/

    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 getAddress() {
        return address;
    }

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

    public String getSex() {
        return sex;
    }

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

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

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

2.配置IUserDao.java

package com.test.Dao;

import com.test.domain.QueryVo;
import com.test.domain.User;

import java.util.List;

/**
 * 用户的持久层接口
 */
public interface IUserDao {

    /**
     * 查询所有用户
     * @return
     */
    List<User> findAll();
    /**
     * 查询一个用户
     */
    User findOne(Integer id);
    /**
     * 模糊查询
     */
    List<User> findbyname(String username);
    /**
     * 通过QueryVo 模糊查询
     */
    List<User> findbyVo(QueryVo vo);
    /**
     * 查询用户总条数
     */
    int findTotal();
    /**
     * 保存用户
     */
    void saveUser(User user);
    /**
     * 修改用户
     */
    void updateUser(User user);
    /**
     * 删除用户
     */
    void deleteUser(Integer id);

}

3.配置IUserDao.xml

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.test.Dao.IUserDao">
    <!--resultType 是查询结果保存的类型-->
    <select id="findAll" resultType="com.test.domain.User">
        select *from user;
    </select>
    <!--parameType 是保存插入修改数据的类型-->
    <insert id="saveUser" parameterType="com.test.domain.User">
    <!--在保存用户之后,获取用户的id keyProperty是指(属性名称)id在实体类中的名称 order是指该操作是在保存用户之前执行还是在之后执行 keyColumn(列名)是id在数据库里的名称 -->
        <selectKey keyProperty="id" resultType="int" order="AFTER" keyColumn="id">
        select last_insert_id()
        </selectKey>
        insert into user(username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})
    </insert>
    <update id="updateUser" parameterType="com.test.domain.User">
        UPDATE user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
    </update>
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id=#{uid}
    </delete>
    <!--查询单个用户-->
    <select id="findOne" parameterType="java.lang.Integer" resultType="com.test.domain.User">
        select *from user where id=#{uid}
    </select>
    <!--模糊查询-->
    <select id="findbyname" parameterType="java.lang.String" resultType="com.test.domain.User">
        select *from user where username like #{uname}
        <!--select *from user where username like '%${value}%' --> <!--第二种方式  但是¥里面的名称必须是value  第一种好-->
    </select>
    <!--查询用户的总记录条数-->
    <select id="findTotal" resultType="int" >
        select count(id) from user
    </select>
    <select id="findbyVo" parameterType="com.test.domain.QueryVo" resultType="com.test.domain.User">
         select *from user where username like #{user.username}
    </select>
</mapper>

4.创建测试类使用Junit

由于该博客是为本人日后复习准备,所以有些知识就不再多说
毕竟今天是情人节,看不懂你咬我啊(来自单身狗的群嘲)

package com.test.Test;


import com.test.domain.QueryVo;
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 com.test.Dao.IUserDao;
import com.test.domain.User;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

public class MybatisTest {

    private InputStream in=null;
    private SqlSessionFactory factory=null;
    private SqlSession sqlSession=null;
    private IUserDao userDao=null;

    /**
     *  @Before 在方法执行前执行
     * @throws IOException
     */

    @Before
    public void Init() throws IOException{
        //1.读取配置文件,生成字节输入流
        in= Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.获取SqlSessionFactory工厂
//        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//        /*因为SqlSessionFactory是一个接口不能直接实现所以通过SqlSessionFactoryBuilder对象*/
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
        //3.获取SqlSession对象
        sqlSession = factory.openSession();
        //4.获取dao的代理对象
        userDao=sqlSession.getMapper(IUserDao.class);


    }

    /**
     * @After 在方法执行之后执行
     * @throws IOException
     */
    @After
    public void destroy() throws IOException{
        //提交事务
        sqlSession.commit();
        if(sqlSession!=null){
            sqlSession.close();
        }
        if(in!=null){
            in.close();
        }
    }

    /**
     * 测试查询所有
     */
    @Test
    public void testFindAll() {

        List<User> users=userDao.findAll();
        for(User user : users ){
            System.out.println(user);
        }

    }
    /**
     * 测试查询一个用户信息
     */
    @Test
    public void testFindOne() {

        User user=userDao.findOne(1);

        System.out.println(user);


    }
    /**
     * 模糊查询
     */
    @Test
    public void testFindname() {
       List<User> users=userDao.findbyname("%王%");/*第一种 第一种好 因为第一种 是占位符方式*/
        //List<User> users=userDao.findbyname("王"); /*第二种方式的写法*/
        for(User user : users ){
            System.out.println(user);
        }

    }
    /**
     *  使用QueryVo封装user实现模糊查询
     */
    @Test
    public void testFindVo() {
        QueryVo vo=new QueryVo();
        User user=new User();
        user.setUsername("%王%");
        vo.setUser(user);
        List<User> users=userDao.findbyVo(vo);

        for(User u : users ){
            System.out.println(u);
        }

    }

    /**
     * 用户总条数
     */
    @Test
    public  void testFindTotal(){
        int cout=userDao.findTotal();
        System.out.println(cout);
    }

    /**
     * 保存用户
     */
    @Test
    public void testSave(){
        User user=new User();
        user.setUsername("test two");
        user.setBirthday(new Date());
        user.setAddress("福建福州");
        user.setSex("女");
        System.out.println(user);
        //执行保存用户操作Save
        userDao.saveUser(user);
//        //提交事务
//        sqlSession.commit();
        System.out.println(user);

    }

    /**
     * 修改用户信息
     */
    @Test
    public void testUpdate(){
        User user=new User();
        user.setId(15);
        user.setUsername("陈王");
        user.setBirthday(new Date());
        user.setAddress("福建宁德");
        user.setSex("女");
        //执行修改用户操作
        userDao.updateUser(user);
    }
    /**
     * 删除用户
     */
    @Test
    public void testDelete(){

        //执行删除用户操作
        userDao.deleteUser(2);
    }



}

5.入门案例查询结果展示

在这里插入图片描述

4.作者有话讲

今天是情人节,本人闲来无事在朋友圈里‘溜达’,哪曾想狗粮撒我一脸,心中悲愤无处宣泄,想到2020年年初的不堪,不敢多添事端,安心在家即可。又想到天天在csdn里白嫖大佬的成果,呸!成果(诸葛大力)是我的!!!内心忐忑不安,唯有将心比心,将近日所学奉献给如我这般的小白,顺便找点事做躲过这个该死的情人节!别说了,这一切要从…吃了…开始!武汉加油!中国加油!!

发布了2 篇原创文章 · 获赞 2 · 访问量 168

猜你喜欢

转载自blog.csdn.net/xiuyuandashen/article/details/104310992