本文共 8630 字,大约阅读时间需要 28 分钟。
*注:在字段中有Date和DateTime类型,在插入数据时只要将实体的属性设置成Timestamp就会对应mysql的DateTime类型,Date会对应mysql的Date类型: #{modified_date,jdbcType=TIMESTAMP}、#{date,jdbcType=DATE}。 测试方法:insert into user(username,birthday,sex,address) value(#{username}.#{birthday,jdbcType=DATE}.#{sex},#{address})
//添加用户 @Test public void insertUserTest(){ //mybatis配置文件 String resource="SqlMapConfig.xml"; //将配置文件加载成流 InputStream inputStream; try { inputStream = Resources.getResourceAsStream(resource); //创建会话工厂,传入mybatis配置文件的信息 SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); //通过工厂得到sqlSession sqlSession=sqlSessionFactory.openSession(); //插入用户对象 User user=new User(); user.setUsername("李云华"); user.setBirthday(new Date()); user.setSex("男"); user.setAddress("云南大理"); //通过SqlSession操作数据库 //第一个参数:映射文件中的statement的Id,等于=namespace+"."+statement的Id //第二个参数:指定和映射文件所匹配的parameterType类型的参数 //sqlSession.selectOne最终结果与你映射文件中所匹配的resultType类型 sqlSession.insert("test.insertUser",user); //提交事务 sqlSession.commit(); } catch (IOException e) { e.printStackTrace(); }finally{ //释放资源 sqlSession.close(); } }测试结果: 在数据库中插入了 李云华(String), 2015-06-07(Date), 男(String), 云南大理(String) 输出的日志信息:
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.DEBUG [main] - PooledDataSource forcefully closed/removed all connections.DEBUG [main] - PooledDataSource forcefully closed/removed all connections.DEBUG [main] - PooledDataSource forcefully closed/removed all connections.DEBUG [main] - PooledDataSource forcefully closed/removed all connections.DEBUG [main] - Opening JDBC ConnectionDEBUG [main] - Created connection 30685694.DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@1d439fe]DEBUG [main] - ==> Preparing: insert into user(username,birthday,sex,address) value(?,?,?,?) DEBUG [main] - ==> Parameters: 李云华(String), 2015-06-07(Date), 男(String), 云南大理(String)DEBUG [main] - <== Updates: 1DEBUG [main] - Committing JDBC Connection [com.mysql.jdbc.Connection@1d439fe]DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.Connection@1d439fe]DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.Connection@1d439fe]DEBUG [main] - Returned connection 30685694 to pool.(2)主键返回 a.自增主键的返回 mysql的自增主键,执行insert之前自动生成一个自增主键 通过mysql函数获取到刚插入记录的自增主键 LAST_INSERT_ID (当插入一个数据后,立即用这个函数就会返回刚加的主键:SELECT LAST_INSERT_ID()) 在刚刚的User.xml中这么写:
我们在刚刚的方法后面输出user的IDSELECT LAST_INSERT_ID() insert into user(username,birthday,sex,address) value(#{username},#{birthday,jdbcType=DATE},#{sex},#{address})
//插入用户对象User user=new User();user.setUsername("李云华");user.setBirthday(new Date());user.setSex("男");user.setAddress("云南大理");//通过SqlSession操作数据库//第一个参数:映射文件中的statement的Id,等于=namespace+"."+statement的Id//第二个参数:指定和映射文件所匹配的parameterType类型的参数//sqlSession.selectOne最终结果与你映射文件中所匹配的resultType类型sqlSession.insert("test.insertUser",user); //提交事务sqlSession.commit(); System.out.println(user.getId());结果:6 为啥能得到,就是在配置文件里设置了当insert完成之后就把id取出来存到user对象中 b.非自增主键的返回 使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位。 执行思路: 先通过uuid()查询到主键,将主键输入到sql语句中。 执行uuid()语句顺序相对于insert语句之前执行。 在刚刚的User.xml中这么写:
测试略 (3)删除和更新用户 映射文件User.xml中添加的语句:SELECT uuid() insert into user(id,birthday,sex,address) value(#{id},#{birthday,jdbcType=DATE},#{sex},#{address})如果使用的数据库是oracle那么通过oracle的序列生成主键写法:SELECT 序列名.nextval() insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday,jdbcType=DATE},#{sex},#{address})
测试代码: 删除测试代码:delete from user where id=#{id} update user set username=#{username},birthday=#{birthday,jdbcType=DATE},sex=#{sex},address=#{address} where id=#{id}
//删除用户 @Test public void deleteUserTest(){ //mybatis配置文件 String resource="SqlMapConfig.xml"; //将配置文件加载成流 InputStream inputStream; try { inputStream = Resources.getResourceAsStream(resource); //创建会话工厂,传入mybatis配置文件的信息 SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); //通过工厂得到sqlSession sqlSession=sqlSessionFactory.openSession(); //传入id删除用户 sqlSession.delete("test.deleteUser",6); //提交事务 sqlSession.commit(); } catch (IOException e) { e.printStackTrace(); }finally{ //释放资源 sqlSession.close(); } }测试结果:从数据库删除了id为6的数据 输出日志:
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.DEBUG [main] - PooledDataSource forcefully closed/removed all connections.DEBUG [main] - PooledDataSource forcefully closed/removed all connections.DEBUG [main] - PooledDataSource forcefully closed/removed all connections.DEBUG [main] - PooledDataSource forcefully closed/removed all connections.DEBUG [main] - Opening JDBC ConnectionDEBUG [main] - Created connection 30685694.DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@1d439fe]DEBUG [main] - ==> Preparing: delete from user where id=? DEBUG [main] - ==> Parameters: 6(Integer)DEBUG [main] - <== Updates: 1DEBUG [main] - Committing JDBC Connection [com.mysql.jdbc.Connection@1d439fe]DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.Connection@1d439fe]DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.Connection@1d439fe]DEBUG [main] - Returned connection 30685694 to pool.更新测试代码:
//更新用户 @Test public void updateUserTest(){ //mybatis配置文件 String resource="SqlMapConfig.xml"; //将配置文件加载成流 InputStream inputStream; try { inputStream = Resources.getResourceAsStream(resource); //创建会话工厂,传入mybatis配置文件的信息 SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); //通过工厂得到sqlSession sqlSession=sqlSessionFactory.openSession(); //更新用户信息(更改id=5的用户数据) User user=new User(); user.setId(5); user.setUsername("刘三姐"); user.setBirthday(new Date()); user.setSex("女"); user.setAddress("云南大理"); sqlSession.update("test.updateUser",user); //提交事务 sqlSession.commit(); } catch (IOException e) { e.printStackTrace(); }finally{ //释放资源 sqlSession.close(); } }测试结果: id=5的数据被更新 输出日志:
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.DEBUG [main] - PooledDataSource forcefully closed/removed all connections.DEBUG [main] - PooledDataSource forcefully closed/removed all connections.DEBUG [main] - PooledDataSource forcefully closed/removed all connections.DEBUG [main] - PooledDataSource forcefully closed/removed all connections.DEBUG [main] - Opening JDBC ConnectionDEBUG [main] - Created connection 30685694.DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@1d439fe]DEBUG [main] - ==> Preparing: update user set username=?,birthday=?,sex=?,address=? where id=? DEBUG [main] - ==> Parameters: 刘三姐(String), 2015-06-07(Date), 女(String), 云南大理(String), 5(Integer)DEBUG [main] - <== Updates: 1DEBUG [main] - Committing JDBC Connection [com.mysql.jdbc.Connection@1d439fe]DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.Connection@1d439fe]DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.Connection@1d439fe]DEBUG [main] - Returned connection 30685694 to pool.小结: a.parameterType 在映射文件中通过parameterType指定输入 参数的类型。 b.resultType 在映射文件中通过resultType指定输出结果的类型。 c.#{}和${} #{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。 如果接收简单类型,#{}中可以写成value或其它名称。 #{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。 ${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。 ${}接收输入参数,类型可以是简单类型,pojo、hashmap。 如果接收简单类型,${}中只能写成value。 ${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。 d.selectOne和selectList selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。 selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。 如果使用selectOne报错: org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4 最后来说说hibernate与mybatis,大家如果用过hibernate,刚学mybatis就会很疑惑,mybatis的执行效率并不比hibernate高多少,而且还要多写sql语句,为什么要用它呢?下面来看一下它们的区别,你就会明白mybatis的存在是有一定道理的 看看 mybatis和hibernate本质区别和应用场景: hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。 对sql语句进行优化、修改比较困难的。 应用场景: 适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。。 mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。 应用场景: 适用与需求变化较多的项目,比如:互联网项目。
企业进行技术选型,以低成本 高回报作为技术选型的原则,根据项目组的技术力量进行选择。
转载请注明出处: