本小节通过XML配置方式,实现基本的增删改查。
增、删、改、查
增删改查分别对应的标签是:insert、delete、update、select。
id:唯一标识符,与接口中的方法一一对应;
parameterType:传入sql语句的参数类型,当参数是基本类型并且只有一个时该属性可以不写;
resultType:sql语句返回值的类型(完整的类名或者别名);
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.liwq.mapper.UserMapper"><insert id="addUser" parameterType="com.liwq.entity.User">insert into uservalues (#{id}, #{userName}, #{passWord})</insert><delete id="deleteUserById" parameterType="int">deletefrom userwhere id = #{id}</delete><update id="updateUserById" parameterType="com.liwq.entity.User">update userset user_name=#{userName},pass_word=#{passWord}where id = #{id}</update><select id="getUserById" resultType="com.liwq.entity.User" parameterType="int">select *from userwhere id = #{id}</select><select id="listUsers" resultType="com.liwq.entity.User">select *from user</select></mapper>
增删改的标签属性和查的差不多,但需要注意的是增删改都需要提交事务才能改变数据库中的数据。
MyBatis获取参数值
MyBatis获取参数值的两种方式:${}和#{}
- ${}的本质就是字符串拼接,#{}的本质就是占位符赋值
- ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号
单个字面量类型的参数
若mapper接口中的方法参数为单个的字面量类型,此时可以使用${}和#{}以任意的名称(最好见名识意)获取参数的值,注意${}需要手动加单引号。
<select id="getUserByUsername" resultType="User">select * from user where username = #{username}</select>
<select id="getUserByUsername" resultType="User">select * from user where username = '${username}'</select>
map集合类型的参数
若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号。
<select id="getUserById2" resultType="com.liwq.entity.User" parameterType="map">select *from userwhere user_name = #{username}and pass_word = #{password}</select>
public void getUserById2() throws IOException {//读取MyBatis的核心配置文件InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//获取SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();//通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);//获取sqlSession,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务//SqlSession sqlSession = sqlSessionFactory.openSession();//创建SqlSession对象,此时通过SqlSession对象所操作的sql都会自动提交SqlSession sqlSession = sqlSessionFactory.openSession(true);//通过代理模式创建UserMapper接口的代理实现类对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配映射文件中的SQL标签,并执行标签中的SQL语句Map<String, Object> map = new HashMap<String, Object>();map.put("username", "tom3153e703-582b-40b1-96b1-142889d476d0");map.put("password", "pass398f68fd-b4cc-47d9-83e3-947750bddae6");User result = userMapper.getUserById2(map);//提交事务//sqlSession.commit();System.out.println("result:" + result.toString());}
实体类类型的参数
若mapper接口中的方法参数为实体类对象时此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号。
<insert id="addUser" parameterType="com.liwq.entity.User">insert into uservalues (#{id}, #{userName}, #{passWord})</insert>
public void addUser() throws IOException {//读取MyBatis的核心配置文件InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//获取SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();//通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);//获取sqlSession,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务//SqlSession sqlSession = sqlSessionFactory.openSession();//创建SqlSession对象,此时通过SqlSession对象所操作的sql都会自动提交SqlSession sqlSession = sqlSessionFactory.openSession(true);//通过代理模式创建UserMapper接口的代理实现类对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配映射文件中的SQL标签,并执行标签中的SQL语句User user = new User();user.setUserName("tom" + UUID.randomUUID());user.setPassWord("pass" + UUID.randomUUID());int result = userMapper.addUser(user);//提交事务//sqlSession.commit();System.out.println("result:" + result);}
