Java第三十七天,Mybatis框架系列,mybatis 完成传统的 Dao 层的开发

一、项目架构

二、代码

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

2.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 update(User user);
    public abstract void deleteById(Integer officeid);
}

3.UserDaoImpl.java

package dao.impl;

import dao.IUserDao;
import entil.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;

public class UserDaoImpl implements IUserDao {

    private SqlSessionFactory factory;
    private SqlSession sqlSession;

    public UserDaoImpl(SqlSessionFactory factory){
        this.factory = factory;
        sqlSession = factory.openSession();
    }

    // java中的析构函数
    @Override
    public void finalize(){
        sqlSession.close();
    }

    public User findById(Integer officeid) {
        return sqlSession.selectOne("dao.IUserDao.findById", officeid);
    }

    public List<User> findUsersByLikeName(String username){
        return sqlSession.selectList("dao.IUserDao.findUsersByLikeName", username);
    }

    public Integer getUserNums(){
        return sqlSession.selectOne("dao.IUserDao.getUserNums");
    }

    public List<User> findAll() {
        // 参数就是Dao中配置信息的key 即 Mapper(Dao)文件中的 类名.方法名
        return sqlSession.selectList("dao.IUserDao.findAll");
    }

    public void save(User user) {
        sqlSession.insert("dao.IUserDao.save", user);
        sqlSession.commit();
    }

    public void update(User user){
        sqlSession.update("dao.IUserDao.update", user);
    }

    public void deleteById(Integer officeid) {
        sqlSession.delete("dao.IUserDao.deleteById", officeid);
    }
}

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

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

6.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>
    <!--主配置文件-->
    <!--配置环境-->
    <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>

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

8.Test.java

import dao.IUserDao;
import dao.impl.UserDaoImpl;
import entil.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;

public class Test {

    private static InputStream in;
    private static IUserDao dao;

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

        in = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);

        // 使用工厂对象创建 Dao 对象
        dao = new UserDaoImpl(factory);

        List<User> all = dao.findAll();
        for(User user : all){
            System.out.println(user.toString());
        }
    }

}

9.数据库建表语句

create database if not exists lanyue character set utf8;

use lanyue;

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

 

posted @ 2020-08-01 16:00  IT蓝月  阅读(126)  评论(0编辑  收藏  举报
Live2D