发表于: 2016-10-22 20:43:50

2 2533


今天完成的事情:重新看了一下最新版的mybatis官方文档,解决了一些疑惑。

明天计划的事情;继续做任务3

遇到的问题:

1.

一定要订一套代码规范,不然开发到一半了,发现项目中集合了各种各样的代码,每个人的命名方式不一致,看起来乱七八糟的

2.

碰到多个模块通用的功能,查询语句里的id不要简写,一定要做些区分,不然以后使用的时候会分不清楚

3.

关于jdbcType

在查看mybatis文档的时候,提到了jdbcType


可以通过两种方式来指定被关联的 JDBC 类型:


在类型处理器的配置元素上增加一个 jdbcType 属性(比如:jdbcType="VARCHAR");

在类型处理器的类上(TypeHandler class)增加一个 @MappedJdbcTypes 注解来指定与其关联的 JDBC 类型列表。

 如果在 jdbcType 属性中也同时指定,则注解方式将被忽略。



在insert update delete select语句中使用

#{property,javaType=int,jdbcType=NUMERIC}

javaType指的是实体类对应属性的类型,jdbcType指的是数据库对应的类型


resultMap 中的javaType


一个 Java 类的完全限定名,或一个类型别名(参考上面内建类型别名 的列表) 。如果你映射到一个 JavaBean,MyBatis 通常可以断定类型。

 然而,如果你映射到的是 HashMap,那么你应该明确地指定 javaType 来保证所需的行为。


jdbcType


在这个表格之后的所支持的 JDBC 类型列表中的类型。JDBC 类型是仅仅需要对插入,更新和删除操作可能为空的列进行处理。

这是 JDBC jdbcType 的需要,而不是 MyBatis 的。如果你直接使用 JDBC 编程,你需要指定 这个类型-但仅仅对可能为空的值。


也就是说,在使用resultMap时候并不需要规定jdbcType,我自己专门试验了一下,也的确如此



4.

事物


数据库事务是指单个逻辑工作单元执行的一系列操作,要么完全执行,要么完全不执行,事务处理可以保证除非事务性单元内的所有

操作都成功完成,否则不会永久更新面向数据的资源。


ACID属性:原子性、一致性、隔离性、持久性


原子性:要么全都执行,要么全都不执行,典型例子是转账


下面这篇百度知道解释了一下原子性和一致性

http://zhidao.baidu.com/link?url=npxYnClmjMyZVCugrgnxFRI2IEqYmMePU_HfMOeXB3WpalkFpkPNQSbEDcKF06EuhT9URzjDIw4aKusUvVECZvIkXuarCSzpW1xp4Z8u6P3

还有知乎上的这个问题

https://www.zhihu.com/question/30272728

这两个内容差不多


一致性:指的是数据处于一种有意义的状态,这里的有意义我理解为,经过一系列操作之后,这些数据仍然是可以使用的,正确的,


隔离性:在并发情况下,多个事务并发执行后的状态,和它们串行执行后的状态是等价的。


5.

jdbc


jdbc如何工作


http://m.blog.csdn.net/article/details?id=50988796

http://www.2cto.com/database/201406/308225.html


通过JDBC操作数据库——步骤:


第1步:加载驱动 (只做一次) 为了操作不同版本不同厂家的关系型数据库,通过驱动识别使用什么厂商什么版本的数据库 


jdbc驱动程序有四类


第一类JDBC驱动程序是JDBC-ODBC桥再加上一个ODBC驱动程序。这类驱动一般不用现在的编程应用中。

第二类JDBC驱动程序是部分JAVAAPI代码的驱动程序,用于把JDBC调用转换成主流数据库API的本机调用。

第三类JDBC驱动程序是面向数据库中间件的纯JAVA驱动程序,JDBC调用被转换成一种中间件厂商的协议,中间件再把这些调用转换到

数据库API。

第四类JDBC驱动程序是直接面向数据库的纯JAVA驱动程序。是使用JDBC驱动程序访问数据库的首选方式


