2、第一个Mybatis程序

思路:搭建环境–>导入Mybatis–>编写代码–>测试

2.1、搭建环境

搭建数据库

CREATE TABLE user(
	id int not NULL PRIMARY KEY,
	name VARCHAR(30) DEFAULT null,
	password VARCHAR(30)
) ENGINE = INNODB DEFAULT CHARSET=utf8;

INSERT INTO user(`id`,`name`,`PASSWORD`) VALUES(1,'zhangsan','123'),
(2,'johngea','123'),
(3,'lisi','123')

新建项目

  • 1.新建一个普通的maven项目
  • 2.导入maven依赖
<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>

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

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

3.数据库相关配置文件(db.properties)
注意,Mysql8版本一定要带时区,建议按以下环境配置,防止乱码问题

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=GMT&characterEncoding=UTF-8&useUnicode=true
username=root
password=000214

4.编写Mybatis的核心配置文件(mybatis-config.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="net.johngea.dao.UserMapper">
<configuration>
    <!--引入外部配置文件-->
    <properties resource="db.properties"></properties>
    <!--为JavaBean取别名,避免使用全类名导致类名复杂-->
    <typeAliases>
        <!--方式一,包中类较少可以使用,且别名可以自行DIY-->
        <typeAlias type="net.johngea.domain.User" alias="User"/>
        <!--方式二,包中类较多时可以使用,但别名不允许DIY-->
        <!--<package name="net.johngea.domain"/>-->
        <!--方式三,在类上加注解 @Alias("别名") -->
    </typeAliases>
	<!--配置环境集,默认选择哪套环境,就与该环境的id相对应(初学只需一套环境即可)-->
    <environments default="development">
        <!--环境1-->
        <environment id="development">
            <!--事务管理-->
            <transactionManager type="JDBC"/>
            <!--配置数据源-->
            <dataSource type="POOLED">
                <!--以下数据源对应了db.properties配置中的数据-->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册-->
    <mappers>
        <mapper resource="net/johngea/dao/UserMapper.xml"/>
    </mappers>
</configuration>

5.编写Mybatis工具类

package net.johngea.utils;

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;

/**
 * @Author: JohnGea
 * @Date: 2021/1/14 23:20
 */
public class MybatisUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSqlSession(){
       return sqlSessionFactory.openSession();
    }
}
2.2、编写代码

