Oracle:映射文件,jdbc,序列实现自动增长列,Log4j,SqlMap.xml,db.properties
内容概览:
映射文件
<sql></sql>的标签的作用的话我理解为"内嵌"内容的作用,或者是封装函数后调用,进而减少使用的代码
要注意的文件有UserinfoSqlMap.xml,db.properties,mybatis.xml
mybatis.xml中使用environment标签来设置MySQL和Oracle的配置,这样的话就是
可以要连哪个数据库就在调用时换相应的id的值就可以了(下面是只切换成一个数据库,其实也可以同时连接不同的几个数据库)。
作业
关于#{}和${}都可以代表?占位符这件事
关于session的调用方法
使用序列来实现自动增长列的效果
1、在mybatis项目中引入Log4j
2、在项目中同时引入oracle和mysql数据库,实现查询语句的切换
3、改进昨天作业中的新增方法,在oracle数据库和mysql数据库中处理自动增长的列
个人积累的注意事项:

<?xml version="1.0" encoding="UTF-8" ?>
的部分必须要写在第一行,不然会报错




要注意的文件有UserinfoSqlMap.xml,db.properties,mybatis.xml
mybatis.xml中使用environment标签来设置MySQL和Oracle的配置,这样的话就是
可以要连哪个数据库就在调用时换相应的id的值就可以了(下面是只切换成一个数据库,其实也可以同时连接不同的几个数据库)。





<sql></sql>的标签的作用的话我理解为"内嵌"内容的作用,或者是封装函数后调用,进而减少使用的代码



作业 START

