Java第三十七天,Mybatis框架系列,mybatis 完成传统的 Dao 层的开发
一、项目架构
二、代码
1.Pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>MySQLCURD</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
2.IuserDao.java
package dao;
import entil.User;
import java.util.List;
public interface IUserDao {
public abstract User findById(Integer officeid);
public abstract List<User> findUsersByLikeName(String username);
public abstract List<User> findAll();
public abstract Integer getUserNums();
public abstract void update(User user);
public abstract void deleteById(Integer officeid);
}
3.UserDaoImpl.java
package dao.impl;
import dao.IUserDao;
import entil.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;
public class UserDaoImpl implements IUserDao {
private SqlSessionFactory factory;
private SqlSession sqlSession;
public UserDaoImpl(SqlSessionFactory factory){
this.factory = factory;
sqlSession = factory.openSession();
}
// java中的析构函数
@Override
public void finalize(){
sqlSession.close();
}
public User findById(Integer officeid) {
return sqlSession.selectOne("dao.IUserDao.findById", officeid);
}
public List<User> findUsersByLikeName(String username){
return sqlSession.selectList("dao.IUserDao.findUsersByLikeName", username);
}
public Integer getUserNums(){
return sqlSession.selectOne("dao.IUserDao.getUserNums");
}
public List<User> findAll() {
// 参数就是Dao中配置信息的key 即 Mapper(Dao)文件中的 类名.方法名
return sqlSession.selectList("dao.IUserDao.findAll");
}
public void save(User user) {
sqlSession.insert("dao.IUserDao.save", user);
sqlSession.commit();
}
public void update(User user){
sqlSession.update("dao.IUserDao.update", user);
}
public void deleteById(Integer officeid) {
sqlSession.delete("dao.IUserDao.deleteById", officeid);
}
}
4.User.java
package entil;
import java.io.Serializable;
public class User implements Serializable {
private Integer officeid;
private String username;
private String password;
public Integer getOfficeid() {
return officeid;
}
public void setOfficeid(Integer officeid) {
this.officeid = officeid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"officeid=" + officeid +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
5.log4j.properties
# 全局日志配置
log4j.rootLogger=ERROR, stdout
# MyBatis 日志配置
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
6.sqlMapConfig.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>
<!--主配置文件-->
<!--配置环境-->
<environments default="mysql"> <!--可为任意值,但该值必须出现在下面的 environment 标签中-->
<!--配置mysql环境-->
<environment id="mysql">
<!--事务类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置m数据源(连接池)-->
<dataSource type="POOLED">
<!--配置连接数据库的基本信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/> <!--数据库驱动-->
<property name="url" value="jdbc:mysql://localhost:3306/lanyue"/> <!--指明哪个数据库-->
<property name="username" value="root"/> <!--数据库用户名-->
<property name="password" value="123456"/> <!--数据库用户名密码-->
</dataSource>
</environment>
</environments>
<!--用resource属性指明配置文件-->
<mappers>
<mapper resource="mybatis/userDao.xml"/>
</mappers>
</configuration>
7.userDao.xml
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.IUserDao"> <!--namespace是指Dao的全限定域名,其中 . 代表目录,类似于 /-->
<!--查询-->
<!--有了它就能确定PreparedStatement,就可以执行配置文件中的SQL语句-->
<!--resultType 声明了查询语句返回结果的数据类型-->
<!--dao.IuserDao.findAll 指明了某个接口的某个方法-->
<select id="findAll" resultType="entil.User"> <!--id 必须和相应 JAVA Dao 接口文件抽象方法同名-->
select * from user; <!--sql语句结尾的封号可有可无-->
</select>
<!--根据用户名(可能完整,可能不完整)进行模糊查询,返回一个用户列表-->
<!--注意:这里并没有拼接 %(模糊查询关键字) ,所以在调用的时候,需要提供 % 号;这里属于占位符写法-->
<!--select * from user where username like #{username}-->
<!--这种写法就不需要在调用的时候写 %;但是必须写成 value-->
<!--select * from user where username like '%${value}%'-->
<!-- '%${}%' 属于字符串拼接写法,中间的属性名称必须写 value(源码绑定了) -->
<!--
#{}表示一个占位符号
通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,
#{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类
型值, #{}括号中可以是 value 或其它名称。
${}表示拼接 sql 串
通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换, ${}可以接收简
单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值, ${}括号中只能是 value。
-->
<select id="findUsersByLikeName" parameterType="java.lang.String" resultType="entil.User">
select * from user where username like '%${value}%'
</select>
<!--查询得到总的用户数-->
<select id="getUserNums" resultType="java.lang.Integer">
select count(*) from user
</select>
<!--因为 deleteById 方法中只有一个基本类型(或者基本类型包装类)参数,因此这里只需要写一个占位符(随便起名)即可-->
<select id="findById" resultType="entil.User" parameterType="java.lang.Integer">
select * from user where officeid = #{id}
</select>
<!--parameterType 声明了插入语句中要插入的数据(由外界输入)的类型-->
<!--解析传入数据的值得时候,要根据Mybatis的要求,使用 #{} 的形式取值;且字段名为对应的实体类的属性名称-->
<!--id 对应的 save 和 findALL 都是 Dao 层接口定义的方法名,也是业务层调用文件时要使用的方法名-->
<insert id="save" parameterType="entil.User">
insert into user(officeid, username, password) values(#{officeid}, #{username}, #{password})
</insert>
<!--根据传入对象 user(匹配和传入对象 id 相同的对象) 跟新 指定user的其他字段-->
<update id="update" parameterType="entil.User">
update user set username=#{username}, password=#{password} where officeid=#{officeid}
</update>
<!--因为 deleteById 方法中只有一个基本类型(或者基本类型包装类)参数,因此这里只需要写一个占位符(随便起名)即可-->
<delete id="deleteById" parameterType="java.lang.Integer">
delete from user where officeid = #{id}
</delete>
</mapper>
8.Test.java
import dao.IUserDao;
import dao.impl.UserDaoImpl;
import entil.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;
public class Test {
private static InputStream in;
private static IUserDao dao;
public static void main(String[] args) throws Exception{
in = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
// 使用工厂对象创建 Dao 对象
dao = new UserDaoImpl(factory);
List<User> all = dao.findAll();
for(User user : all){
System.out.println(user.toString());
}
}
}
9.数据库建表语句
create database if not exists lanyue character set utf8;
use lanyue;
create table user (
officeid int unsigned not null primary key,
username char(10) not null ,
password char(10) not null,
UNIQUE KEY username(username)
);