下面我们再来做一个测试,根据用户名模糊查询用户的记录。
同理现在userMapper.xml中添加一个sql语句
<select id="selectUserByName" parameterType="java.lang.String" resultType="com.beyond.mybatis.po.User"> select * from user WHERE username like '%${value}%' </select>
由于查询的结果可能返回多条所以我们这里使用selectList进行查询。
/** * @author:kevin * @Description: 根据用户名模糊查询 * @Date:12:08 2018/3/24 */ @Test public void findUserByName() throws IOException { String resource = "SqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); //创建会话工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); //创建会话 SqlSession sqlSession = factory.openSession(); //通过sqlsession操作数据库 List user = sqlSession.selectList("test.selectUserByName","李"); System.out.println(user); sqlSession.close(); }
输出:
小结:
parameterType:
在映射文件中指定输入参数的类型
resultType:
在映射文件中指定返回结果的类型。
#{}和${}的区别
#{}表示一个占位符,#{}接收简单类型的时候里面可以是任意参数#{value},#{id}等等,接收pojo对象值,通过OGNL读取队形中的属性值。
${}表示一个拼接符号,会引起sql注入,所以不建议使用。${}接收简单类型的时候里面只能是value,${value}.
selectOne查询单条记录。
selectList查询多条记录。
添加用户信息。
<!-- 添加用户 parameterType: 指定输入参数类型是pojo --> <insert id="insertUser" parameterType="com.beyond.mybatis.po.User"> insert into user(id,username,birthday,sex,addr) VALUES (#{id},#{username},#{birthday},#{sex},#{addr}) </insert>
/** * @author:kevin * @Description: 添加用户 * @Date:12:08 2018/3/24 */ @Test public void insertUser() throws IOException { String resource = "SqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); //创建会话工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); //创建会话 SqlSession sqlSession = factory.openSession(); //通过sqlsession操作数据库 //List user = sqlSession.selectList("test.selectUserByName","李"); User user = new User(); user.setUsername("王小川"); user.setBirthday(new Date()); user.setSex("1"); user.setAddr("四川成都"); sqlSession.insert("test.insertUser",user); //提交事务 sqlSession.commit(); sqlSession.close(); }
插入成功后查看数据库
自增主键返回
mysql自增主键,执行insert提交自动生成一个自增主键。通过mysql函数获取到刚插入记录的自增主键:
LAST_INSERT_ID(),insert之后调用。
需要修改insertUser的定义如下:
<insert id="insertUser" parameterType="com.beyond.mybatis.po.User"> <!-- 将插入数据的主键返回,返回到user对象中 SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用于自增主键 keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性 order:SELECT LAST_INSERT_ID()执行顺序,相对于insert来说它的执行顺序 --> <selectKey keyProperty="id" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> insert into user(id,username,birthday,sex,addr) VALUES (#{id},#{username},#{birthday},#{sex},#{addr}) </insert>
再次执行插入:
这次控制台打印出的id为 39。
非自增主键的返回:
如uuid主键的返回
需要将id类型修改为varchar,然后在insert之前获取uuid
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> SELECT uuid() </selectKey>
删除用户:
<!-- 根据id删除 --> <delete id="deleteUserById" parameterType="int"> DELETE FROM USER WHERE id=#{id} </delete>
/** * @author:kevin * @Description: 根据id删除用户信息 * @Date:12:08 2018/3/24 */ @Test public void deleteUser() throws IOException { String resource = "SqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); //创建会话工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); //创建会话 SqlSession sqlSession = factory.openSession(); //通过sqlsession操作数据库 sqlSession.delete("test.deleteUserById",39); //提交事务 sqlSession.commit(); sqlSession.close(); }
更新用户:
<!-- 更新用户 --> <update id="updateUser" parameterType="com.beyond.mybatis.po.User"> UPDATE USER SET username=#{username},birthday=#{birthday},sex=#{sex} WHERE id=#{id} </update>
/** * @author:kevin * @Description: 更新用户 * @Date:12:08 2018/3/24 */ @Test public void updateUser() throws IOException { String resource = "SqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); //创建会话工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); //创建会话 SqlSession sqlSession = factory.openSession(); //通过sqlsession操作数据库 //List user = sqlSession.selectList("test.selectUserByName","李"); User user = new User(); user.setId(38); user.setUsername("罗峰"); user.setBirthday(new Date()); user.setSex("1"); user.setAddr("四川成都"); sqlSession.update("test.updateUser",user); //提交事务 sqlSession.commit(); sqlSession.close(); }至此,Mybatis的入门程序差不多结束了。