您的位置:首页 > 其它

Mybatis详解(一)实现增删改查

2018-07-10 12:53 204 查看

mybatis介绍


mybatis是一个应用于dao层框架(持久层框架)

也是一个ORM(object relational mapping)框架(对象关系映射),相比于hibernate,他是一个半自动的。

优点:

Mybatis优点

让程序员只关注sql语句

参数的设置,结果集的处理,框架自动生成

简单易学,灵活,解除sql与程序代码的耦合,提供对象关系映射标签,提供xml标签

jdbc的缺点

代码重复(每次创建连接,获取执行sql语句的对象,执行sql语句,然后处理结果集,最后释放资源)

处理结果集,工作比较复杂

参数处理比较麻烦

实现增删改查

首先准备数据库

数据库名字为mybatis

数据表名为mbs


id设置为自增

创建项目

创建一个实体类,实现get和set方法,以及toString方法


public class User {
    private Integer id;
    private String name;
    private String sex;
    private String address;
    private Integer balance;

    public User() {
    }

    public User(Integer id, String name, String sex, String address, Integer balance) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.address = address;
        this.balance = balance;
    }

    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 getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Integer getBalance() {
        return balance;
    }

    public void setBalance(Integer balance) {
        this.balance = balance;
    }

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

导入mybatis所需要的jar包


书写配置文件

目录src下的根目录创建sqlMapConfig.xml文件和log4j.properties

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="development">
        <environment id="development">
            <!--事务管理-->
            <transactionManager type="JDBC"></transactionManager>
            <!--连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"></property>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"></property>
                <property name="username" value="root"></property>
                <property name="password" value="1234"></property>
            </dataSource>
        </environment>
    </environments>
   <mappers>
       <mapper resource="cn/hd/pojo/UserMapper.xml"></mapper>
   </mappers>

</configuration>

sqlMapConfig:命名可以更改,位置任意,名字建议用sqlMapConfig位置放在src下

Environments:表示sqlMapConfig的运行环境

运行环境“数据库的基本信息,事务

Mappers:表示数据源

上面的黑体字是解释语言


log4j.properties文件配置

# Global logging configuration
#在开发环境下日志级别设置为debug,生产环境下设置成info或error
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout
=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern
=%5p [%t] - %m%n

实体类同级目录的映射文件UserMapper.xml文件

<mapper namespace="test">
 
   <select id="findUserById" parameterType="int" resultType="cn.hd.pojo.User" >
   SELECT * FROM mbs WHERE id =  #{id}
   </select>

</mapper>

UserMapper.xml名字可以更改,位置任意

命名建议User.xml(ibatis) UserMapper.xml(mybatis)

建议命名为:类名+Mapper.xml

书写sql语句

Mapper namespace属性 区分不同表中查询的sql语句的名字冲突

比如user表 findById   order表  findById名字冲突不识别,所以给不同的表的数据源添加一个前缀,对应的是namespace属性

 <select id="findUserById" parameterType="int" resultType="cn.hd.pojo.User" >
   SELECT * FROM mbs WHERE id =  #{id}
   </select>
id给当前的sql语句起一个识别id,parameterType参数类型

resultType结果集封装的类型,#{id}占位符里面的名字任意

蓝色部分为解释语言

上面的配置完成后就是正式开始增删改查了

通过id查找用户

在UserMapper.xml书写sql语句

在测试类中书写测试代码

<select id="findUserById" parameterType="int" resultType="cn.hd.pojo.User" >
SELECT * FROM mbs WHERE id =  #{id}
</select>

 


public class Demo {
    @Test
    public void fun() throws IOException {
        //获取sqlMapConfig.xml文件流
        InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
        //创建工厂添加sqlMapConfig.xml
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(in);
        //获得session
        SqlSession sqlSession = build.openSession();
        //执行语句
        //selectOne("test.findUserById", 1)是usermap中的namespace的值和id名
        User user = sqlSession.selectOne("test.findUserById", 1);
           
        System.out.println(user);
        //释放资源
        sqlSession.close();

    }
}

结果为:


ok没问题的

通过名字name模糊查找用户

跟上面的一样在UserMapper.xml文件中书写sql语句,测试类中书写测试代码

<!--模糊查询-->
<select id="findByName" parameterType="String" resultType="cn.hd.pojo.User">
   SELECT * FROM  mbs WHERE name LIKE '%${value}%'
</select>

 

@Test
public void fun1() throws IOException {

    InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");

    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(in);

    SqlSession sqlSession = build.openSession();

    List<User>user  = sqlSession.selectList("test.findByName", "莫");
    System.out.println(user);

    sqlSession.close();

}


我查询的是带有name带有莫得数据,也是没问题的

添加数据

书写sql语句和测试代码的位置不多说直接看上面的,直接上代码


<!--添加用户  如果参数是引用类型  占位符的赋值方式为ognl表达式的方式{属性名}-->
<insert id="UserAdd" parameterType="cn.hd.pojo.User">
   INSERT INTO mbs (id,name,sex,address,balance)VALUES(#{id},#{name},#{sex},#{address},#{balance})
</insert>

 

@Test
public void fun2() throws IOException {
    InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(in);
    SqlSession sqlSession = build.openSession();
    User user = new User();
    user.setName("马云");
    user.setSex("男");
    user.setAddress("嘉兴");
    user.setBalance(2000);
    int insert = sqlSession.insert("test.UserAdd", user);
    System.out.println(insert);
    sqlSession.commit();
    sqlSession.close();
}

 

是如果是增删改,必须提交事务,持久化到数据库


返回的是受影响的行数,看下数据库


数据库也添加上了,说明添加也是没问题的

删除用户

<!--删除用户-->
<delete id="UserDelete" parameterType="cn.hd.pojo.User">
   DELETE FROM mbs WHERE id=#{id}
</delete>

 

@Test
public void fun3() throws IOException {
    InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(in);
    SqlSession sqlSession = build.openSession();
    int delete = sqlSession.delete("test.UserDelete", 5);
    sqlSession.commit();
    System.out.println(delete);
    sqlSession.close();
}

刚才添加的是马云,id为5,这次删除id为5的数据


控制台没问题,看下数据库


数据库也没有了,删除也成功了

修改用户

<!--修改用户-->
<update id="UserUpdate" parameterType="cn.hd.pojo.User">
   UPDATE mbs set name=#{name},sex=#{sex},address=#{address},balance=#{balance} WHERE id=#{id}
</update>

 

@Test
public void fun4() throws IOException {
    InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(in);
    SqlSession sqlSession = build.openSession();
    User user = new User();
    user.setId(4);
    user.setName("小欣");
    user.setSex("女");
    user.setAddress("鹤壁");
    user.setBalance(5000);
    int update = sqlSession.insert("test.UserUpdate", user);
    sqlSession.commit();
    System.out.println(update);
    sqlSession.close();
}


控制台是成功的,看下数据库吧,数据库中id为4的名字肯定被修改了


修改也是成功的,到此mybatis的增删改查就完成了

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