jdbc中注册驱动,首先导入对应的包,例如MySQL-connector-Java-5.0.8-bin.jar。驱动包是java和具体数据库之间的连接桥梁,

由数据库厂商开发。每一种数据库对应一款驱动jar,甚至每一个版本的数据库都有自己对应版本的驱动jar。 



加载驱动的方式有三种:

一)DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 

二)System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver"); 

三)Class.forName("com.mysql.jdbc.Driver");


学习的时候一般使用第三种方式

把com.mysql.jdbc.Driver.class这个类装载进去,但是关键就在于,在这个类中,有个静态代码块

static{ 

       try{ 

           java.sql.DriverManager.registerDriver(new Driver()); 

       }catch(SQLException e){ 

  throw new RuntimeException("can't register driver!"); 

      } 

}

这里注册了驱动, 


下面这篇blog解释了加载驱动的三种方式

http://blog.csdn.net/yanwushu/article/details/7574708


Class.forName()方法

http://blog.csdn.net/yanwushu/article/details/7574713


这里涉及到jvm和java类的声明周期

http://www.yanwushu.com/post/54.html


类的生命周期从加载、连接和初始化开始。并且严格按照如下步骤进行:


1. 加载:查找,并且加载类的二进制数据

2. 连接

1. 验证:确保类被正确加载

2. 准备:为类的静态变量分配内存,并且初始化为默认值

3. 解析:把类中的符号引用转化为直接引用

3. 初始化:为类的静态变量赋予正确的初始值。


Class类用来描述一个类的结构,比如描述一个类有哪些成员,有哪些方法等。


//第一种方式获取描述Dog类结构的Class类实例  

Class<Dog> clazz = Dog.class;  

//第二种方式  

Dog d = new Dog();  

Class<Dog> clazz = d.getClass();  


当使用一个类的时候(比如new一个类的实例),jvm会检查此类是否被加载到内存,如果没有,则会执行加载操作。

Java也提供了手动加载类的接口,class.forName()方法就是其中之一。

Class.forName()方法的含义是:加载参数指定的类,并且初始化它。


第2步:建立连接(Connection)


这里使用了DriverManager,他不但可以创建驱动,还可以根据指定的url创建Connection链接


第3步:创建执行SQL的语句(Statement)

第4步:执行语句

第5步:处理执行结果(ResultSet)

第6步:释放资源


6.

mybatis与jdbc的关系

 

http://chenjc-it.iteye.com/blog/1455688


这篇blog涉及到了数据库链接池


由于数据库连接频繁的开启和关闭本身就造成了资源的浪费,影响系统的性能。


数据库连接的获取和关闭我们可以使用数据库连接池来解决资源浪费的问题。通过连接池就可以反复利用已经建立的连接去访

问数据库了。减少连接的开启和关闭的时间。


7.

关于resultMap – 文档解释为用来描述如何从数据库结果集中来加载对象。


8.

mybatis如何防止sql注入


<select id="selectPerson" parameterType="int" resultType="hashmap">

  SELECT * FROM PERSON WHERE ID = #{id}

</select>


#{id}

这就告诉 MyBatis 创建一个预处理语句参数,通过 JDBC,这样的一个参数在 SQL 中会由一个“?”来标识,并被传递到一个新

的预处理语句中,

通过预处理语句,就可以防止sql注入问题

${1d}则不会被预处理,无法防止sql注入


9.

最新的mybatis3.4.1,

<sql></sql>元素可以使用参数,参数可以用于包含的refid属性或者包含的字句里面的属性值

先定义sql元素

<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>

在不同的语句中使用

<select id="selectUsers" resultType="map">

  select

    <include refid="userColumns"><property name="alias" value="t1"/></include>,

    <include refid="userColumns"><property name="alias" value="t2"/></include>

  from some_table t1

    cross join some_table t2

</select>


返回列表 返回列表
评论

    分享到