手把手教你搭建Mybatis环境------实现单表(增删改查)操做

MyBatis环境搭建详细及执行增删改查操做

一、第一步

新建的maven项目中pom.xml文件中配置所须要jar包的以来坐标java

  • mybatis 包
  • mysql-connector-java 包
  • junit 测试包
  • log4j 日志包
具体代码以下:
复制代码
<?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">
    <parent>
        <artifactId>mybatis_01</artifactId>
        <groupId>com.baoji.mybatis</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>

    <artifactId>mybatis_04_CRUD_insert</artifactId>
    <!-- 导入mybatis相关jar包-->
    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.44</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
    </dependencies>

</project>
复制代码

二、第二步

按具体需求建目录结构mysql

编写实体类和接口并建立对应数据库的表git

一、编写实体类:User.java
复制代码
package com.baoji.mybatis.entity;

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

public class User implements Serializable {
    private Integer userId;
    private String userName;
    private Date userBirthday;
    private String userSex;
    private String userAddress;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Date getUserBirthday() {
        return userBirthday;
    }

    public void setUserBirthday(Date userBirthday) {
        this.userBirthday = userBirthday;
    }

    public String getUserSex() {
        return userSex;
    }

    public void setUserSex(String userSex) {
        this.userSex = userSex;
    }

    public String getUserAddress() {
        return userAddress;
    }

    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' + ", userBirthday=" + userBirthday + ", userSex='" + userSex + '\'' + ", userAddress='" + userAddress + '\'' +
                '}';
    }
}
复制代码
二、编写封装将实体类做为查询条件的类  QueryVo.java 
复制代码
package com.baoji.mybatis.entity;

/**
 *   QueryVo  做为参数查询,其实是将对象做为属性。将对象包装起来做为查询条件
 */
