MyBatis学习总结(二)

使用MyBatis对数据库进行增删改查

1.模糊查询

在userMapper.xml中加入select进行模糊查询

代码如下:

<?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:命名空间 随便写,随便起名,保证命名空间唯一,建议写地址,包+文件名   -->
<!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
       注意:使用mapper代理方法开发,namespace有特殊重要的作用
       -->
<mapper namespace="com.mb.mapping.userMapper">
    <!-- 在映射文件中配置很多sql语句-->
    <!--  需求:通过id查询用户表的记录 -->
    <!--通过select执行数据库查询
    id:标识映射文件中的sql,
    将sql语句封装到mappedStatement对象中,所以将id称为statement的id
    parameterType:制定输入参数的类型,这里制定ing型
    #{}表示一个占位符号
    #{id}:其中的id表示接受输入的参数,参数名称就是id,如果输入参数就是简单类型,#{}中的参数名可以任意,可以value或其他名称
    resultType:指定sql输入结果的所映射的Java对象,select指定resultType表示将单条记录映射成Java对象。
    -->
    <select id="getUser" parameterType="int" resultType="com.mb.domain.User">
        select * from s_user where id=#{id}
    </select>
    <!-- 根据用户名称模糊查询用户信息,可能返回多条  -->
    <!--  resultType:指定就是单条记录所映射的java对象类型  -->
    <select id="findUserName" parameterType="String" resultType="com.mb.domain.User">
        select * from s_user where name  like '%${value}%'
    </select>
</mapper>

在MyBatisFirst.java进行测试
使用findUserByNameTest()方法模糊查询用户信息测试
代码如下:

//根据用户名称模糊查询数据
    public void findUserByNameTest() throws IOException{
        //mybatis配置文件
        String resource ="sqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
        //创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        String statement="com.mb.mapping.userMapper.findUserName";
        List<User> list=sqlSession.selectList(statement,"三");
        System.out.println(list);
        sqlSession.close();
    }

因为查询id的方法我之前写到了主函数里面,后来我放到了一个方法里面,方便测试,后面还要测试更新删除等方法,使用方法更简洁方便。调用我写到了主函数里面。
我直接放出来MyBatisFirst.java文件的所有代码
代码如下:

package com.mb.domain;

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;
import java.util.List;

public class MybatisFirst {
    //根据id查询用户信息,得到一条记录结果
    public  void findUserByIdTest() throws IOException {
        //mybatis配置文件
        String resource ="sqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
        //创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        String statement="com.mb.mapping.userMapper.getUser";
        //通过SqlSession操作数据库
        //第一个参数:映射文件中statement的id,等于namespace+"."+statement的id
        //第二个参数:指定和映射文件中所匹配的parameterType类型的参数
        User user=sqlSession.selectOne(statement,1);
        System.out.println(user);
        //释放资源
        sqlSession.close();
    }

    //根据用户名称模糊查询数据
    public void findUserByNameTest() throws IOException{
        //mybatis配置文件
        String resource ="sqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
        //创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        String statement="com.mb.mapping.userMapper.findUserName";
        List<User> list=sqlSession.selectList(statement,"三");
        System.out.println(list);
        sqlSession.close();
    }

    public static void main(String[] args) throws IOException {
        MybatisFirst mf=new MybatisFirst();
        mf.findUserByIdTest();
        mf.findUserByNameTest();
    }

}

数据库我也有一些更改,只更改了数据库的值,为了可以看到模糊查询的效果

运行结果:

第一条是查询id的,第二条是模糊查询的结果。

2.增加数据

在userMapper.xml映射文件中配置sql语句,使用insert执行数据库插入。

因为插入,所以不需要resultType返回值,创建数据库时id是自增的,不用手动添加(如果手动添加不存在的id不会报错,但是可能会使id不连续,如果手动添加存在的id,sql插入失败,会提示语句错误)。
代码如下:

