Mybatis笔记2-程序员宅基地

技术标签: java  数据库  

使用Mybatis完成的CRUD操作

个人总结的一些小规律

img

学习过程中碰到的错误:

org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

虽然报错信息提示的 很明显是sql语法报错,不过我一时之间没有没有看出sql语句错在哪里,后来才发现是插入sql语句的括号写错了,不是小括号,而是大括号

错误写法:insert  into user(username,address,sex,birthday)value(#(username),#(address),#(sex),#(birthday);

正确写法:insert  into user(username,address,sex,birthday)value(#{username},#{address},#{sex},#{birthday});

JavaBean类

package com.itheima.domain;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {
    private Integer id;
    private String username;
    private String address;
    private String sex;
    private Date birthday;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAddress() {
        return address;
    }

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

    public String getSex() {
        return sex;
    }

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

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

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

dao层

package com.itheima.dao;

import com.itheima.domain.User;

import java.util.List;

public interface IUserDao {
    //查询所有用户
    List<User> findAll();
    //保存用户
    void saveUser(User user);
    //更新用户
    void updateUser(User user);
    //根据id删除用户
    void deleteUser(Integer userId);
    //查询一个,根据id查询用户信息
    User findById(Integer userId);
    //根据名称模糊查询用户信息
    List<User> findByName(String username);
    //查询总用户数
    int findTotal();
}

配置文件

<?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="com.itheima.dao.IUserDao">
    <!--查询所有用户-->
    <select id="findAll" resultType="com.itheima.domain.User">
      select * from user;
    </select>
<!--保存用户-->
    <insert id="saveUser" parameterType="com.itheima.domain.User">
       <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
           select last_insert_id();
       </selectKey>
        insert  into user(username,address,sex,birthday)value(#{username},#{address},#{sex},#{birthday});
    </insert>
    <!--更新用户-->
    <update id="updateUser" parameterType="com.itheima.domain.User">
        update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id}
    </update>
    <!--删除用户-->
    <delete id="deleteUser" parameterType="Integer">
        delete from user where id=#{id}
    </delete>
    <!--根据id查询用户-->
    <select id="findById"  parameterType="Integer" resultType="com.itheima.domain.User">
        select * from user where id = #{uid}
    </select>

    <!--根据名称模糊查询-->
    <select id="findByName" parameterType="String" resultType="com.itheima.domain.User">
        select * from user where username like #{name}
    </select>
    <select id="findTotal" resultType="int">
        select count(id) from user;
    </select>
</mapper>

测试类

package com.itheima.test;

import com.itheima.dao.IUserDao;
import com.itheima.domain.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.Date;
import java.util.List;

public class MybatisTest {
    private InputStream in;//读取配置文件
    private SqlSession sqlSession;//操作数据库
    private IUserDao userDao;
    @Before//用于在测试方法执行之前执行,在其他方法执行之前执行init方法
    public void init() throws IOException {
        //读取配置文件,生成字节输入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //获取SqlSessionFactory
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //获取sqlSession对象
       sqlSession = factory.openSession();
        //获取dao的代理对象
        userDao = sqlSession.getMapper(IUserDao.class);
    }
    @After//用于测试方法执行之后执行
    public void destroy() throws IOException {
        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
        in.close();
    }
    @Test
    //查询所有用户
    public void testFindAll() throws IOException {
        //执行查询方法
        List<User> users = userDao.findAll();
        for(User user:users){
            System.out.println(user);
        }
    }
    @Test
    //保存用户
    public void testSave(){
        User user = new User();
        user.setUsername("王五");
        user.setAddress("北京市");
        user.setSex("男");
        user.setBirthday(new Date());
        System.out.println("保存前"+user);
        //执行保存方法
        userDao.saveUser(user);
        System.out.println("保存后"+user);
    }

    @Test
    //更新用户
    public void testUpdate(){
        User user = new User();
        user.setId(50);
        user.setUsername("李四");
        user.setAddress("北京市");
        user.setSex("男");
        user.setBirthday(new Date());
        //执行查询方法
        userDao.updateUser(user);
    }
    @Test
    //删除用户
    public void testDelete(){

        userDao.deleteUser(48);
    }
    @Test
    //查询一个用户
    public void testFindOne(){

        User user = userDao.findById(48);
        System.out.println(user);
    }

    @Test
    //查询一个用户
    public void testFindByName(){

        List<User> users = userDao.findByName("%王%");
        for(User user :users){
            System.out.println(user);
        }
    }
    @Test
    //查询一个用户
    public void testFindTotal(){
        int count = userDao.findTotal();
        System.out.println(count);
    }
}

typeAliases标签和Package标签

<!--使用typeAliases配置别名,他只能配置domain中类的别名-->
    <typeAliases>
        <!--typeAlias用于配置别名,type属性指定的是实体类权限定类名 alias属性指定别名,当指定了别命,不再区分大小写-->
        <!--<typeAlias type="com.itheima.domain.User" alias="user"></typeAlias>-->
        <!--用于指定配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写-->
        <package name="com.itheima.domain"></package>
    </typeAliases>
<mappers>
    <!--<mapper resource="com/itheima/dao/IUserDao.xml"></mapper>-->
    <!--package标签是用于指定dao接口所在的包,当指定了之后就不需要在写mapper以及resource或者class了-->
    <package name="com.itheima.dao"></package>
</mappers>

mybatis连接池的分类

连接池:我们在实际开发中都会使用连接池,因为他可以减少我们获取连接所消耗的时间

mybatis中的连接池

mybatis连接池提供了3种方式的配置:

配置的位置:主配置文件SqlMapConfig.xml的dataSource标签,type属性就是表示采用何种连接池方式

type属性的取值有三种

1.POOLED 采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现

2.UNPOOLED 采用的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用池的思想

3.采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样的,如果不是web或者maven的war工程,是不能使用的(tomcat服务器,采用连接池就是dbcp连接池)

转载于:https://www.cnblogs.com/train99999/p/11186265.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30689307/article/details/96523429

智能推荐

Word实现论文编辑中大批量公式居中,编号右对齐格式,同时消除编号上下不居中问题,完全版!!_中文论文怎么样公式居中但是编号右对齐-程序员宅基地

文章浏览阅读403次,点赞5次,收藏4次。3.根据制表位调整公式:将公式左对齐为初始状态,光标移到最左边---->点击“Tab”------>光标移到公式和编号之间---->点击“Tab”解决方案:修改格式---->格式---->段落---->中文版式---->文本对齐方式选择“居中”(2)点击第一次Tab:此时公式居中(对齐居中制表位),然后将光标移到公式和编号之间。2.点击Tab,将光标移到公式和编号之间,再次点击Tab。(3)第二次点击Tab:编号就会右对齐(右对齐制表位)可以看到,通过设置格式的方式实现了公式的简化设置。_中文论文怎么样公式居中但是编号右对齐

粒子群优化算法PSO与鹈鹕优化算法(POA)求解无人机三维路径规划(MATLAB代码)-程序员宅基地

文章浏览阅读425次,点赞5次,收藏6次。close allclearclc% 创建模型F='F1';%获取函数信息pop=100;%种群大小(可以自己修改)maxgen=100;%最大迭代次数(可以自己修改)%'路径成本','威胁成本','高度成本','转角成本'%% 计算航迹坐标%% 保存各算法的目标函数值及收敛曲线%% 保存航迹坐标。

LF和CRLF的区别_crlf与lf区别-程序员宅基地

文章浏览阅读363次。LF:Line Feed,即换行("\n"),Linux系统环境下的换行方式。CRLF:Carriage Return Line Feed,即回车换行("\r\n"),Windows系统环境下的换行方式。_crlf与lf区别

eclipse 格式化代码 快捷键_eclipse格式化代码快捷键-程序员宅基地

文章浏览阅读1.4k次。按下相应的快捷键后,Eclipse将自动根据您的代码格式化偏好设置对代码进行格式化。请确保已经选择和配置了适合您编码风格的格式化规则和偏好设置。您可以在Eclipse的首选项(Preferences)> Java > 代码风格 > 格式化 中进行相关配置。请注意,这些快捷键在默认情况下适用于Java代码,但可以在其他编程语言中进行使用。如果您正在使用不同的编程语言,请查看相应语言的格式化快捷键配置。_eclipse格式化代码快捷键

网页中实现安卓手机在线预览PDF文件_pdf文件手机在线浏览-程序员宅基地

文章浏览阅读1.4w次,点赞2次,收藏19次。苹果手机可以直接在线预览PDF文件,而安卓手机不行,必须得下载(如图),所以需要解决一下1.准备所需js文件(1)js下载地址https://mozilla.github.io/pdf.js/(2)下载步骤 ①:打开网址后,点击图中的“Download”②:选择版本,直接下载即可2.在项目中导入相关JS文件(如图)3.编写代码(1)引入js文件..._pdf文件手机在线浏览

【OTFS与信号处理:论文阅读2】基于OTFS调制的迭代信道估计与检测算法_otfs叠加导频-程序员宅基地

文章浏览阅读1.8k次,点赞8次,收藏36次。【OTFS与信号处理:论文阅读】基于OTFS调制的迭代信道估计与检测算法 Iterative Channel Estimationand Data Detection Algorithm For OTFS Modulation_otfs叠加导频

随便推点

南航计算机系复试内容,2010年南航计算机专业复试真题-程序员宅基地

文章浏览阅读342次。2010年南航计算机专业复试真题题型有1)填空 如 DDR SDRAM的中文名称是___; 主流压缩软件RAR采用何种校验码;处理器为core2 DUO,采用windows Vista 32位系统,则最大访问内存___GB;汉子显示技术的两种方法;还有一些别的题比较基本,应该都会2)判断题,注意要写出错的话是哪里错,如USB与IEEE1394都是串行的通用总线;微机原理的,南桥北桥基本概念等;3)..._s->btc|a t->r

