import com.dong.model.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 TestDemo { SqlSession sqlSession; @Before public void before() throws IOException { InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); sqlSession = sqlSessionFactory.openSession(); } @After public void after() throws IOException { sqlSession.close(); } //根据id查询数据 @Test public void Test01(){ User user= sqlSession.selectOne("findUserById",10); System.out.println(user); } //根据username模糊查询数据 @Test public void Test02(){ List<User> user = sqlSession.selectList("findUserByName", "张"); System.out.println(user); } //增 @Test public void Test03(){ User user=new User("dong","男",new Date(),"深圳"); int rownum = sqlSession.insert("InsertUser", user); sqlSession.commit(); System.out.println("受影响的行:"+rownum); } //改 @Test public void Test04(){ User user=new User(); user.setSex("2"); user.setId(28); int rownum = sqlSession.update("UpdateUser", user); sqlSession.commit(); System.out.println("受影响的行:"+rownum); } //删 @Test public void Test05(){ int rownum = sqlSession.delete("deleuser", 28); sqlSession.commit(); System.out.println("受影响的行:"+rownum); } //返回最后插入的id @Test public void Test06(){ User user=new User("dong","男",new Date(),"深圳"); int rownum = sqlSession.insert("InsertUser2", user); sqlSession.commit(); System.out.println("id:"+user.getId()); } }
<?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"> <!-- namespace:命名空间,它的作用就是对SQL进行分类化管理,可以理解为SQL隔离 注意:使用mapper代理开发时,namespace有特殊且重要的作用 --> <mapper namespace="test"> <!-- [id]:statement的id,要求在命名空间内唯一 [parameterType]:入参的java类型 [resultType]:查询出的单条结果集对应的java类型 [#{}]: 表示一个占位符? [#{id}]:表示该占位符待接收参数的名称为id。注意:如果参数为简单类型时,#{}里面的参数名称可以是任意定义 --> <select id="findUserById" parameterType="int" resultType="com.dong.model.User"> SELECT * FROM USER WHERE id = #{id} </select> <select id="findUserByName" parameterType="String" resultType="com.dong.model.User"> SELECT * FROM USER WHERE username like '%${value}%' </select> <insert id="InsertUser" parameterType="com.dong.model.User"> insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address}) </insert> <update id="UpdateUser" parameterType="com.dong.model.User"> update user set sex= #{sex} where id=#{id} </update> <delete id="deleuser" parameterType="int"> delete from user where id=#{id} </delete> <!-- [selectKey标签]:通过select查询来生成主键 [keyProperty]:指定存放生成主键的属性 [resultType]:生成主键所对应的Java类型 [order]:指定该查询主键SQL语句的执行顺序,相对于insert语句 [last_insert_id]:MySQL的函数,要配合insert语句一起使用 --> <insert id="InsertUser2" parameterType="com.dong.model.User"> <selectKey keyProperty="id" resultType="int" order="AFTER"> select last_insert_id() </selectKey> insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address}) </insert> </mapper>
主键返回之MySQL自增主键
思路:
- MySQL自增主键,是指在insert之前MySQL会自动生成一个自增的主键。
- 我们可以通过MySQL的函数获取到刚插入的自增主键:
LAST_INSERT_ID()
- 这个函数是在insert语句之后去调用。
<insert id="insertUser" parameterType="com.gyf.domain.User"> <!-- [selectKey标签]:通过select查询来生成主键 [keyProperty]:指定存放生成主键的属性 [resultType]:生成主键所对应的Java类型 [order]:指定该查询主键SQL语句的执行顺序,相对于insert语句 [last_insert_id]:MySQL的函数,要配合insert语句一起使用 --> <selectKey keyProperty="id" resultType="int" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> <!-- 如果主键的值是通过MySQL自增机制生成的,那么我们此处不需要再显示的给ID赋值 --> INSERT INTO USER (username,sex,birthday,address) VALUES(#{username},#{sex},#{birthday},#{address}) </insert> |
主键返回之MySQL自增UUID
<insert id="insertUser" parameterType="com.gyf.domain.User"> <selectKey keyProperty="id" resultType="String" order="BEFORE"> SELECT UUID() </selectKey> INSERT INTO USER (username,sex,birthday,address) VALUES(#{username},#{sex},#{birthday},#{address}) </insert> |
ORCLE主键
SELECT user_seq.nextval() FROM dual
小结:
parameterType和resultType parameterType指定输入参数的java类型,可以填写别名或Java类的全限定名。 resultType指定输出结果的java类型,可以填写别名或Java类的全限定名。
#{}和${} #{}:相当于预处理中的占位符?。 #{}里面的参数表示接收java输入参数的名称。 #{}可以接受HashMap、POJO类型的参数。 当接受简单类型的参数时,#{}里面可以是value,也可以是其他。 #{}可以防止SQL注入。 ${}:相当于拼接SQL串,对传入的值不做任何解释的原样输出。 ${}会引起SQL注入,所以要谨慎使用。 ${}可以接受HashMap、POJO类型的参数。 当接受简单类型的参数时,${}里面只能是value。
selectOne和selectList selectOne:只能查询0或1条记录,大于1条记录的话,会报错: selectList:可以查询0或N条记录
|