<insert id="insertUser"  parameterType="com.mb.domain.User">
        insert into s_user(name,age,sex,birthday) values(#{name},#{age},#{sex},#{birthday})
</insert>

在MyBatisFirst.java写方法进行测试
使用insertUserTest()方法添加用户信息

//添加用户信息
    public void insertUserTest() throws IOException{
        //mybatis配置文件
        String resource ="sqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
        //创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        String statement="com.mb.mapping.userMapper.insertUser";
        User user =new User();
        user.setName("李红");
        user.setAge(41);
        user.setSex("女");
        //在使用当前时间如果用new Date(),应当引用java.util.Date  如果用java.sql.Date会有问题
        user.setBirthday(new Date());
        //没有返回值,不用变量接收
        sqlSession.insert(statement,user);
        //提交事务
        sqlSession.commit();
        //关闭会话
        sqlSession.close();
    }

运行成功去数据库查看,数据库插入即可,这里不再演示结果。

补充:

  • 自增主键返回
  • 非自增主键返回

自增主键返回:
有时候插入数据时,需要新数据id进行其他操作,所以使用方法得到插入新增的id
MybatisFirst.java文件只需要加一行输出即可(放到事务于释放资源之间)

System.out.println(user.getId());

几个项目中的返回属性,可以写int,String或者java.lang.Integer,java.lang.String都可以
userMapper.xml

<insert id="insertUser"  parameterType="com.mb.domain.User">
        <!--
        将插入数据的主键返回,返回到user对象中
        SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用于自增主键
        keyProperty:将查询到主键设置到parameterType指定对象的哪个属性
        order:select LAST_INSERT_ID()执行顺序,相对于insert来说他的执行顺序(之后)
        resultType:指定SELECT LAST_INSERT_ID()的结果类型
        -->
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            SELECT LAST_INSERT_ID()
        </selectKey>
        insert into s_user(name,age,sex,birthday) values(#{name},#{age},#{sex},#{birthday})
    </insert>

非自增主键返回:
只提供思路,因为要新建表,就不演示了,可以查一下,很多大佬写的都很好,我就不献丑了。
使用MySQL的uuid()函数生成主键,需要修改表中id字段类型伟String,长度设置为35位。
执行思路:
先通过uuid()函数查询到主键,将主键输入到sql语句中。
执行uuid()语句顺序相对于insert语句之前执行。
执行过程:
首先通过uuid()得到主键将主键设置到user对象的id属性中,其次在insert执行时,从user对象中取出id属性值。

3.更新数据

大体上更新和删除跟之前的差不多,我就直接附上代码了
userMapper.XML中配置sql语句

	<!-- 更新用户 -->
    <!-- 分析:
        需要传入用户的id
        需要传入用户的更新信息
        parameterType指定user对象,包括id和更新信息,注意:id必须存在
        #{id}:从输入user对象中获取id属性值
      -->
    <update id="updateUser" parameterType="com.mb.domain.User">
        update s_user set name=#{name},age=#{age},sex=#{sex},birthday=#{birthday} where id=#{id}
    </update>

MybatisFirst.java测试方法代码:

 	//更新用户
    public void updateUserTest() throws IOException{
        //mybatis配置文件
        String resource ="sqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
        //创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        String statement="com.mb.mapping.userMapper.updateUser";
        User user =new User();
        user.setId(6);
        user.setName("wangwang");
        user.setAge(14);
        user.setSex("女");
        //在使用当前时间如果用new Date(),应当引用java.util.Date  如果用java.sql.Date会有问题
        user.setBirthday(new Date());
        //没有返回值,不用变量接收
        sqlSession.update(statement,user);
        //提交事务
        sqlSession.commit();
        //关闭会话
        sqlSession.close();
    }

4.删除数据

userMapper.xml
代码:

	<!-- 删除用户 -->
    <!-- 根据id删除用户,需要输入id的值 -->
    <delete id="deleteUser" parameterType="int">
        delete from s_user where id=#{id}
    </delete>

MybatisFirst.java删除数据测试方法
代码:

	//删除用户信息
    public void deleteUserTest() throws IOException{
        //mybatis配置文件
        String resource ="sqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
        //创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        String statement="com.mb.mapping.userMapper.deleteUser";
        //将id传过去,删除用户。
        sqlSession.delete(statement,6);
        //提交事务
        sqlSession.commit();
        //关闭会话
        sqlSession.close();
    }

5.小结

parameterType
在映射文件中通过parameterType指定输入参数的类型

resultType
在映射文件中通过resultType指定输出结果的类型

#{} AND ${}
#{}表示一个占位符,#{}接收输入参数,类型可以是简单类型,pojo,hashmap
如果接收简单类型,#{}中可以写成value或其他名称
#{}接收pojo对象值,通过OGNL读取对象中的属性,通过属性.属性.属性…的方法获取对象属性值

${}${}表示一个拼接符号,会引起sql注入,所以不建议使用${}
${}接收输入参数 ,类型可以是简单类型,pojo,hashmap
如果接收简单类型,${}中只能写成value
${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性…的方式获取对象属性值

selectOne AND selectList
selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。
selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne

下面附上userMapper.xml与MybatisFirst.java两个文件的代码

userMapper.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:命名空间 随便写,随便起名,保证命名空间唯一,建议写地址,包+文件名   -->
<!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
       注意:使用mapper代理方法开发,namespace有特殊重要的作用
       -->
<mapper namespace="com.mb.mapping.userMapper">
    <!-- 在映射文件中配置很多sql语句-->
    <!--  需求:通过id查询用户表的记录 -->
    <!--通过select执行数据库查询
    id:标识映射文件中的sql,
    将sql语句封装到mappedStatement对象中,所以将id称为statement的id
    parameterType:制定输入参数的类型,这里制定ing型
    #{}表示一个占位符号
    #{id}:其中的id表示接受输入的参数,参数名称就是id,如果输入参数就是简单类型,#{}中的参数名可以任意,可以value或其他名称
    resultType:指定sql输入结果的所映射的Java对象,select指定resultType表示将单条记录映射成Java对象。
    -->
    <select id="getUser" parameterType="int" resultType="com.mb.domain.User">
        select * from s_user where id=#{id}
    </select>
    <!-- 根据用户名称模糊查询用户信息,可能返回多条  -->
    <!--  resultType:指定就是单条记录所映射的java对象类型  -->
    <select id="findUserName" parameterType="String" resultType="com.mb.domain.User">
        select * from s_user where name  like '%${value}%'
    </select>
    <!--  添加用户
    parameterType:指定输入参数类型是pojo(包括用户信息)  insert没有返回值-->
    <insert id="insertUser"  parameterType="com.mb.domain.User">
        <!--
        将插入数据的主键返回,返回到user对象中
        SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用于自增主键
        keyProperty:将查询到主键设置到parameterType指定对象的哪个属性
        order:select LAST_INSERT_ID()执行顺序,相对于insert来说他的执行顺序(之后)
        resultType:指定SELECT LAST_INSERT_ID()的结果类型
        -->
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            SELECT LAST_INSERT_ID()
        </selectKey>
        insert into s_user(name,age,sex,birthday) values(#{name},#{age},#{sex},#{birthday})
    </insert>
    <!-- 更新用户 -->
    <!-- 分析:
        需要传入用户的id
        需要传入用户的更新信息
        parameterType指定user对象,包括id和更新信息,注意:id必须存在
        #{id}:从输入user对象中获取id属性值
      -->
    <update id="updateUser" parameterType="com.mb.domain.User">
        update s_user set name=#{name},age=#{age},sex=#{sex},birthday=#{birthday} where id=#{id}
    </update>
    <!-- 删除用户 -->
    <!-- 根据id删除用户,需要输入id的值 -->
    <delete id="deleteUser" parameterType="int">
        delete from s_user where id=#{id}
    </delete>
</mapper>

MybatisFirst.java

package com.mb.domain;

        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;
        import java.util.Date;
        import java.util.List;

public class MybatisFirst {
    //根据id查询用户信息,得到一条记录结果
    public  void findUserByIdTest() throws IOException {
        //mybatis配置文件
        String resource ="sqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
        //创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        String statement="com.mb.mapping.userMapper.getUser";
        //通过SqlSession操作数据库
        //第一个参数:映射文件中statement的id,等于namespace+"."+statement的id
        //第二个参数:指定和映射文件中所匹配的parameterType类型的参数
        User user=sqlSession.selectOne(statement,1);
        System.out.println(user);
        //释放资源
        sqlSession.close();
    }

    //根据用户名称模糊查询数据
    public void findUserByNameTest() throws IOException{
        //mybatis配置文件
        String resource ="sqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
        //创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        String statement="com.mb.mapping.userMapper.findUserName";
        //list中的user和映射文件中resultType所指定的类型一致
        List<User> list=sqlSession.selectList(statement,"三");
        System.out.println(list);
        //关闭会话
        sqlSession.close();
    }

    //添加用户信息
    public void insertUserTest() throws IOException{
        //mybatis配置文件
        String resource ="sqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
        //创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        String statement="com.mb.mapping.userMapper.insertUser";
        User user =new User();
        user.setName("李红");
        user.setAge(41);
        user.setSex("女");
        //在使用当前时间如果用new Date(),应当引用java.util.Date  如果用java.sql.Date会有问题
        user.setBirthday(new Date());
        //没有返回值,不用变量接收
        sqlSession.insert(statement,user);
        //提交事务
        sqlSession.commit();
        //显示返回id
        System.out.println(user.getId());
        //关闭会话
        sqlSession.close();
    }

    //删除用户信息
    public void deleteUserTest() throws IOException{
        //mybatis配置文件
        String resource ="sqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
        //创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        String statement="com.mb.mapping.userMapper.deleteUser";
        //将id传过去,删除用户。
        sqlSession.delete(statement,6);
        //提交事务
        sqlSession.commit();
        //关闭会话
        sqlSession.close();
    }

    //更新用户
    public void updateUserTest() throws IOException{
        //mybatis配置文件
        String resource ="sqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
        //创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        String statement="com.mb.mapping.userMapper.updateUser";
        User user =new User();
        user.setId(6);
        user.setName("wangwang");
        user.setAge(14);
        user.setSex("女");
        //在使用当前时间如果用new Date(),应当引用java.util.Date  如果用java.sql.Date会有问题
        user.setBirthday(new Date());
        //没有返回值,不用变量接收
        sqlSession.update(statement,user);
        //提交事务
        sqlSession.commit();
        //关闭会话
        sqlSession.close();
    }

    public static void main(String[] args) throws IOException {
        /* 实例化MybatisFirst类 */
        MybatisFirst mf=new MybatisFirst();
        /* 通过id查询用户信息*/
        mf.findUserByIdTest();
        /* 通过name模糊查询用户信息*/
        mf.findUserByNameTest();
        /* 插入用户信息*/
        //mf.insertUserTest();
        /* 更新用户信息*/
        mf.updateUserTest();
        /* 删除用户信息*/
        mf.deleteUserTest();
    }

}

以上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值