两条曲线怎么加标题_教程 | Origin对2条曲线求和、求差-程序员宅基地

文章浏览阅读2.4k次。ORIGIN教程【导读】中科院化学所的周博士提问,怎样进行多峰拟合,在5月7日的教程中,我们实现了核磁共振谱的多峰拟合,实现了分峰。点击阅读:教程 | Origin对曲线进行多峰拟合但是,还有一个问题,并没有解决。周博士的这个图,需要用成对的双峰来表达。如下图(右边是文献图),需要将1和2曲线叠加成类似于文献图中曲线5的效果。今天,一个灵感闪现,或许能实现这个目的。本教程对曲线“求差”同..._origin给曲线添加标题

设备像素比-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏4次。设备像素(又称为物理像素): 指设备能控制显示的最小物理单位,意指显示器上一个个的点。从屏幕在工厂生产出的那天起,它上面设备像素点就固定不变了,和屏幕尺寸大小有关,设备屏幕的物理像素,任何设备的物理像素的数量都是固定的,单位pt,磅css像素(也叫虚拟像素):指的是 CSS 样式代码中使用的逻辑像素,在 CSS 规范中,长度单位可以分为两类,绝对(absolute)单位以及相对(relative)单位。px 是一个相对单位,相对的是设备像素(device pixel)DPR(设备像素比):设备像素比 =_设备像素比