package com.SSHC.bean;
public class Userinfo {
private Integer id;
private String act;
private String pwd;
private String birth;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAct() {
return act;
}
public void setAct(String act) {
this.act = act;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getBirth() {
return birth;
}
public void setBirth(String birth) {
this.birth = birth;
}
}

<?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">
<!-- -CTRL+F:sql标签的部分可以重复的使用
sql标签的部分可以重复的使用,
<?xml version="1.0" encoding="UTF-8" ?>
的部分必须要写在第一行,不然会报错 -->
<!-- namespace就是空间名,它必须在整个项目中都是唯一的 -->
<mapper namespace="com.SSHC.dao.UserinfoDao">
<!-- id必须是唯一的 -->
<!-- 创建一个List<Userinfo>集合,变量名叫rmUserinfo -->
<resultMap type="Userinfo" id="rmUserinfo">
<!-- userinfo表的主键是id -->
<!-- property指的是Userinfo类的属性名,
column指的是userinfo表的列名 -->
<!-- u.setId(rs.getInt("ID")) -->
<id property="id" column="ID" />
<!-- u.setAct(rs.getInt("ACT")) -->
<result property="act" column="ACT"/>
<result property="pwd" column="PWD"/>
<result property="birth" column="BIRTH"/>
</resultMap>
<!-- sql标签的部分可以重复的使用: -->
<sql id="whereCls">
where id = #{id}
</sql>
<!-- public List<Userinfo>selectAll() -->
<select id="selectAll" resultMap="rmUserinfo">
select * from userinfo
</select>
<!-- public Userinfo selectById(Integer id) -->
<!-- mybatis框架中,占位符?使用#{}来代替 -->
<select id="selectById" resultMap="rmUserinfo">
select * from userinfo <include refid="whereCls"></include>
</select>
<!-- public Integer add(Userinfo u) -->
<!-- 因为参数的类型是Userinfo,所以占位符中的字符串就必须是对应的属性名
(属性名区分大小写) -->
<insert id="add" parameterType="Userinfo">
insert into userinfo
values(seq_userinfo.nextval,
#{act},#{pwd},to_date(#{birth},'yyyy-mm-dd'))
</insert>
<!-- mysql的新增:keyProperty表示自动增长的列的列名叫什么: -->
<insert id="addMySQL" parameterType="Userinfo"
useGeneratedKeys="true" keyProperty="id">
insert into userinfo (act,pwd,birth)
values(#{act},#{pwd},#{birth})
</insert>
<!-- public Integer update(Userinfo u) -->
<update id="update" parameterType="Userinfo">
update userinfo set act = #{act},pwd = #{pwd},birth = to_date(#{birth},'yyyy-mm-dd')
<include refid="whereCls"></include>
</update>
<!-- public Integer deleteById(Integer id) -->
<delete id="deleteById">
delete from userinfo <include refid="whereCls"></include>
</delete>
</mapper>


/**
* CTRL+F:
*
* 因为使用了mybatis框架而不用写的JDBC的部分
*
* 个人对factory.openSession();,调用UserinfoSqlMap.xml中的方法
* */
package ZSGCtest;
import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
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 com.SSHC.bean.Userinfo;
public class Test {
public static void main(String[] args) {
/** 因为使用了mybatis框架而不用写的JDBC的部分 START*/
// TODO Auto-generated method stub
// String drivername = "oracle.jdbc.driver.OracleDriver";
// //oracle数据库的默认端口号1521
// //连接的数据库名字是orcl数据库
// String url = "jdbc:oracle:thin:@localhost:1521:orcl";
// String username = "j190802";
// String pwd = "orcl";
//
// Connection conn = null;
// PreparedStatement pstm = null;
// ResultSet rs = null;
//
// try {
// Class.forName(drivername);
// conn = DriverManager.getConnection(url,username,pwd);
// pstm = conn.prepareStatement("select * from userinfo where id = ?");
// pstm.setInt(1, 8);
// rs = pstm.executeQuery();
// List<Userinfo>rmUserinfo = new ArrayList<Userinfo>();
// while(rs.next()) {
// Userinfo u = new Userinfo();
// //ID是userinfo表的主键
// u.setId(rs.getInt("ID"));
// u.setAct(rs.getString("ACT"));
// System.out.println(rs.getString("ACT"));
// u.setPwd(rs.getString("PWD"));
// u.setBirth(rs.getString("BIRTH"));
// rmUserinfo.add(u);
// }
//
/*String sql = "insert into userinfo
* values(?,?,?,to_date(?,'yyyy-mm-dd'))";
*/
// pstm = conn.prepareStatement(sql);
// Userinfo u = new Userinfo();
// u.setId(11);
// u.setAct("haha");
// u.setPwd("09876");
// u.setBirth("2000-7-3");
// pstm.setInt(1, u.getId());
// pstm.setString(2, u.getAct());
// pstm.setString(3, u.getPwd());
// pstm.setString(4, u.getBirth());
// int count = pstm.executeUpdate();
// System.out.println(count);
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } finally {
// try {
// if(rs != null) {
// rs.close();
// }
// if(pstm != null) {
// pstm.close();
// }
// if(conn != null) {
// conn.close();
// }
// } catch(Exception e) {
// e.printStackTrace();
// }
// }
/** 因为使用了mybatis框架而不用写的JDBC的部分 END*/
//获取主配置文件的路径为mybatis.xml,所以设置path为这个值:
String path = "mybatis.xml";
//使用Reader来读取mybatis.xml中的配置信息,
// 就是读取四大连接字符串的内容:
Reader config;
try {
//用SqlSessionFactory选择mysqlConf或oracleConf:
config = Resources.getResourceAsReader(path);
SqlSessionFactory factory =
new SqlSessionFactoryBuilder().build(config,"oracleConf");
/*
* 个人对factory.openSession();,
* 调用UserinfoSqlMap.xml中的方法 START
*
* 声明一个SqlSession类型的数据库的操作对象session
个人理解为factory.openSession();“打开”session,
类似于打开了一个大门,像下面的提交事务(session.commit();)
,调用UserinfoSqlMap.xml中的方法(比如session.selectList(exePath);)
等等就是类似于提交这件事
走进了这个大门。
个人对factory.openSession();,调用UserinfoSqlMap.xml中的方法 END*/
SqlSession session = factory.openSession();
/*使用session.selectList(exePath)
,也就是factory.openSession().selectList(exePath)
来调用UserinfoSqlMap.xml中声明的selectAll方法*/
/*执行路径就是映射文件的
* 【namespace属性的自己命名的值+'.'+id的自己命名的值】
* 比如com.SSHC.dao.UserinfoDao.selectAll
* 中:namespace属性的自己命名的值=com.SSHC.dao.UserinfoDao
* id的自己命名的值=selectAll
* */
while(true){
System.out.print("请选择操作:1.selectAll "
+ ",2.selectById,"
+ "3.add,\n"
+ "4.update,"
+ "5.deleteById 6.addMySQL(这里的addMySQL"
+ "是对应MySQL时的方法)"
+ "");
/**
* \n就是换行的符号*/
Scanner input = new Scanner(System.in);
int num = input.nextInt();
System.out.println(num);
if(num==1){
String exePath = null;
exePath = "com.SSHC.dao.UserinfoDao.selectAll";
List<Userinfo>list = session.selectList(exePath);
for(Userinfo u : list) {
System.out.println(u.getAct());
}}
if(num==2){
String exePath = null;
exePath = "com.SSHC.dao.UserinfoDao.selectById";
Userinfo u = session.selectOne(exePath,1);
System.out.println(u.getAct());
}
if(num==3){
String exePath = null;
exePath = "com.SSHC.dao.UserinfoDao.add";
Userinfo u = new Userinfo();
u.setAct("诗书画唱");
u.setPwd("666");
u.setBirth("2006-6-26");
Integer count = session.update(exePath,u);
session.commit();
System.out.println(count);
}
if(num==6){
String exePath = null;
exePath = "com.SSHC.dao.UserinfoDao.addMySQL";
Userinfo u = new Userinfo();
u.setAct("三连关注");
u.setPwd("111");
u.setBirth("2002-02-22");
Integer count = session.update(exePath,u);
session.commit();
System.out.println(count);
}
if(num==4){
String exePath = null;
Userinfo u = new Userinfo();
u.setId(1);
u.setAct("测试账号");
u.setPwd("66666");
u.setBirth("1999-12-29");
exePath = "com.SSHC.dao.UserinfoDao.update";
Integer count = session.update(exePath,u);
session.commit();
System.out.println(count);
}
if(num==5){
String exePath = null;
exePath = "com.SSHC.dao.UserinfoDao.deleteById";
Integer count = session.delete(exePath,5);
//新增修改和删除一定记得提交事务
session.commit();
System.out.println(count);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


oracle_drivername=oracle.jdbc.driver.OracleDriver
oracle_url=jdbc:oracle:thin:@localhost:1521:orcl
oracle_username=X
oracle_password=sshcPwd
mysql_drivername=com.mysql.jdbc.Driver
mysql_url=jdbc:mysql://localhost:3306/mybatisJava3?useUnicode=true&characterEncoding=GBK2312
mysql_username=firstjsp
mysql_password=1
sqlserver_drivername=com.microsoft.sqlserver.jdbc.SQLServerDriver
sqlserver_url=jdbc:sqlserver://localhost:1433;databaseName=cervs
sqlserver_username=sa
sqlserver_password=1

log4j.rootLogger=DEBUG,Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d[%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 读取指定的properties文件中的内容 -->
<properties resource="db.properties"></properties>
<!-- 给类取一个简短的别名 -->
<typeAliases>
<typeAlias type="com.SSHC.bean.Userinfo" alias="Userinfo"/>
</typeAliases>
<environments default="oracleConf">
<!-- oracle配置 -->
<environment id="oracleConf">
<transactionManager type="JDBC">
<property name="closeConnection" value="false"/>
</transactionManager>
<!-- 配置数据源 -->
<dataSource type="POOLED">
<property name="driver" value="${oracle_drivername}"/>
<property name="url" value="${oracle_url}"/>
<property name="username" value="${oracle_username}"/>
<property name="password" value="${oracle_password}"/>
</dataSource>
</environment>
<!-- mysql配置 -->
<environment id="mysqlConf">
<!-- 事务配置 -->
<transactionManager type="JDBC">
<property name="closeConnection" value="false"/>
</transactionManager>
<!-- 配置数据源 -->
<dataSource type="POOLED">
<property name="driver" value="${mysql_drivername}"/>
<property name="url" value="${mysql_url}"/>
<property name="username" value="${mysql_username}"/>
<property name="password" value="${mysql_password}"/>
</dataSource>
</environment>
</environments>
<!-- 实体映射文件集合 -->
<mappers>
<!-- 告诉mybatis框架,映射文件放在什么地方 -->
<mapper resource="com/SSHC/bean/UserinfoSqlMap.xml"/>
</mappers>
</configuration>


作业 END
个人的理解记录 START
关于#{}和${}都可以代表?占位符这件事。

关于session的调用方法。


使用序列来实现自动增长列的效果。

个人的理解记录 END
映射文件 START














映射文件 END
讲义 START
在mybatis框架中,分为三种配置文件:
主配置文件:mybatis.xml,每个项目中只有一个
映射文件:XXXXSqlmap.xml,每个项目中可以有无数个,你的项目中有几个表,映射文件就有几个
可以看成使用xml文件写的dao类
properties文件:在项目中一般用来存放数据库连接字符串
"在映射文件中,到处都有com.jy.bean.Userinfo,这个字符串太长了,我可以通过typeAliases给
这个字符串取一个别名来缩短它"
Mybatis框架可以切换数据库:
实现在oracle数据库和mysql数据库之间的切换
1、通过environments标签的default属性切换
2、java代码
数据库连接池:Connection对象
主键处理:
1、oracle的主键处理
