Mybatis-各标签解读以及增删改查

189 阅读4分钟

文章目录

1.配置文件标签解读

<?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>
</configuration>

1.属性翻译

configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)

2.dataSource

  配置连接池-->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"></property>
                    <property name="url" value="jdbc:mysql://localhost:3306/bobo?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf8"></property>
                    <property name="username" value="root"></property>
                    <property name="password" value="123456"></property>
                </dataSource>

dataSource使用标准的JDBC数据源接口来配置JDBC,有三种数据源

POOLED(常用) |UNPOOLED | JNDI(不推荐)
POOLED:利用池的原理,使用完毕后会将数据返回池中
UNPOOLED:没有利用池,每一个数据库操作都会创建一个新的连接,用完就会关闭
JNDI:在服务器,spring容器中使用,容器集中或在外部配置数据源,然后放置一个JNDI上下文的引用

3.transactionManager

JDBC中通过Connection对象进行事务管理,不提交,数据不会真正的插入到数据库中
通过commit方法进行提交,rollback方法进行回滚

         <transactionManager type="JDBC"></transactionManager>

4.environment

配置mybatis的多套运行环境,将sql映射到多个不同的数据库上,必须指定其中一个为默认运行环境(通过default来指定)

<!--    配置环境-->
    <environments default="mysql">
<!--        配置mysql的和环境-->
        <environment id="mysql">
        </environment>
    </environments>

5.mappers

映射器:定义映射sql语句文件
通过映射器告诉mybatis到哪里找到映射文件

<!--    配置映射文件的位置-->
    <mappers>
    //使用xml配置 用resource
        <mapper resource="cn/bobo/IUserDao/IUserDao.xml"></mapper>
	//使用注释设置 用class来设置
<!--        <mapper class="cn.bobo.IUserDao.IUserDao"></mapper>-->
    </mappers>

6.namespace

namespace 的命名必须跟某个接口同名,接口中的方法与映射文件中的sql语句id应该一一对应,用来区别不同的mapper
命名规则: 包名+类名

<mapper namespace="cn.bobo.IUserDao.IUserDao"></mapper>

7.生命周期和作用域

流程图
加粗样式**
SqlSessionFactoryBulider 的作用在于创建SqlSessionFactory,创建成功后,其就失去了作用
SQLSessionFactory作用是创建SqlSession接口对象,其生命周期等同于Mybatis的应用周期,
由于SqlSessopmFactory是一个对数据库的链接池。创建几个就会出现几个数据池,所以要避免这种情况的产生。
而此时,Sqlsession就相当于一个数据库连接,可以在一个书屋李执行多条sql,然后通过他的commit,rollback等方法,提价或者回滚事务,所以它应该存活于一个业务请求中,处理完毕整个请求后,应该关闭这条连接,让它归还给SqlSessionFactory中,否则数据库资源就很快被耗费精光了。所以要使用try…catch finally 语句来保证其是否正确关闭。

2.CRUD增删改查实现

注意:其中增删改操作需要提交事务

1.创立实体类:

package cn.bobo.UserDao;
import java.io.Serializable;
public class user implements Serializable {
    private Integer id;
    private String name;
    private String pw;
    @Override
    public String toString() {
        return "user{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pw='" + pw + '\'' +
                '}';
    }
    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 getPw() {
        return pw;
    }
    public void setPw(String pw) {
        this.pw = pw;
    }
}

2.实现接口:

package cn.bobo.IUserDao;
import cn.bobo.UserDao.user;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface IUserDao {
//查询所有
    List<user> findall();
//保存用户
    void saveUser(user user);
//更新用户
    void updateUser(user user);
//删除用户
    void deleteUser(Integer userid);
//查询id
    user findidUser(Integer id);
//模糊查询
    List<user> findbyName(String username);
//查询总用户数
    int countUser();
}

3.sql中配置

<?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="cn.bobo.IUserDao.IUserDao">
    <select id="findall" resultType="cn.bobo.UserDao.user">
        select * from user;
    </select>

<!--    保存用户-->
    <insert id="saveUser" parameterType="cn.bobo.UserDao.user">
        insert into user(id, name, pwd)values(#{id},#{name},#{pw});
    </insert>
<!--    更新用户-->
    <update id="updateUser" parameterType="cn.bobo.UserDao.user">
        update user set id=#{id},name=#{name},pwd=#{pw} where id=#{id}
    </update>
<!--    删除用户-->
    <delete id="deleteUser" parameterType="int">
        delete from user where id = #{uid}
    </delete>
<!--    查询id-->
    <select id="findidUser" parameterType="int" resultType="cn.bobo.UserDao.user">
        select * from user where id =#{uid}
    </select>
<!--    模糊查询-->
    <select id="findbyName" parameterType="String" resultType="cn.bobo.UserDao.user">
        select * from user where user.name like  #{name}
    </select>
<!--    获取用户记录总条数-->
    <select id="countUser" resultType="int">
        select count(id) from user;
    </select>
</mapper>

4.测试类中实现:

package cn.bobo;
import cn.bobo.IUserDao.IUserDao;
import cn.bobo.UserDao.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.List;

public class test1 {
    public InputStream in;
    public SqlSession sqlSession;
    public IUserDao userDao;
    public SqlSessionFactory factory;

    @Before
    public void init() throws IOException {
//        1.读取配置文件,生成字节输入流
        in = Resources.getResourceAsStream("mybatis.xml");
//        2. 获取SqlSwssionFactory
        factory = new SqlSessionFactoryBuilder().build(in);
//        3.获取SqlSession对象
        sqlSession = factory.openSession();
//        4. 获取dao的代理对象
        userDao = sqlSession.getMapper(IUserDao.class);
//        5.查询执行所有方法

    }

    @After
//        6. 释放资源
    public void destroy() throws IOException {
        //    提交事务
        sqlSession.commit();
        sqlSession.close();
        in.close();
    }

    @Test
    public void testfindall() throws IOException {
        List<user> users = userDao.findall();
        for (user user1 : users) {
            System.out.println(user1);
        }
    }

    @Test
    public void testSave() {
        user user1 = new user();
        user1.setId(2);
        user1.setName("luhua");
        user1.setPw("asd");
//    保存方法
        userDao.saveUser(user1);
    }

    @Test
    public void testUpdate() {
        user user1 = new user();
        user1.setId(9);
        user1.setName("wuhu");
        user1.setPw("6513312");

//    执行更新方法
        userDao.updateUser(user1);
    }

    @Test
    public void testdelete() {
        userDao.deleteUser(1);
    }

    @Test
    public void testfindid(){
        user user = userDao.findidUser(2);
        System.out.println(user);
    }
    @Test
    public void testfindname(){
        List<user> users = userDao.findbyName("%小%");
        for (user user : users){
            System.out.println(user);
        }
    }
    @Test
    public void testfindCount(){
        int count = userDao.countUser();
        System.out.println(count);
    }
}

请添加图片描述