Arcgis空间分布方向性分析_标准差椭圆-程序员宅基地

文章浏览阅读2.6w次,点赞44次,收藏246次。Arcgis空间分布方向性分析一、标准差椭圆方法概述空间分布方向性分析是指区域经济属性在空间分布上的轮廓和主导方向。 标准差椭圆法是分析空间分布方向性特征的经典方法之一,使用标准差椭圆可 从全局的、空间的角度定量解释经济要素空间分布的中心性、展布性、方向性和 空间形态等整体性特征,因其直观性与有效性已得到广泛应用,已成为 Arc GIS 空间统计模块的常规统计工具。SDE 方法生成的结果为一个椭圆,从其生 成算法来看,首先用平均中心来确定椭圆的圆心,然后由平均中心作为起点 对 X 坐标_标准差椭圆

Java学习之路(一):不走弯路,就是捷径!!-程序员宅基地

文章浏览阅读398次。­ 在ChinaITLAB导师制辅导中,笔者发现问得最多的问题莫过于"如何学习编程?JAVA该如何学习?"。类似的问题回答多了,难免会感觉厌烦,就萌生了写下本文的想法。到时候再有人问起类似的问题,我可以告诉他(她),请你去看看《JAVA学习之路》。拜读过台湾蔡学镛先生的《JAVA夜未眠》,有些文章如《JAVA学习之道》等让我们确实有共鸣,本文题目也由此而来。   软件开发之路是

ElementUi Carousel 走马灯,自定义el-carousel箭头左右切换-程序员宅基地

文章浏览阅读2.7w次,点赞25次,收藏58次。一 效果图需求是我自己要自定义左右切换的箭头图片,每个页面里面显示6组数据。二 上代码:autoplay="false" 不需要自动轮播arrow="never" 不需要自带的箭头indicator-position="none" 不需要底部的指示器重点在于 ref=“cardShow”调用方法<el-carousel :autoplay="false" height="72px" arrow="never" indicator-position="none.._el-carousel

推荐文章

热门文章

相关标签