Domain实体类(注意字段需与数据库字段对应

package net.johngea.domain;

/**
 * @Author: JohnGea
 * @Date: 2021/1/14 22:53
 */
public class User {
    private Integer id;
    private String name;
    private String password;

    public User() {
    }

    public User(Integer id, String name, String password) {
        this.id = id;
        this.name = name;
        this.password = password;
    }

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

    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 getPassword() {
        return password;
    }

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

Mapper接口

package net.johngea.dao;

import net.johngea.domain.User;

import java.util.List;

/**
 * @Author: JohnGea
 * @Date: 2021/1/14 22:53
 */
public interface UserMapper {

    /**
     * 查询所有用户
     * @return
     */
    List<User> getAll();

    /**
     * 通过id查询用户
     * @param id
     * @return
     */
    User getOneById(int id);

    /**
     * 添加用户
     * @param user
     * @return
     */
    int addUser(User user);

    /**
     * 修改用户
     * @param user
     * @return
     */
    int updateUser(User user);

    /**
     * 删除用户
     * @param id
     * @return
     */
    int delUser(int id);
}

Mapper.xml(由原来的UserMapperImpl转换为Mapper.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">
<!--namespace:绑定一个对应的Mapper接口-->
<mapper namespace="net.johngea.dao.UserMapper">
    <!--查询所有-->
    <select id="getAll" resultType="User">
        select * from user
    </select>

    <!--查询一个-->
    <select id="getOneById" resultType="User" parameterType="int">
        select * from user where id = #{id}
    </select>

    <!--添加用户-->
    <insert id="addUser" parameterType="User">
        insert into user(id,name,password) values(#{id},#{name},#{password})
    </insert>

    <!--修改用户-->
    <update id="updateUser" parameterType="User">
        update user set name = #{name},password = #{password} where id = #{id}
    </update>

    <!--删除用户-->
    <delete id="delUser" parameterType="int">
        delete from user where id = #{id}
    </delete>
</mapper>
2.3、测试

测试代码

package net.johngea.dao;

import net.johngea.domain.User;
import net.johngea.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

/**
 * @Author: JohnGea
 * @Date: 2021/1/14 23:07
 */
public class UserMapperTest {

    /**
     * 查询所有
     */
    @Test
    public void getAll(){

        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.getAll();
        for (User user : users) {
            System.out.println(user);
        }
        //一定要关闭
        sqlSession.close();

    }

    /**
     * 通过Id查询一个用户
     */
    @Test
    public void getUserById(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getOneById(3);
        System.out.println(user);
        sqlSession.close();
    }

    //注意!!!所有增删改操作都需要提交事务!!!
    /**
     * 添加用户
     */
    @Test
    public void addUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = new User(4, "haha", "123123");
        int count = mapper.addUser(user);
        if (count>0){
            System.out.println("添加成功");
        }
        sqlSession.commit();	//提交事务
        sqlSession.close();
    }

    /**
     * 修改用户
     */
    @Test
    public void updateUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = new User(4, "hhhh", "123456");
        int count = mapper.updateUser(user);
        if (count>0){
            System.out.println("修改成功");
        }
        sqlSession.commit();	//提交事务
        sqlSession.close();
    }

    /**
     * 删除用户
     */
    @Test
    public void delUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int count = mapper.delUser(4);
        if (count>0){
            System.out.println("删除成功");
        }
        sqlSession.commit();	//提交事务
        sqlSession.close();
    }
}

注意!

Maven由于他的约定大于配置,在之后的学习过程中可能遇到配置文件无法被导出或者生效的问题,解决方案:

<!--在build中配置resources,来防止我们资源导出失败的问题-->
<build>
    <resources>
        <resource>
            <directory>src/main/resources。 directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>
2.4、使用Map进行参数传递

对比传递对象和传递map的区别
UserMapper层

/**
* 添加用户,使用map传递参数
* @param map
* @return
*/
int addUser_useMap(Map<String,Object> map);

/**
* 添加用户,传递User对象
* @param user
* @return
*/
int addUser(User user);

UserMapper.xml

<!--添加用户,传递User对象,且接收对象的参数名需对应-->
<insert id="addUser" parameterType="User">
insert into user(id,name,password) values(#{id},#{name},#{password})
</insert>

<!--添加用户,使用map传递,传递map对应的key即可-->
<insert id="addUser_useMap" parameterType="map">
insert into user(id,name,password) values (#{userid},#{username},#{psw})
</insert>

Test测试

/**
* 添加用户,使用User对象传递
*/
@Test
public void addUser(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = new User(4, "haha", "123123");
    int count = mapper.addUser(user);
    if (count>0){
        System.out.println("添加成功");
    }
    sqlSession.commit();
    sqlSession.close();
}

/**
* 添加用户,使用map传递
*/
@Test
public void addUser_useMap(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    Map<String,Object> map = new HashMap<>();
    map.put("userid",5);
    map.put("username","admin");
    map.put("psw","123123");
    mapper.addUser_useMap(map);
    sqlSession.commit();
    sqlSession.close();
}

对于字段过多时,我们应该更考虑使用Map,或者注解,Map传递参数直接在Sql中取出key即可,但使用对象传递参数时,需要在sql中取出对象的属性。

2.5、模糊查询

UserMapper层

/**
* 模糊查询
* @return
*/
List<User> getUserLike(String name);

UserMapper.xml

<!--模糊查询-->
<select id="getUserLike" resultType="User">
    select * from user where name like #{name}
</select>

Test测试

/**
 * 模糊查询
 */
@Test
public void getUserLike(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List<User> users = mapper.getUserLike("%g%");
    for (User user : users) {
        System.out.println(user);
    }
    sqlSession.close();
}

在Java代码执行的时候,就需要传递通配符 % %,也可以在sql拼接中使用通配符,例如下代码:

<!--模糊查询-->
<select id="getUserLike" resultType="User">
    select * from user where name like "%"#{name}"%"
</select>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值