javaweb实战之商城项目开发(二)

上一篇《javaweb实战之商城项目开发(一)》已经把实体类,分页工具创建好了,这一篇利用mybatis创建DAO层.

另外mybatis的api文档可以参考

一.mybatis的使用

1. 引入架包

这里引入mybatis和mysql的架包到lib中

2. 编写Config.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="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提供的模版

<!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中用${}来引用.

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'.另一种是${}替换,这种是与按照原格式直接替换,不会添加其他东西

<?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是文件路径哈

<mappers>

<mapper resource="com/model/User.xml"/>

</mappers>

然后写测试类

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层的使用

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代码

<!--增加一个用户-->

<insert id="add" parameterType="User">

INSERT INTO user VALUES

(null,#{username},#{password},#{nickname},#{type})

</insert>

JAVA代码

/**

/**

* 添加一个用户

* @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代码

<!--删除一个用户-->

<delete id="delete" parameterType="int">

DELETE FROM user WHERE id=#{id}

</delete>

java代码

/**

*根据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代码

<!--修改一个用户-->

<update id="update" parameterType="User" >

UPDATE user SET username=#{username},password=#{password},nickname=#{nickname},type=#{type} where id=#{id}

</update>

java代码

/**

*更新用户

* @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代码

<!--用户登录判断-->

<select id="login" parameterType="String" resultType="User">

SELECT * FROM user WHERE username=#{username}

</select>

java代码

/**

* 判断一个用户是否存在

* @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

<!--分页代码-->

<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代码:总体还是按照前面文章设计的分页

/**

* 根据指定条件分页查询

* @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其他属性的使用,感谢大家的阅读。

以上是 javaweb实战之商城项目开发(二) 的全部内容, 来源链接: utcz.com/p/208107.html

回到顶部