发表于: 2018-03-21 23:33:59
1 821
编写Dao通过Mybatis框架实现与数据库的链接
1.在做配置文件之前先创建实体类,注意该实体类的类名尽量与数据中的表名对应,实体类中的属性与表中的表段名一一对应。例如表中student中有id、name、age三个表段,就可以在main/src下生成新的pojo package,文件中新建实体类Student(从今天开始要注意项目中文件的分类和类名的大写,之前一直没有注意这些细节,导致看起来很乱,今天用mybatis框架弄完之后把之前写的东西全删了准备重新写一遍规范形式的对数据库的操作)
public class Student {
private int id;
private String name;
private int age;
定义3个属性之后可以用IDEA中generate自动生成getter和setter(之前一直不知道可以自己生成,然后自己打来打去花费了太多时间)
另外需要注意的是实体类中的属性应用private修饰,应该对实体类提供一个无参构造方法和一个有参构造方法(网上的解释没看懂,不构造这两个方法测试也能通过)
public Student(int id,String name,int age){
this.id=id;
this.name=name;
this.age=age;
}
有参方法应包含该实体类中全部属性,无参的public void Student(){}即可
2.pom.xml先把需要的包都导入,注意版本,不然会产生不兼容问题?另外记得把JDK版本调成1.8
3.mybatis与JDBC差别在哪儿?
JDBC需要自己写connction,建立statement来执行sql语句,其中的sql语句也需要自己写,很容易写错(自己之前就把sql语句写错,虽然mybatis里面也会写错sql语句....写多了就不错了)生成resultset来导出结果,而且很容易产生重复代码操作。
Mybatis中,我们只需要Student.xml中写入sql语句,后面的过程mybatis都会自动帮我们解决,实际上也是对JDBC的一种封装,不过这种简便产生的麻烦就是你要对文件进行详细配置,配置过程中很容易出错而且新手可能找不到问题在哪儿(我看到那些错误是有点发懵...不知道自己哪里写错了),相对JDBC部直观,需要了解一下SqlSessionFactory的代码流程,但是看源码对新手来说还略显复杂,这里可能有两种学习方法吧,一种是会用就可以,需要记忆一下用法然后以后可以自己做到熟练应用,不过这样做缺点也挺明显的..我就是这样学的然后到了后面spring框架与mybatis框架整合的时候根本不知道怎么配置SqlSessionFactory相关的类。另外一种就是彻底弄清原理,感觉自己真的需要去弄清一下这些原理了。
4.配置文件mybatis-config.xml
主要作用是配置数据库连接池,为了学习映射,我在这里加入了一个
<!--映射pojo下的Student.xml执行Student.xml中的sql语句-->
<mappers>
<mapper resource = "Student.xml"/>
</mappers>
如果需要映射多个文件,请写成 <mapper resource =“A"/> <mapper resource= "B"/>格式。
5.配置文件Student.xml
这是实体类Student对应的文件,如果想让这个文件对应实体类,需要加入
<
mapper
namespace
=
"mapper接口路径"
>本来namespace是用于绑定mapper文件(mapper文件其实就是Dao接口)的,用来实现面向接口编程,好处在于不用写接口实现类,可以直接通过namespace的绑定直接找到配置文件Student.xml文件中的SQL语句然后执行,但是不知道为啥我随便改namespace最后都能跑出结果...可能这个程序我写的有问题,今天剩下的时间已经在重写项目了...
然后是对应mapper接口中的sql语句,注意这里需要一一对应,
<insert id="add" parameterType="Student" >
insert into student (name) values (#{name})
</insert>
与我在mapper接口中定义的抽象方法
public int add(Student student);
对应,然后mybatis会直接执行配置文件中的sql语句,然后这里有个坑好像就是sql语句select,网上说是mybatis会根据实际运行的结果决定返回值到底是select one()还是可以返回多值,不过我试了下当我想要sql语句返回多个值的时候就会报错,试着改了一下resultType为List倒是返回正常...明天再试试。
<select id="get" parameterType="int" resultType="pojo.Student">
select * from student where id= #{id}
</select>
这里select id就是mapper接口中定义的抽象方法名。
6.这好像被我说反了,得先建立mapper接口才能写对应的xml配置文件(上午做mybatis时没有实现dao编写,现在重写的项目里面加入了mapper也就是dao功能,感觉这就是spring和mybatis的结合?)
public interface StudentMapper {
public int add(Student student);
一部分定义的抽象方法
7.编写test文件测试
今天学习了一下junit4下测试方法的编写,看了其他师兄的日志发现有用junitGenerated2.0这个jar包的,可是网络有问题下载不下来,只好自己写了几个简单的test程序,还是不会写自己这个项目的test程序,jar包也不知道需要哪些,@Test和断言这些功能是看懂了,不知道怎么实战应用啊...日志文件也是jar包加载之后还各种报错,根据网上的日志配置了一份,然后不好用,我是不是该问问线下的师兄怎么搞..今天重新写的项目是卡在这步了,暂时没啥进展。
收获:
今天学习了sping、junit、log4j日志,spring的核心就是IOC反转控制和AOP面向切面编程,IOC理解起来比较容易,就是不用Student student=new Student();这样自己声明一个new student对象,而是通过spring创建一个对象,这个对象通过bena来提取然后后就可以使用。
这里涉及到了bean的写法:
<
bean
name
=
"c"
class
=
"com.how2java.pojo.Category"
>
<
property
name
=
"name"
value
=
"category 1"
/>
</
bean
>
如果你想生成一个Category category的话,不需要自己去new Category,而是直接(Category)context.getBean("c")
注意代码中的
(1)bean name代表了你想执行getBean()方法时里面的参数,例子中bean name为C,那么需要getBean的时候就是getBean("c")
(2)class代表了生成对象的类的所在位置,这里生成Category类的对象,所以路径指向Gategory
(3)property name代表对象的属性name,后面为name赋值为category 1,当然如果想生成的对象属性都有,那么可以多次赋值吧,比如property
name
=
"name"
value
=
"category 1"
property name = "id" value=" 1" 不知道可不可以这样做,明天试试。
后面的AOP面向切面编程没看懂,大概复制个图
任务一到底需不需要这个...
遇到的问题:
各种报错,环境配置有问题,自己解决起来还是有点困难,另外有个问题就是运行的时候有warning不是error到底用不用解决
图糊了...
还有想了解一下sessionfactory到底是如何工作的,也被junit报错的事情耽误了,对有些地方的返回值不清楚,感觉就是在囫囵吞枣,很难。师兄当时怎么度过这段时期的,还是说就是继续按照任务做,先把任务一按时做完?如果明天弄好junit和日志的问题我就准备弄个服务器然后在服务器上操作了,比较害怕这么渣的基础知识继续学会不会更难,只会用类下的方法连方法怎么运作的都不知道,尤其是那么多的jar包,各种方法。
评论