上一篇《javaweb实战之商城项目开发(一)》已经把实体类,分页工具创建好了,这一篇利用mybatis创建DAO层.
另外mybatis的api文档可以参考
一.mybatis的使用
1. 引入架包
这里引入mybatis和mysql的架包到lib中
2. 编写Config.xml配置数据库环境
先贴代码,然后逐个解释
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<? 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 = "Config.properties" /> < typeAliases > < package name = "com.model" /> </ typeAliases > < environments default = "development" > < environment id = "development" > < transactionManager type = "JDBC" /> < dataSource type = "POOLED" > < property name = "driver" value = "${driver}" /> < property name = "url" value = "${url}" /> < property name = "username" value = "${username}" /> < property name = "password" value = "${password}" /> </ dataSource > </ environment > <!--第二个环境--> < environment id = "publish" > < transactionManager type = "JDBC" /> < dataSource type = "POOLED" /> </ environment > </ environments > </ configuration > |
第一步是要引入xml文件格式,也就是dtd,这个要直接复制mybatis提供的模版
1
2
3
|
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> |
问题1
properties 功能是配置相应的properties文件,resource是指定相应的路线,properties文件里面我们可以配置数据库驱动,url,用户名,密码等,参考下面,这样的话mybatis就会自动读取下面的参数,你可以在xml中用${}来引用.
1
2
3
4
|
driver = com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/shop username=root password=123456 |
问题2
typeAliases配置指定路径下的别名,我们可以配置单个别名
单个名称<typeAlias type="com.model.User" alias="User"/>这样就把com.model.User修改为别名User,后面就不需要写全部名称了,只需要User即可代替
批量修改<package name="com.model"/>这样就可以把一个包的类全部修改,默认别名为实体类类名
问题3
environments是配置数据库环境的,可以配置多个环境,例如开发环境和发布环境,default是指默认环境
environment注意没有s,代表environments下的一个环境,通过id区分,因此id必须唯一
transactionManager代表连接数据库类型,JDBC连接java
dataSource配置数据源模式,pooled就是连接池模式,具体其他模式可以去官方文档看下,根据需要选择
property这个就是配置数据库连接了,name不用动,修改value=”driver",这里是用{}是读取最上方properties 这个文件里面的配置,这里注意匹配名称才能读取进来的哈
3.编写mapper映射sql语句
这里编写UserDao的load方法,也就是根据id读取一个用户,下面代码就是相当于public User load(int id)函数
对于mybatis有两种替换#{}替换会根据类型自动带上引号,例如string类型#{name}替换后为'name'.另一种是${}替换,这种是与按照原格式直接替换,不会添加其他东西
1
2
3
4
5
6
7
8
9
|
<? 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 > < select id = "load" parameterType = "int" resultType = "User" > SELECT * from user WHERE id=#{id} </ select > </ mapper > |
第一步还是引入dtd头文件,制定xml文件规则
select 标签,说明当前是一个select语句
id属性,相当于是函数名,通过id引用
parameterType属性,代表传入参数类型,可以指定基本类型,也可以是自定义类型,是自定义类型的话,会自动调用其get方法,获取其属性
resultType属性,返回值类型,可以直接自定义类型,会自动调用set方法把查询出来的参数设置进去
更多属性在后续文章中使用到再说.
4.调用mapper映射
调用之前需要先在Config.xml中配置映射,注意这里配置的xml是文件路径哈
1
2
3
|
< mappers > < mapper resource = "com/model/User.xml" /> </ mappers > |
然后写测试类
1
2
3
4
5
6
7
8
9
10
11
12
|
public static void main(String[] args) { try { InputStream is = Resources.getResourceAsStream( "Config.xml" ); //读取配置文件 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); //利用配置文件创建factory SqlSession session = factory.openSession(); //获取session User user = session.selectOne(User. class .getName()+ ".load" , 1 ); //调用load函数 System.out.println(user.getNickname()); //输出昵称 session.close(); //关闭session } catch (IOException e) { e.printStackTrace(); } } |
结果:
5.Sqlsession工具类
像上面那样写测试类太麻烦,就把Sqlsession封装下,方便DAO层的使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
package com.util; 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 java.io.IOException; import java.io.InputStream; /** * Created by nl101 on 2016/2/23. */ public class SessionUtil { private static SqlSessionFactory factory= null ; static { try { InputStream is = Resources.getResourceAsStream( "Config.xml" ); //读取配置文件 factory = new SqlSessionFactoryBuilder().build(is); //利用配置文件创建factory } catch (IOException e) { e.printStackTrace(); } } /** * 获取session * @return */ public static SqlSession getSession(){ return factory.openSession(); } /** * 关闭session * @param session */ public static void closeSession(SqlSession session){ if (session!= null ) session.close(); session = null ; } } |
以上就是mybatis的基本使用,下面开始封装DAO层
二.封装DAO
1.UserDao.java
public User load(int id)根据id获取一个User
上面已经写过了
public boolean add(User user) 增加一个用户
XML代码
1
2
3
4
5
|
<!--增加一个用户--> < insert id = "add" parameterType = "User" > INSERT INTO user VALUES (null,#{username},#{password},#{nickname},#{type}) </ insert > |
JAVA代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/** /** * 添加一个用户 * @param user 要添加的用户 * @return true成功 */ public boolean add(User user){ int isAdd = 0 ; SqlSession session = SessionUtil.getSession(); try { isAdd = session.insert(User. class .getName()+ ".add" ,user); session.commit(); //提交 } catch (Exception e) { session.rollback(); //提交失败则回滚 } finally { SessionUtil.closeSession(session); } System.out.println(isAdd); return isAdd> 0 ; } public boolean delete( int id)删除一个用户 |
xml代码
1
2
3
4
|
<!--删除一个用户--> < delete id = "delete" parameterType = "int" > DELETE FROM user WHERE id=#{id} </ delete > |
java代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/** *根据id删除用户 * @param id 要删除用户的id * @return true成功 */ public boolean delete( int id){ int isDelete = 0 ; SqlSession session = SessionUtil.getSession(); try { isDelete = session.delete(User. class .getName()+ ".delete" ,id); session.commit(); } catch (Exception e) { session.rollback(); //失败返回 System.out.println( "删除用户失败" ); e.printStackTrace(); } finally { SessionUtil.closeSession(session); } return isDelete> 0 ; } public boolean update(User user)更新用户 |
xml代码
1
2
3
4
|
<!--修改一个用户--> < update id = "update" parameterType = "User" > UPDATE user SET username=#{username},password=#{password},nickname=#{nickname},type=#{type} where id=#{id} </ update > |
java代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
/** *更新用户 * @param user 要更新的用户 * @return true成功 */ public boolean update(User user){ int isUpdate = 0 ; SqlSession session = SessionUtil.getSession(); try { isUpdate = session.delete(User. class .getName()+ ".update" ,user); session.commit(); } catch (Exception e) { session.rollback(); //失败返回 System.out.println( "更新用户失败" ); e.printStackTrace(); } finally { SessionUtil.closeSession(session); } return isUpdate> 0 ; } public User login(String username, String password)判断用户是否存在 |
xml代码
1
2
3
4
|
<!--用户登录判断--> <select id= "login" parameterType= "String" resultType= "User" > SELECT * FROM user WHERE username=#{username} </select> |
java代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
/** * 判断一个用户是否存在 * @param username 用户名 * @param password 密码 * @return 存在返回User 不存在返回null */ public User login(String username, String password){ User user = null ; SqlSession session = SessionUtil.getSession(); try { user = session.selectOne(SOAPBinding.Use. class .getName()+ ".login" ,username); //当密码不对的时候置user为null if (!user.getPassword().equals(password)){ user = null ; } } finally { SessionUtil.closeSession(session); } return user; } public Pager find(String name,String sort,String order)分页处理 |
xml代码:
这里用到了动态sql,关于动态sql,就是where,if,chose等标签的使用,可以参考官方文档
另外在mybatis中,null的概念是不存在,举个例子,你传个user=null,但是在替换的时候替换为”null”串.没有这个值才为null
1
2
3
4
5
6
7
8
9
10
11
12
|
<!--分页代码--> < select id = "find" parameterType = "Map" resultType = "User" > SELECT * from user < if test = "name!=null" >WHERE (username LIKE #{name} or nickname LIKE #{name})</ if > ORDER BY ${sort} ${order} LIMIT #{pageStart},#{pageSize} </ select > <!--分页总记录数--> < select id = "findcount" parameterType = "Map" resultType = "int" > SELECT count(*) from user < if test = "name!=null" >WHERE (username LIKE #{name} or nickname LIKE #{name})</ if > </ select > |
java代码:总体还是按照前面文章设计的分页
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
/** * 根据指定条件分页查询 * @param name 查询条件,null代表无条件 * @param sort 排序条件,null代表按照id排序 * @param order 排序条件,null代表升序 * @return */ public Pager< User > find(String name,String sort,String order){ int pageStart = SystemContext.getPageStart();//分页起始 int pageSize = SystemContext.getPageSize();//分页大小 Pager< User > pagers = new Pager<>(); Map< String ,Object> maps = new HashMap<>(); if (name!=null && !name.equals("")){ name = "%"+name+"%"; maps.put("name",name); } if (sort==null || sort.equals("")){ sort = "id";//默认按照id排序 } if (order==null || order.equals("")){ order = "asc";//默认排序 } maps.put("sort",sort); maps.put("order",order); maps.put("pageStart",pageStart); maps.put("pageSize",pageSize); SqlSession session = SessionUtil.getSession(); List< User > datas = null; try { datas = session.selectList(User.class.getName()+".find",maps);//获取记录 pagers.setDatas(datas); pagers.setPageSize(pageSize); pagers.setPageStart(pageStart); int totalRecord = session.selectOne(User.class.getName()+".findcount",maps);//获取记录总数 pagers.setTotalRecord(totalRecord); pagers.setPageIndex(pageStart/pageSize+1); } finally { SessionUtil.closeSession(session); } return pagers; } |
目前项目结构
下一篇写一个通用的BaseDao,以方便代码书写.并且继续学习mybatis其他属性的使用,感谢大家的阅读。