1.1 数据库环境切换****
1.1.1 切换 environment****
**** * ** ** <property name="driver" value="oracle.driver"/> <propertyname="url" value="{oracle.driver}" /> <property name="url" value="oracle.driver"/> <propertyname="url" value="{oracle.url}" /> ** *** <property name="driver" value="mysql.driver"/> <propertyname="url" value="{mysql.driver}" /> <property name="url" value="mysql.driver"/> <propertyname="url" value="{mysql.url}" />
数据库文件db.properties:****
#oracle* oracle.driver=oracle.jdbc.OracleDriver oracle.url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL oracle.username=scott oracle.password=tiger #mysql *mysql.driver=com.mysql.jdbc.Driver mysql.url=jdbc:mysql://localhost:3306/mydb mysql.username=root mysql.password=root
1.1.2 配置 Provider别名****
*
***
1.1.3 写不同数据库的SQL语句****
大部分相同,只是有个别不同****
1.1.4 在mappe.xml中配置databaseId="Provider别名"****
1、oracle****
* *<select id="queryStudentByNoWithONGL" parameterType="student" resultType="student" databaseId="oracle">
2、Mysql****
<insert id="addStudent" parameterType="com.yanqun.entity.Student" databaseId="mysql">
如果mapper.xml的 sql标签 仅有 一个 不带databaseId的标签,则改标签 会自动适应当前数据库。
如果 既有不带databaseId的标签,又有带databaseId的标签,则程序会优先使用带databaseId的标签
1.2 注解方式(推荐使用xml)****
a.将sql语句写在接口的方法上@Select("") ;
b.将接口的全类名 写入,让mybatis知道sql语句此时是存储在接口中
注解/xml都支持批量引入,
1.3 增删改的返回值问题****
返回值可以是void、Integer、Long、Boolean
如何操作:只需要在接口中 修改返回值即可
public abstract Integer addStudent(Student student);
1.4事务自动提交****
手动提交:
sessionFactory.openSession(); session.commit();
自动提交:每个dml语句 自动提交
sessionFactory.openSession(true); SqlSession session = sessionFacotry.openSession(true) ;
1.5 自增问题****
1.5.1 mysql****
mysql支持自增
只需要配置两个属性即可:、
之前设置数据库的递增
useGeneratedKeys="true" keyProperty="stuNo" <insert id="addStudent" parameterType="com.yanqun.entity.Student" databaseId="mysql" useGeneratedKeys="true" keyProperty="stuNo"> insert into student(stuName,stuAge,graName) values(#{stuName},#{stuAge},#{graName}) create table student ( stuno int(4) primary key auto_increment, stuname varchar(10), stuage int(4), graname varchar(10) ); <insert id="addStudent" parameterType="com.yanqun.entity.Student" databaseId="mysql"> insert into student(stuNo,stuName,stuAge,graName) values(#{stuNo} , #{stuName},#{stuAge},#{graName})
1.5.2 oracle****
oracle不支持自增 :通过序列模拟实现
方式一:before(推荐)
create sequence myseq increment by 1 start with 1;
通过 的字标签 实现:
在 中查询下一个序列(自增后的值),再将此值传入keyProperty="stuNo"属性,最后在真正执行时 使用该属性值。
方式二:after
序列自带的两个属性:
nextval:序列中下一个值
currval: 当前值
方法一:****
<insert id="addStudent" parameterType="com.yanqun.entity.Student" databaseId="oracle"> select myseq.nextval from dual insert into student(stuno,stuName,stuAge,graName) values(#{stuNo} , #{stuName},#{stuAge},#{graName})
方法二:
<insert id="addStudent" parameterType="com.yanqun.entity.Student" databaseId="oracle"> select myseq.currval from dual insert into student(stuno,stuName,stuAge,graName) values(myseq.nextval , #{stuName},#{stuAge},#{graName})
1.6 参数问题****
目前 将多个参数封装到一个javabean对象(pojo),然后使用该对象传递
1.6.1传入多个参数时,不用在mapper.xml中编写parameterType****
异常提示:
stuNo不能使用。可以使用的是: [arg3, arg2, arg1, arg0, param3, param4, param1, param2] <insert ...> insert into student(stuno,stuName,stuAge,graName) values(#{arg0} , #{arg1},#{arg2},#{arg3})
1.6.2命名参数****
可以在接口中通过@Param("sNo") 指定sql中参数的名字
public abstract Integer addStudent(@Param("sNo") Integer stuNo, public abstract Integer addStudent(@Param("sNo") Integer stuNo, @Param("sName")String stuName, @Param("sAge")Integer stuAge, @Param("gName")String graName); <insert...> insert into student(stuno,...) values(#{sNo}, ...)
1.6.3综合使用****
Integer addStudent(@Param("sNo")Integer stuNo, @Param("stu")Student student); public abstract Integer addStudent(@Param("sNo")Integer stuNo, @Param("stu")Student student); <insert id="addStudent" databaseId="oracle"> insert into student(stuno,stuName,stuAge,graName) values(#{sNo} , #{stu.stuName},#{stu.stuAge},#{stu.graName})