目录
-
配置文件
DTD在页面中的作用
①DTD(Document Type Definition文档类型定义)是一组机器可读的规则,它们定义XML或HTML的特定版本中允许有什么,不允许有什么。在解析网页时,浏览器将使用这些规则检查页面的有效性并且采取相应的措施。(由DTD中定义的文档类型影响)
②DTD是对HTML文档声明,还会影响浏览器的渲染模式(工作模式)。(由页面中书写DTD的方式影响)
-
文件载入的方法
1. 直接用IO流读取
使用绝对路径:File f = new File("C:/test/com/aleixa/config/sys.properties");
使用相对路径:File f = new File("com/alexia/config/sys.properties");
InputStream is = new FileInputStream(f);
2. 使用ClassLoader
InputStream is = null; //相对路径
方法1:is = this.getClass().getClassLoader().getResourceAsStream("com/alexia/config/sys.properties");
方法2:is = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/alexia/config/sys.properties");
方法3:is = ClassLoader.getSystemResourceAsStream("com/alexia/config/sys.properties");
3. 使用ResourceBundle
ResourceBundle bundle = ResourceBundle.getBoundle("com.alexia.config.sys"); //资源捆绑
-
载入XML文件,获取SqlSession的方法
1
使用io读取
// 1. 加载MyBatis的配置文件:mybatis.xml(它也加载关联的映射文件,也就是mappers结点下的映射文件)
InputStream in = this.getClass().getClassLoader().getResourceAsStream("mybatis.xml");
// 2. SqlSessionFactoryBuidler实例将通过输入流调用build方法来构建 SqlSession 工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
// 3. 通过工厂获取 SqlSession 实例,SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。
SqlSession session = sqlSessionFactory.openSession();2
使用reader读取
Reader reader = Resources.getResourceAsReader("Configuration.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = sqlSessionFactory.openSession();
其中第一行代码在类路径上加载配置文件,Resources 是 MyBatis 提供的一个工具类,它用于简化资源文件的加载,它可以访问各种路径的文件,不过最常用的还是示例中这种基于类路径的表示方式
-
XML文件
XML中,
首行是版本和encoding,
随后dtd是书写xml的规范,
接着是环境信息:开头<environments default="mysql_developer"> ;结尾:</environments>
1、XXX.xml文件主要存放连接相关的信息,以及Mapper.xml的信息
<?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 resource="db.properties"/>--> <!-- 设置一个默认的连接环境信息 --> <environments default="mysql_developer"> <!-- 连接环境信息,取一个任意唯一的名字 --> <environment id="mysql_developer"> <!-- mybatis使用jdbc事务管理方式 --> <transactionManager type="jdbc"/> <!-- mybatis使用连接池方式来获取连接 --> <dataSource type="pooled"> <!-- 配置与数据库交互的4个必要属性 --> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://10.20.127.83:5002/csc_pacific?characterEncoding=UTF-8"/> <property name="username" value="csc_pacific"/> <property name="password" value="csc_pacific"/> </dataSource> </environment> </environments> <mappers> <!-- SQL代码和映射信息配置文件 --> <mapper resource="student/StudentMapper.xml"/> </mappers> </configuration>
2、Mapper.xml文件中
对数据表的操作,注意参数和返回值,参数不可以是表名,数据项名称等
<?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必须是唯一的,建议用该文件所在的包路径全类名 --> <mapper namespace="book.BookMapper"> <!-- resultMap标签:映射实体与表 type属性:表示实体全路径名 id属性:为实体与表的映射取一个任意的唯一的名字 --> <resultMap type="book.Book" id="bookMap"> <!-- id标签:映射主键属性 result标签:映射非主键属性 property属性:实体的属性名 column属性:表的字段名 --> <id property="id" column="id"/> <result property="name" column="name"/> <result property="year" column="year"/> <result property="version" column="version"/> <result property="category" column="category"/> </resultMap> <insert id="add" parameterType="book.Book"> INSERT INTO students (ID, NAME, SAL) VALUES (#{id},#{name},#{sal}); </insert> <select id="getBook" parameterType="int" resultType="book.Book"> <!-- #{id}:表示占位符,也就是调用时必须为其传一个id参数进来,注意是#不是$ --> select * from students where id = #{id} </select> <delete id="getBook" parameterType="int"> delete from students where id = #{id} </delete> <select id="getAll" resultType="book.Book"> <!-- #{id}:表示占位符,也就是调用时必须为其传一个id参数进来,注意是#不是$ --> select * from book </select> </mapper>
-
在全局配置文件中可以配置的信息主要包括如下几个方面:
-
properties --- 用于提供一系列的键值对组成的属性信息,该属性信息可以用于整个配置文件中。
-
settings --- 用于设置 MyBatis 的运行时方式,比如是否启用延迟加载等。
-
typeAliases --- 为 Java 类型指定别名,可以在 XML 文件中用别名取代 Java 类的全限定名。
-
typeHandlers --- 在 MyBatis 通过 PreparedStatement 为占位符设置值,或者从 ResultSet 取出值时,特定类型的类型处理器会被执行。
-
objectFactory --- MyBatis 通过 ObjectFactory 来创建结果对象。可以通过继承 DefaultObjectFactory 来实现自己的 ObjectFactory 类。
-
plugins --- 用于配置一系列拦截器,用于拦截映射 SQL 语句的执行。可以通过实现 Interceptor 接口来实现自己的拦截器。
-
environments --- 用于配置数据源信息,包括连接池、事务属性等。
-
mappers --- 程序中所有用到的 SQL 映射文件都在这里列出,这些映射 SQL 都被 MyBatis 管理。
-
-
获取连接对象的两种方法
1、调用接口:SqlSession sqlSession = MybatisUtil.getSqlSession();
package student; import java.io.IOException; import java.io.Reader; import java.sql.Connection; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; /** * 工具类 * @author AdminTC */ public class MybatisUtil { private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); private static SqlSessionFactory sqlSessionFactory; /** * 加载位于src/mybatis.xml配置文件 */ static{ try { Reader reader = Resources.getResourceAsReader("mybatis.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } } /** * 禁止外界通过new方法创建 */ private MybatisUtil(){} /** * 获取SqlSession */ public static SqlSession getSqlSession(){ //从当前线程中获取SqlSession对象 SqlSession sqlSession = threadLocal.get(); //如果SqlSession对象为空 if(sqlSession == null){ //在SqlSessionFactory非空的情况下,获取SqlSession对象 sqlSession = sqlSessionFactory.openSession(); //将SqlSession对象与当前线程绑定在一起 threadLocal.set(sqlSession); } //返回SqlSession对象 return sqlSession; } /** * 关闭SqlSession与当前线程分开 */ public static void closeSqlSession(){ //从当前线程中获取SqlSession对象 SqlSession sqlSession = threadLocal.get(); //如果SqlSession对象非空 if(sqlSession != null){ //关闭SqlSession对象 sqlSession.close(); //分开当前线程与SqlSession对象的关系,目的是让GC尽早回收 threadLocal.remove(); } } // /** // * 测试 // */ // public static void main(String[] args) { // Connection conn = MybatisUtil.getSqlSession().getConnection(); // System.out.println(conn!=null?"连接成功":"连接失败"); // } }
2、通过io加载MyBatis的配置文件,构建 SqlSession 工厂
// 1. 加载MyBatis的配置文件:mybatis.xml(它也加载关联的映射文件,也就是mappers结点下的映射文件) InputStream in = this.getClass().getClassLoader().getResourceAsStream("mybatis.xml"); // 2. SqlSessionFactoryBuidler实例将通过输入流调用build方法来构建 SqlSession 工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); // 3. 通过工厂获取 SqlSession 实例,SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。 SqlSession session = sqlSessionFactory.openSession(); // 4. 准备基本信息 // 4.1) statement: 用来定位映射文件(StudentMapper.xml)中的语句(通过namespace id + select id) String statement = "student.StudentMapper.getAll"; // 4.2) paramter: 传进去的参数,也就是需要获取students表中主键值为1的记录 String string = "id"; // 5. SqlSession 实例来直接执行已映射的 SQL 语句,selectOne表示获取的是一条记录 Map<Object, Object> map = session.selectMap(statement, string);
-
SqlSession的方法:SqlSession session(自查)
-
-
ibatis和mybatis的区别
1
namespace在ibatis中不是必须的
<?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">
<mapper namespace="XXX.xxxxMapper">
<select id="selectUser" parameterType="int"
resultType="mybatis.demo.UserInfo">
select * from UserInfo where userid =#{userid}
</select>
</mapper>
2
两个版本的 DTD 约束不同
1、iBatis 配置文件的根元素是 <sqlMapConfig>,
2、MyBatis 使用的是 <configuration>
3
<settings> 的用法发生了改变
1、iBatis 中设置属性的方式:
<settings props1="value1" props2="value2"… />
2、MyBatis 中设置属性的方式:<settings>
<setting name="props1" value="value1"/>
<setting name="props2" value="value2"/>
……
</settings>
4
配置事务管理器和数据源的方式
1、iBatis 中配置事务管理器和数据源的方式
<transactionManager type="JDBC" >
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="${driver}"/>
<!-- 其他数据源信息省略 -->
</dataSource>
</transactionManager>
2、MyBatis 中配置事务管理器和数据源的方式:<environments default="demo">
<environment id="demo">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="JDBC.Driver" value="${driver}"/>
<!-- 其他数据源信息省略 -->
</dataSource>
</environment>
</environments>
5
指定映射文件的方式
1、iBatis 中指定映射文件的方式:
<sqlMap resource=... />
<sqlMap resource=... />
<sqlMap resource=... />
2、MyBatis 中指定映射文件的方式
<mappers>
<mapper resource=... />
<mapper resource=... />
</mappers>
6
MyBatis 中使用代码进行配置
DataSource ds = …… // 获取一个 DataSource
TransactionFactory txFactory = new JdbcTransactionFactory();
Environment env = new Environment("demo", txFactory, ds);
Configuration cfg = new Configuration(env);
cfg.addMapper(UserInfoMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(cfg);
7
映射文件,首先是一系列的属性名称的改变,这些仅仅是名称的改变,用法和含义并没有发生变化:
-
和全局配置文件一样,由于 DTD 约束发生变化,根元素也由原来的 <sqlMap> 调整为 <mapper>。
-
<select> 等元素的 parameterClass 属性改为了 parameterType 属性。
-
<select> 等元素的 resultClasss 属性改为了 resultType 属性。
-
<parameterMap> 等元素的 class 属性改为了 type 属性。
-
<result> 元素的 columnIndex 属性被移除了。
-
嵌套参数由 #value# 改为了 #{value}。
-
<parameter> 等元素的 jdbcType 属性取值中,原来的 "ORACLECURSOR" 取值改为了现在的 "CURSOR","NUMBER" 取值改为了 "NUMERIC"。
8
存储过程的定义
1、iBatis 中调用存储过程的方式:
<procedure id="getValues" parameterMap="getValuesPM">
{ ? = call pkgExample.getValues(p_id => ?) }
</procedure>
2、MyBatis 中调用存储过程的方式:(在 MyBatis 中,<proccedure> 元素已经被移除,通过 <select>、<insert> 和 <update> 进行定义)
<select id="getValues" parameterMap="getValuesPM" statementType="CALLABLE">
{ ? = call pkgExample.getValues(p_id => ?)}
</select>
-