public class QueryVo {
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

复制代码
编写接口类
复制代码
package com.baoji.mybatis.dao;

import com.baoji.mybatis.entity.QueryVo;
import com.baoji.mybatis.entity.User;

import java.util.List;

public interface IUserDao {
    //保存方法
    public void saveUser(User user);
    //修改方法
    public void updateUser(User user);
    //删除方法
    public void deleteUser(Integer userId);
    //根据id查询一个user对象
    public User selectOne(Integer id);
    //根据姓名模糊查询
    public List<User> selectByName(String name);
    //根据query evo条件查询
    public List<User> findUserByVo(QueryVo vo);
    //查询全部信息
    public List<User> findAll();
}
复制代码

三、第三步

在resources资源文件中配置mybatis主配置文件并导入log4j的配置文件github

具体代码以下:config.xml
复制代码
<!-- mybatis 主配置文件 -->
<?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 属性: 经常使用的  (resource="jdbcConfig.properties")
            用于指定配置文件的位置,是按照类路径的写法来写,而且必须存在于类路径下。
            url属性:
                是要求按照url的属性来写地址
                URL:  统一资源定位符,能够惟一标识一个资源的位置
                    例如 http://localhost:8080/mybatis/servlet
                         协议    主机    端口号   uri
                uri:  统一资源标识符 ,在应用中能够惟必定位一个资源的
            -->
    <properties url="file:///H:/JDBC_config/">
        <!--配置链接数据库的四个基本信息-->
        <!--
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis_user?characterEncoding=gbk"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
        -->
    </properties>
    <!-- 使用typeAliases起别名,它只能配置entity中类的别名-->
        <typeAliases>
        <!-- typeAlias用于配置别名,type属性指的是实体类全限定类名,alias属性指定别名,当指定了别名就再也不区分大小写-->
       <!-- <typeAlias type="com.baoji.mybatis.entity.User" alias="user"></typeAlias> -->
            <!-- 用于要配置起别名的包,当指定以后,该包下的实体类都会注册别名,而且类名就是别名,不区分大小写-->
        <package name="com.baoji.mybatis.entity"/>
    </typeAliases>
    <!-- 配置环境 -->
    <environments default="mysql">
        <!-- 配置mysql的配置环境 -->
        <environment id="mysql">
            <!--配置事务的类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源(链接池)-->
            <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>
复制代码
<!-- 指定映射配置文件的位置,映射配置文件指的是每一个dao独立的配置文件 -->
<!-- mybatis的映射配置文件位置必须和dao接口的文件位置相同,包名相同时,不须要实现dao接口 -->
复制代码
<mappers>
        <!-- <mapper resource="com/baoji/mybatis/dao/IUserDao.xml"></mapper> -->
        <!-- package用于指定dao接口所在的包,当指定了以后就不须要再写mapper和resource以及class了-->
        <package name="com/baoji/mybatis/dao"/>
    </mappers>
</configuration>
复制代码

JDBCconfig.properties jdbc配置文件sql

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/eesy_mybatis
username=root
password=root
复制代码

log4j.properties 配置文件(了解便可)数据库

# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
复制代码

四、第四步(使用xml方式配置映射文件)

配置位于resources资源文件下的映射文件mapper.xml(映射文件所放的目录位置要与接口所在位置一致,放在同一种包名下,能够不用写接口的实现类,使用代理对象自动实现代理类)apache


此处应注意:安全

当数据库中字段名与实体类中属性名一致时: 不须要配置resultMap,在resultType属性中填写须要返回类型所在的全路径名便可bash

当数据库中字段名与实体类中属性名一致时: 两种解决办法session

第一种:在sql语句中起别名,将数据库的别名和实体类的属性名一致便可,执行效率高,很是推荐,可是太麻烦,开发效率低。

select id as userId,username as userName,address as userAddress,sex as userSex,birthday as userBirthday from user;
复制代码

第二种:在配置中添加以下代码便可(最后将之前的resultType改成resultMap,值为上面定义的id值)

<!-- 配置查询结果的列名和实体类的属性名的对应关系 -->
    <resultMap id="userMap" type="com.baoji.mybatis.entity.User">
        <!-- 主键字段的对应 -->
        <id property="userId" column="id"></id>
        <!-- 非主键字段的对应 -->
        <result property="userName" column="username"></result>
        <result property="userAddress" column="address"></result>
        <result property="userSex" column="sex"></result>
        <result property="userBirthday" column="birthday"></result>
    </resultMap>
复制代码

编写映射配置文件 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.baoji.mybatis.dao.IUserDao">
    <!-- 配置查询结果的列名和实体类的属性名的对应关系 -->
    <resultMap id="userMap" type="com.baoji.mybatis.entity.User">
        <!-- 主键字段的对应 -->
        <id property="userId" column="id"></id>
        <!-- 非主键字段的对应 -->
        <result property="userName" column="username"></result>
        <result property="userAddress" column="address"></result>
        <result property="userSex" column="sex"></result>
        <result property="userBirthday" column="birthday"></result>
    </resultMap>
    <!-- parameterType为实体类的全路径 -->
    <!-- 查询全部 -->
    <insert id="saveUser" parameterType="com.baoji.mybatis.entity.User">
        <!-- 配置插入操做后,获取插入操做的id-->
        <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
            select last_insert_id();
        </selectKey>
        insert into user(username,address,sex,birthday) values (#{username},#{address},#{sex},#{birthday});
    </insert>
    <!-- 修改操做 -->
    <update id="updateUser" parameterType="com.baoji.mybatis.entity.User">
        update user set username = #{username}, address=#{address},sex = #{sex},birthday = #{birthday} where id = #{id};
    </update>
    <!-- 删除操做 -->
    <delete id="deleteUser" parameterType="int">
        delete  from user where id = #{id};
    </delete>
    <!-- 根据id查询一个对象信息 -->
    <select id="selectOne" parameterType="int" resultMap="userMap">
        select * from user where id = #{id};
    </select>
    <!-- 根据姓名模糊查询 -->
    <select id="selectByName" parameterType="String" resultMap="userMap">
        <!-- 方式一:底层经过占位符来赋值,使用preparestatement对象,更安全。推荐使用-->
        <!-- select * from user where username like #{name}; -->
        <!-- 方式二:底层经过字符串拼接来赋值,使用statement对象,了解便可-->
        select * from user where username like '%${value}%';
    </select>
    <!-- 根据query vo条件模糊查询 -->
    <select id="findUserByVo" parameterType="com.baoji.mybatis.entity.QueryVo" resultType="com.baoji.mybatis.entity.User">
         select * from user where username like #{user.username};
    </select>
    <!-- 查询全部信息-->
    <select id="findAll" resultType="com.baoji.mybatis.entity.User">
        select * from user;
    </select>
</mapper>
复制代码

(使用注解的方式配置映射文件)

在dao接口方法前加@servlet(sql语句)便可实现和xml一样的效果(简单开发效率高)

public interface IUserDao {

    /**
     * 查询全部操做
     * @return
     */
    @Select("select * from user")
    List<User> findAll();
}

复制代码

五、第五步

编写测试类

测试类: IUserDaoTest.java
复制代码
package com.baoji.mybatis.test;

import com.baoji.mybatis.dao.IUserDao;
import com.baoji.mybatis.entity.QueryVo;
import com.baoji.mybatis.entity.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 org.junit.After;
import org.junit.Before;
import org.junit.Test;

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

public class IUserDaoTest {
    private InputStream in;
    private SqlSessionFactory factory;
    private SqlSession sqlSession;
    private IUserDao dao;
    //编写初始化方法(将重复代码封装至此)

    @Before  //此注解是在测试方法以前执行
    public void init() throws IOException {
        //一、读取配置文件
        in = Resources.getResourceAsStream("Config.xml");
        //二、建立sqlSessionFactory工厂
        factory = new SqlSessionFactoryBuilder().build(in);
        //三、使用工厂建立sqlSession对象
        sqlSession = factory.openSession();
        //四、使用sqlSession获取dao的代理对象
        dao = sqlSession.getMapper(IUserDao.class);
    }
    @After  //此注解实在测试方法以后执行
    //建立关闭资源方法
    public void destory() throws IOException {
        //提交事务两种方式(只有提交事务,数据库才能插入成功)
            //方式一:关闭资源前添加提交事务(sqlSession.commit();)
            //方式二:在建立sqlSession时事务参数设置为true
        sqlSession.commit();
        sqlSession.close();
        in.close();
    }
    //添加操做
    @Test
    public void saveTest(){
        //建立user对象
        User user = new User();
        user.setUserName("张三");
        user.setUserAddress("北京海淀区");
        user.setUserSex("男");
        user.setUserBirthday(new Date());
        //执行添加操做
        dao.saveUser(user);
    }
    //修改操做
    @Test
    public void updateTest(){
        //建立user对象
        User user = new User();
        user.setUserId(50);
        user.setUserName("李四");
        user.setUserAddress("上海长虹区");
        user.setUserSex("女");
        user.setUserBirthday(new Date());
        //执行添加操做
        dao.updateUser(user);
    }
    //删除操做
    @Test
    public void deleteTest(){
        //执行删除操做
        dao.deleteUser(50);
    }
    //根据id查询一个对象信息
    @Test
    public void selectOneTest(){
        //执行根据id查询操做
        User user = dao.selectOne(51);
        System.out.println(user);
    }
    //根据姓名模糊查询对象信息
    @Test
    public void selectByNameTest(){
        //执行模糊查询操做
          List<User> list = dao.selectByName("%王%");  //方式一
        //List<User> list = dao.selectByName("王");
        for(User users:list){
            System.out.println(users);
        }
    }
    //QueryVo  做为参数查询,其实是将对象做为属性。将对象包装起来做为查询条件
    @Test
    public void findUserByVoTest(){
        User user = new User();
        user.setUserName("王五");
        QueryVo vo = new QueryVo();
        vo.setUser(user);
        //执行按照query条件查询操做
         List<User> list = dao.selectByName("%王%");
        for(User users:list){
            System.out.println(users);
        }
    }
    //查询全部信息
    public void findAllTest(){
        List<User> list = dao.findAll();
        for (User users : list) {
            System.out.println(users);
        }
    }
}
复制代码

到此就介绍完如何使用经过搭建mybatis环境完成CRUD操做了,惊不惊喜,意不意外,就是这么简单,用起来真的很爽!!!


写在最后

推荐做者的Github地址:github.com/Lmobject

感谢您的支持与鼓励,望能获得您的关注与点赞,写博客容易,坚持不易!!!加油。。。
复制代码
相关文章
相关标签/搜索