Java第三十七天,Mybatis框架系列,用mybatis实现CURD

1.首先新建一个 Maven 项目

2.项目整体框架如下:

3.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"
         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.example</groupId>
    <artifactId>MySQLCURD</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.0</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.48</version>
        </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.5</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

4.log4j.properties

# 全局日志配置
log4j.rootLogger=ERROR, stdout
# MyBatis 日志配置
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

5.sqlMapperConfig.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>
    <!--主配置文件-->
    <!--配置环境-->
    <environments default="mysql">  <!--可为任意值,但该值必须出现在下面的 environment 标签中-->
        <!--配置mysql环境-->
        <environment id="mysql">
            <!--事务类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置m数据源(连接池)-->
            <dataSource type="POOLED">
                <!--配置连接数据库的基本信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/> <!--数据库驱动-->
                <property name="url" value="jdbc:mysql://localhost:3306/lanyue"/> <!--指明哪个数据库-->
                <property name="username" value="root"/>    <!--数据库用户名-->
                <property name="password" value="123456"/>  <!--数据库用户名密码-->
            </dataSource>
        </environment>
    </environments>

    <!--用resource属性指明配置文件-->
    <mappers>
        <mapper resource="mybatis/userDao.xml"/>
    </mappers>
</configuration>

6.userDao.xml

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="dao.IUserDao">     <!--namespace是指Dao的全限定域名,其中 .  代表目录,类似于 /-->
    <!--查询-->
    <!--有了它就能确定PreparedStatement,就可以执行配置文件中的SQL语句-->
    <!--resultType 声明了查询语句返回结果的数据类型-->
    <!--dao.IuserDao.findAll 指明了某个接口的某个方法-->
    <select id="findAll" resultType="entil.User">    <!--id 必须和相应 JAVA Dao 接口文件抽象方法同名-->
        select * from user;  <!--sql语句结尾的封号可有可无-->
    </select>

    <!--根据用户名(可能完整,可能不完整)进行模糊查询,返回一个用户列表-->
    <!--注意:这里并没有拼接 %(模糊查询关键字) ,所以在调用的时候,需要提供 % 号;这里属于占位符写法-->
    <!--select * from user where username like #{username}-->
    <!--这种写法就不需要在调用的时候写 %;但是必须写成 value-->
    <!--select * from user where username like '%${value}%'-->
    <!--  '%${}%' 属于字符串拼接写法,中间的属性名称必须写 value(源码绑定了)  -->

    <!--
    #{}表示一个占位符号
    通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,
    #{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类
    型值, #{}括号中可以是 value 或其它名称。
    ${}表示拼接 sql 串
    通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换, ${}可以接收简
    单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值, ${}括号中只能是 value。
    -->
    <select id="findUsersByLikeName" parameterType="java.lang.String" resultType="entil.User">
        select * from user where username like '%${value}%'
    </select>

    <!--查询得到总的用户数-->
    <select id="getUserNums" resultType="java.lang.Integer">
        select count(*) from user
    </select>

    <!--因为 deleteById 方法中只有一个基本类型(或者基本类型包装类)参数,因此这里只需要写一个占位符(随便起名)即可-->
    <select id="findById" resultType="entil.User" parameterType="java.lang.Integer">
        select * from user where officeid = #{id}
    </select>

    <!--parameterType 声明了插入语句中要插入的数据(由外界输入)的类型-->
    <!--解析传入数据的值得时候,要根据Mybatis的要求,使用 #{} 的形式取值;且字段名为对应的实体类的属性名称-->
    <!--id 对应的 save 和 findALL 都是 Dao 层接口定义的方法名,也是业务层调用文件时要使用的方法名-->
    <insert id="save" parameterType="entil.User">
        insert into user(officeid, username, password) values(#{officeid}, #{username}, #{password})
    </insert>

    <!--根据传入对象 user(匹配和传入对象 id 相同的对象) 跟新 指定user的其他字段-->
    <update id="update" parameterType="entil.User">
        update user set username=#{username}, password=#{password} where officeid=#{officeid}
    </update>

    <!--因为 deleteById 方法中只有一个基本类型(或者基本类型包装类)参数,因此这里只需要写一个占位符(随便起名)即可-->
    <delete id="deleteById" parameterType="java.lang.Integer">
        delete from user where officeid = #{id}
    </delete>
</mapper>

7.IUserDao.java

package dao;

import entil.User;
import java.util.List;

public interface IUserDao {
    public abstract User findById(Integer officeid);
    public abstract List<User> findUsersByLikeName(String username);
    public abstract List<User> findAll();
    public abstract Integer getUserNums();
    public abstract void save(User user);
    public void update(User user);
    public void deleteById(Integer officeid);
}

8.UserDaoImpl.java

package dao;

import entil.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 UserDaoImpl implements IUserDao{

    private InputStream in;
    private SqlSession sqlSession;
    private IUserDao userDao;

    public UserDaoImpl(){
        try {
            in = Resources.getResourceAsStream("SqlMapConfig.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
        //创建工厂
        //创建工厂时,mybatis使用了构建者模式,即找包工队盖房子,而不是自己亲自处理一系列问题
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        sqlSession = factory.openSession();
        userDao = sqlSession.getMapper(IUserDao.class);
    }

    // java中的析构函数
    @Override
    public void finalize(){
        sqlSession.close();
        try {
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public User findById(Integer officeid) {
        return userDao.findById(officeid);
    }

    public List<User> findUsersByLikeName(String username){
        return userDao.findUsersByLikeName(username);
    }

    public Integer getUserNums(){
        return userDao.getUserNums();
    }

    public List<User> findAll() {
        // 注意,这里的 userDao.xxx 中的 xxx 虽然调用的是 UserDao 接口定义的方法,但是同时需要在 Dao.xml 或者 mapper.xml 文件中定义并且实现的同名方法
        return userDao.findAll();
    }

    public void save(User user) {
        // 注意,这里的 userDao.xxx 中的 xxx 虽然调用的是 UserDao 接口定义的方法,但是同时需要在 Dao.xml 或者 mapper.xml 文件中定义并且实现的同名方法
        userDao.save(user);
        // 提交事务,否则会导致事务回滚而无法保存数据
        sqlSession.commit();
    }


    public void update(User user){
        // 注意,这里的 userDao.xxx 中的 xxx 虽然调用的是 UserDao 接口定义的方法,但是同时需要在 Dao.xml 或者 mapper.xml 文件中定义并且实现的同名方法
        userDao.update(user);
        // 提交事务,否则会导致事务回滚而无法保存数据
        sqlSession.commit();
    }

    public void deleteById(Integer officeid) {
        userDao.deleteById(officeid);
        // 提交事务,否则会导致事务回滚而无法保存数据
        sqlSession.commit();
    }
}

9.User.java

package entil;

import java.io.Serializable;

public class User implements Serializable {
    private Integer officeid;
    private String username;
    private String password;

    public Integer getOfficeid() {
        return officeid;
    }

    public void setOfficeid(Integer officeid) {
        this.officeid = officeid;
    }

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "officeid=" + officeid +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

10.Test.java

import dao.UserDaoImpl;
import entil.User;
import java.util.List;

public class Test {

    public static void main(String[] args) throws Exception{

        User user = new User();
        user.setOfficeid(1111111);
        user.setUsername("1111111");
        user.setPassword("1111111");

        UserDaoImpl userDao = new UserDaoImpl();

        // 增
        userDao.save(user);

        // 删
        userDao.deleteById(2);

        user.setOfficeid(3);
        user.setUsername("30000");
        user.setPassword("33333");

        // 改
        userDao.update(user);

        // 全量查
        List<User> all = userDao.findAll();
        for(User userTemp : all){
            System.out.println(userTemp.toString());
        }

        // 根据ID查
        user = userDao.findById(1);
        System.out.println(user.toString());

        // 根据 Name 模糊查询
        List<User> users = userDao.findUsersByLikeName("1");
        for(User userTemp : users){
            System.out.println(userTemp.toString());
        }
    }

}

11.数据库建表语句

create database if not exists lanyue character set utf8;

use lanyue;

create table baseinfo (
        officeid int unsigned not null primary key,
        username       char(10) not null ,
        password    char(10)   not null,
		UNIQUE KEY username(username)
);

 

posted @ 2020-07-31 23:00  IT蓝月  阅读(130)  评论(0编辑  收藏  举报
Live2D