SSM学习之路——Mybatis第二天_CRUD入门

使用XML方法

1.实现Insert操作

1.1 在IUserDao接口中添加方法

在这里插入图片描述

1.2 在IUserDao.xml中添加对应的dom

注意此处为insert标签 对应的参数类型(parameterType)为实体类的全限定类名
后面value为#{parameter} 与前面一一对应

<insert id="insertUser" parameterType="com.itheima.domain.User">
        insert into user(username,birthday,sex,address)
        value (#{username},#{birthday},#{sex},#{address})
    </insert>
在1.3之前 有一个小优化

之前的代码:

		//1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工厂创建SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //4.使用SqlSession创建Dao接口的代理对象
        IUserDao userDao = sqlSession.getMapper(IUserDao.class);

因为可能有很多个操作方法
如果每个方法都要像上面那样把每个都从头创建 无疑是增多了无用的重复代码
因此将重复的构造和释放资源的代码提出
分为init创建 和destroy释放
并且注意在测试类中
要在init上面加上@Before注解 表明要在测试方法之前执行
要再destroy上面加上@After注解 表明在测试方法结束后要执行这个
代码优化之后如下

public class MybatisTest {
    InputStream in;
    SqlSessionFactory factory;
    SqlSession session;
    IUserDao userDao;
    @Before
    public void init() throws IOException {
        //1.获取配置文件流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        factory = new SqlSessionFactoryBuilder().build(in);
        //3.用工厂创建一个SqlSession
        session = factory.openSession();
        //4.用SqlSession创建一个Dao接口的代理
        userDao = session.getMapper(IUserDao.class);
    }
    @After
    public void destroy() throws IOException{
    	session.commit();
        session.close();
        in.close();
    }
    @Test
    public void testFindAll(){

        List<User> users = userDao.findAll();
        for (User user:users){
            System.out.println(user);
        }
        //6.释放资源
    }
    @Test
    public void testInsertUser(){
        User user = new User();
        user.setUsername("老张");
        user.setBirthday(new Date());
        user.setSex("男");
        user.setAddress("金华金东区");
        userDao.insertUser(user);
        session.commit();
    }
}
1.3 编写testInsertUser方法,向数据库插入数据

注意在最后要用session.commit提交事务
这里也进行优化 把commit移动到destroy方法里

@Test
    public void testInsertUser(){
        User user = new User();
        user.setUsername("老张");
        user.setBirthday(new Date());
        user.setSex("男");
        user.setAddress("金华金东区");
        userDao.insertUser(user);
    }

2.实现update操作和delete操作

2.1 在IUerDao接口中添加update方法和delete方法

由于delete只需要一个id就够了 所以传入为一个integer
在这里插入图片描述

2.2 在IUserDao.xml里面加入update和delete的dom
<update id="updateUser" parameterType="com.itheima.domain.User">
        update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
    </update>
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id=#{id}
    </delete>
2.3 在MybatisTest类中编写update和delete的Test类

update:

@Test
    public void testUpdateUser(){
        User user = new User();
        user.setId(42);//修改小二王的
        user.setUsername("小二");
        user.setBirthday(new Date());
        user.setSex("女");
        user.setAddress("金华义乌");
        userDao.updateUser(user);
    }

delete
注意这里传入的parameterType为id的类型即:integer

<delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id=#{id}
    </delete>
@Test
    public void testDeleteUser(){
        userDao.deleteUser(46);
    }

3.实现查找某id对应的数据

3.1 在IUserDao接口中添加方法

返回的是用户的信息 所以返回值为User 通过id来查找 则参数为id
在这里插入图片描述

3.2 在IUserDao.xml中添加dom

resultTyoe为返回值的实体类 parameterType为传入的参数 对应下面的id

<select id="findUser" resultType="com.itheima.domain.User" parameterType="java.lang.Integer">
        select * from user where id=#{id}
    </select>
3.3 在MybatisTest.java测试类中编写测试方法
@Test
    public void testFindUser(){
        User user = userDao.findUser(55);
        System.out.println(user);
    }

4. 按名字模糊查找

4.1 在IUserDao接口中添加方法

在这里插入图片描述

4.2 在IUserDao.xml中添加dom
<select id="findUserByName" resultType="com.itheima.domain.User" parameterType="java.lang.String">
        select * from user where username like #{username}
    </select>
4.3 在MybatisTest测试类中添加测试方法
@Test
    public void testFindUserByName(){
        List<User> users = userDao.findUserByName("%老1%");
        for (User user: users){
            System.out.println(user);
        }
    }
另 :按模糊查找也可以在dom中将语句写成:

外面为 ‘单引号’
两边为模糊查找的 %%
值为${value} 注意value为固定值!value外是花括号

<select id="findUserByName" resultType="com.itheima.domain.User" parameterType="java.lang.String">
        <!--select * from user where username like #{username}-->
        select * from user where username like '%${value}%'
    </select>

那么这样 测试类中字符串就不用加%%了 改为:

List<User> users = userDao.findUserByName("老1");
区别和优劣:

在这里插入图片描述
如上图 使用 ‘%${value}%’ 这种方法运行
可以看出这是使用字符串拼接的sql语句

在这里插入图片描述

如上图 使用 like #{username} 和 findUserByName("%老1%"); 这种方法
使用的是prepareStatement的预处理语句

结论:使用预处理语句更好一些!


4.在insert语句执行后拿到该插入数据的id

4.1

在insert里面插入selectKey标签
1.keyProperty为查询的参数
2.keyColumn为数据库中对应的字段
3.order有AFTER和BEFORE 分别表示是在insert执行后执行该语句还是之前
4.resultType表示返回的这个值的类型 这里为int
select last_insert_id()为sql语句 表示最近插入的id

<insert id="insertUser" parameterType="com.itheima.domain.User">
        <selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="java.lang.Integer">
            select last_insert_id()
        </selectKey>
        insert into user(username,birthday,sex,address)value (#{username},#{birthday},#{sex},#{address})
    </insert>
发布了23 篇原创文章 · 获赞 0 · 访问量 609

猜你喜欢

转载自blog.csdn.net/SixthMagnitude/article/details/103882878
今日推荐