注意:增删改操作需要控制事务,否则操作不会同步到数据库
//事务控制 SqlSession sqlSession = sqlSessionFactory.openSession();// 随着session获得,事务会自动开启 .... //数据操作 .... //数据操作 sqlSession.commit();//提交事务 sqlSession.rollback();//回滚事务增删改操作
try{ .... userDAO.updateUser(user);//除了需要控制事务之外,和查询操作使用无异 /**User u = new User(...); userDAO.insertUser(u);**/ /**userDAO.deleteUser(1)**/ sqlSession.commit();//提交事务 }catch(Exception e){ e.printStackTrace(); sqlSession.rollback();//回滚事务 }finally{ if(sqlSession!=null){ sqlSession.close();//回收资源 } } 3.4 增加细节ID缺失!
User user = new User("zhj",true,new Date());//此时user没有id userDAO.insertUser(user); sqlSession.commit();//此时数据已经插入到数据库中,数据库中有id,但user依然没有id System.out.println(user.getId());//没有id //则无法得知插入的数据是哪一条,如果后续程序需要此id,则出现bug!两种解决方案:
1> selectKey标签
2> useGenerateKeys 和 keyProperty属性
<insert parameterType="com.zhj.domain.User"> <!-- AFTER:此中语句在插入语句之后执行 resultType=“int”: 此中语句执行后的返回类型是 int keyProperty="id": 此中语句返回值要 传递给当前方法参数中的id属性 (com.zhj.domain.User的id属性) select last_insert_id():mysql特性语句,返回当前事务中,最近一次插入的数据的id--> <selectKey resultType="int" keyProperty="id" order="AFTER"> select last_insert_id() </selectKey> insert into t_user (name,gender,create_time) values(#{name},#{gender},#{createTime}) </insert> <!-- useGeneratedKeys="true" 声明此处添加中id用的是自动增长 keyProperty="id" 将id值 传递给当前方法的参数中的id属性 (com.zhj.domain.User的id属性)--> <insert parameterType="com.zhj.domain.User" useGeneratedKeys="true" keyProperty="id"> insert into t_user (name,gender,create_time) values(#{name},#{gender},#{createTime}) </insert> 三、别名在mapper文件中,parameterType 和 resultType中使用类型时:
<select parameterType="com.zhj.domain.Page" resultType="com.zhj.domain.User">
除mybatis自动映射的类型外,其他类型都要定义完整路径,相对繁琐。可用如下两种方式简化:
// configuration.xml <configuration> ... <typeAliases> <!-- 1. 单独为每个类定义别名,则 "Page"等价于"com.zhj.domain.Page" <typeAlias type="com.zhj.domain.Page" alias="Page"/> <typeAlias type="com.zhj.domain.User" alias="User"/>--> <!-- 2. 定义缺省包,当mapper中的类型没有定义包时,使用此配置作为默认包; 则 “Page” 会自动认为是 “com.zhj.domain”中的“Page”,即“com.zhj.domain.Page” 则 “User” 会自动认为是 “com.zhj.domain”中的“User”,即“com.zhj.domain.User”--> <package/> </typeAliases> ... </configuration>有如上别名配置后,mapper中:
<select parameterType="Page" resultType="User">
四、参数分离在mybatis的配置文件中有一项重要且可能需要经常改动的配置,即,数据库连接参数。
可以单独进行管理,方便后续维护。
<!-- 如下四项参数 --> <dataSource type="POOLED"> <property value="com.mysql.jdbc.Driver" /> <property value="jdbc:mysql://localhost:3306/db9?useUnicode=true&characterEncoding=utf8"/> <property value="root" /> <property value="111111" /> </dataSource> 1. 单独定义参数文件 # 在resources目录下,创建 jdbc.properties文件 # 参数名=参数值 jdbc.user=root jdbc.password=111111 jdbc.url=jdbc:mysql://localhost:3306/db9?useUnicode=true&characterEncoding=utf8 jdbc.driver=com.mysql.jdbc.Driver 2. 加载参数文件 // 在 configuration.xml中 <configuration> <!-- 加载参数文件 --> <properties resource="jdbc.properties"></properties> .... .... <environments default="development"> <environment> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <!-- 使用 ${参数名} 获取参数文件中的值。如此这四项参数需要修改时,需要改动参数文件即可 --> <property value="${jdbc.driver}" /> <property value="${jdbc.url}" /> <property value="${jdbc.user}" /> <property value="${jdbc.password}" /> </dataSource> </environment> </environments> 五、关联关系项目中的表都不是孤立的,会彼此关联。在操作数据时,需要联合多张表。
我们需要将表间的关系映射清楚,mybatis可以提供很好的多表联合操作支持,比如: