对原生态jdbc程序中问题总结

创建mysql数据库

jdbc程序

使用jdbc查询mysql数据库中用户表的记录.

创建java工程,加入jar包

数据库驱动包

第一个是mysql驱动

第二个是oracle驱动

程序代码

public class JdbcTest {

    public static void main(String[] args) {

        //数据库的连接

        Connection connection = null;

        //预编译的Statement     使用预编译的Statement提高数据库的性能

        PreparedStatement perparedStatement = null;

        //结果集

        ResultSet resultSet = null;

        try {

            //加载数据库驱动

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

            //通过驱动管理类获取数据库链接

            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8","root","root");

            //定义sql语句?表示占位符

            String sql = "select * from user where username = ?";

            //获取预处理statement

            perparedStatement = connection.prepareStatement(sql);

            //设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值

            perparedStatement.setString(1,"王五");

            //向数据库发送sql执行查询,查询出结果集

            resultSet = perparedStatement.executeQuery();

            //遍历查询结果集

            while(resultSet.next()) {

                System.out.println(resultSet.getString("id")+" "+resultSet.getString("username"));

            }

        }catch (Exception e) {

            e.printStackTrace();

        }finally{

            //释放资源

            if(resultSet != null) {

                try {

                   resultSet.close();

                }catch(SQLException e) {

                   e.printStackTrace();

                }

            }

            if(perparedStatement != null) {

                try {

                   perparedStatement.close();

                }catch(SQLException e) {

                   e.printStackTrace();

                }

            }

            if(connection != null) {

                try {

                   connection.close();

                }catch(SQLException e) {

                   e.printStackTrace();

                }

            }

        }

    }

}

问题总结

  1. 数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能.

  设想:使用数据库连接池管理数据库连接.

  1. 将sql语句硬编码到java代码中,如果sql语句修改,需要重新编译java代码,不利于系统维护.

  设想:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译.

  1. 向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护.

  设想:将sql语句及占位符号和参数全部配置在xml中.

  1. 从resultSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于系统维护.

  设想:将查询的结果集,自动映射成java对象.

什么是框架

框架(Framework)是一个提供了可重用的公共结构的半成品.

就像PPT里的主体模板,拿过来就可以用,不用考虑布局,提高效率.

MyBatis框架

  什么是MyBatis?

    MyBatis是一个支持普通SQL查询存储过程高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

mybatis-config.xml配置文件相关属性节点

(1)  configuration:配置文件的根元素节点。

(2)properties:通过resource属性从外部指定properties属性文件(database.properties),该属性文件描述数据库连接的相关配置(数据库驱动、连接数据库的url、数据库用户名、数据库密码),其位置也是在/resources目录下。

(3)settings:设置MyBatis运行中的一些行为,比如此处设置MyBatis的log日志实现为LOG4J,即使用log4j实现日志功能。

(4)environments:表示配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上,该元素节点下可以配置多个environment子元素节点,但是必须指定其中一个为默认运行环境(通过default指定)。(5)environment:配置MyBatis的一套运行环境,需指定运行环境ID、事务管理、数据源配置等相关信息。

(6)mappers:作用是告诉MyBatis去哪里找到SQL映射文件(该

文件内容是开发者定义的映射SQL语句),整个项目中可以有一个或多个SQL映射文件。

(7)mapper:mappers的子元素节点,具体指定SQL映射文件的路径,其中resource属性的值表述了SQL映射文件的路径(类资源路径)。

mybatis-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>
<!-- 引入database.properties 文件 -->
<properties resource="database.properties" /> <!-- 配置mybatis的log实现为LOG4J -->
<settings>
<setting name="logImpl" value="LOG4J" />
</settings> <!-- 配置mybatis多套运行环境 -->
<environments default="development">
<environment id="development">
<!-- 配置事务管理,采用JDBC的事务管理 -->
<transactionManager type="JDBC" /> <!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments> <!-- 将mapper文件加入配置文件中 -->
<mappers>
<mapper resource="org/hdax/pojo/UserMapper.xml" />
</mappers>
</configuration>

注意:

Mybatis-config.xml文件的元素节点是有一定顺序的,如果节点位置不接顺序排位,那么XML文件会报错。

创建持久化类(POJO)和SQL映射文件

持久化类是指其实例状态需要被MyBais 持久化到数据库中的类。在应用的设计

中,持久化类通常对应需求中的业务实体。MyBatis一般采用 POJO(Plain Ordinary Java

Object)编程模型来实现持久化类,与POJO类配合完成持久化工作是MyBatis最常见

的工作模式。

MyBatis框杂的优点

(1) 与JDBC相比,减少了50%以上的代码量。

(2)MyBatis是最简单的持久化框架,小巧并且简单易学。

(3)MyBlis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL

写在XML里,从程序代码中彻底分离,既降低耦合度,又便于统一管理和优化,还可重用。

(4)提供XML标签,支持编写动态SOL语句。

(5)提供映射标签,支持对象与数据库的ORM字段关系映射。

MyBatis框杂的缺点

(1)SQL语句的编写工作量较大,对开发人员编写SOL语句的功底有一定要求。

(2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

MyBatis框杂适用场合

MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。对性能要求很高

的项目,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。

搭建MyBatis环境步骤

1.下载jar包 --> 2.部署jar包 --> 3.编写MyBatis核心配置文件 --> 4.创建实体类 --> 5.创建dao接口 --> 6.创建sql映射文件 --> 7.编写测试类

原理详解:

MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,配置来源于两个地方,一处是配置文件,一处是Java代码的注解,获取一个SqlSession。SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句,完成对数据的增删改查和事务提交等,用完之后关闭SqlSession。

SqlSessionFactory的构造者—SqlSessionFactoryBuilder

1.SqlSessionFactoryBuilder的作用

SqlSessionFactoryBuilder负责构建SqlSessionFactory,并且提供了多个build()方法

的重载.

 

2.SqlSessionFactoryBuilder的生命周期和作用域

SqlSessionFactoryBuilder的最大特点是用过即丢。

SqlSession 的工厂—SqlSessionFactory

1.SqlSessionFactory的作用

SqlSessionFactory 就是创建SqlSession实例的工厂。

2.SqlSessionFactory的生命周期和作用域

SqlSessionFactory对象一旦创建,就会在整个应用运行过程中始终存在。

使用SqlSession进行数据持久化操作

1.SqlSession的作用

SqlSession是用于执行持久化操作的对象,类似于JDBC中的Connection。

2.SqlSession的生命周期和作用域

SqlSession对应着一次数据库会话,由于数据库会话不是永久的,因此SqlSession

的生命周期也不是永久的。创建SqlSession的方式只有一个,那就是使用SqlSessionFactory对象的openSession0方法。

mybatis快速入门

准备开发环境

1、  创建测试项目,普通java项目或者是JavaWeb项目均可,如下图所示:

2、添加相应的jar包

  【mybatis

  mybatis-3.1.1.jar

MYSQL驱动包】
    mysql-connector-java-5.1.7-bin.jar

3、创建数据库和表,针对MySQL数据库

  SQL脚本如下:

 
create database mybatis;
use mybatis;
CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age INT);
INSERT INTO users(NAME, age) VALUES('孤傲苍狼', 27);
INSERT INTO users(NAME, age) VALUES('白虎神皇', 27);

将SQL脚本在MySQL数据库中执行,完成创建数据库和表的操作,如下:

  到此,前期的开发环境准备工作全部完成。

使用MyBatis查询表中的数据

  1、添加Mybatis的配置文件conf.xml

在src目录下创建一个conf.xml文件,如下图所示:

  核心配置文件conf.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>
<!-- 引入database.properties 文件 -->
<properties resource="database.properties"/> <!-- 配置mybatis的log实现为LOG4J -->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings> <!-- 配置mybatis多套运行环境 -->
<environments default="development">
<environment id="development">
<!-- 配置事务管理,采用JDBC的事务管理 -->
<transactionManager type="JDBC" /> <!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="XDP" />
</dataSource>
</environment>
</environments> <!-- 将mapper文件加入配置文件中-->
<mappers>
<mapper resource="cn/smbms/dao/user/UserMapper.xml"/>
</mappers>
</configuration>

2、定义表所对应的实体类,如下图所示:

  User类的代码如下:

 
package me.gacl.domain;

 /**
* @author gacl
* users表所对应的实体类
*/
public class User {
//实体类的属性和表的字段名称一一对应
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}

  3、定义操作users表的sql映射文件userMapper.xml

创建一个me.gacl.mapping包,专门用于存放sql映射文件,在包中创建一个userMapper.xml文件,如下图所示:

  userMapper.xml文件的内容如下:

 
<?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指定一个唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml文件去除后缀)
-->
<mapper namespace="me.gacl.mapping.userMapper">
<!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复
使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型
resultType="me.gacl.domain.User"就表示将查询结果封装成一个User类的对象返回
User类就是users表所对应的实体类
-->
<!--
根据id查询得到一个user对象
-->
<select id="getUser" parameterType="int"
resultType="me.gacl.domain.User">
select * from users where id=#{id}
</select>
</mapper>

  4、在conf.xml文件中注册userMapper.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="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="XDP" />
</dataSource>
</environment>
</environments> <mappers>
<!-- 注册userMapper.xml文件,
userMapper.xml位于me.gacl.mapping这个包下,所以resource写成me/gacl/mapping/userMapper.xml-->
<mapper resource="me/gacl/mapping/userMapper.xml"/>
</mappers> </configuration>

  5、编写测试代码:执行定义的select语句

  创建一个Test1类,编写如下的测试代码:

package me.gacl.test;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import me.gacl.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class Test1 { public static void main(String[] args) throws IOException {
//mybatis的配置文件
String resource = "conf.xml";
//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
InputStream is = Test1.class.getClassLoader().getResourceAsStream(resource);
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
//使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)
//Reader reader = Resources.getResourceAsReader(resource);
//构建sqlSession的工厂
//SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建能执行映射文件中sql的sqlSession
SqlSession session = sessionFactory.openSession();
/**
* 映射sql的标识字符串,
* me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,
* getUser是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
*/
      //在命名空间“me.gacl.mapping.userMapper”中定义了一个名为“getUser”的映射语句,
      //这样它就允许你使用指定的完全限定名“me.gacl.mapping.userMapper.getUser”来调用映射语句,
      //格式:命名空间名(namespace)+映射语句名(id) String statement = "me.gacl.mapping.userMapper.getUser";//映射sql的标识字符串
//执行查询返回一个唯一user对象的sql
User user = session.selectOne(statement, 1);
System.out.println(user);
}
}

执行结果如下:

  可以看到,数据库中的记录已经成功查询出来了。

入门程序

准备开发环境

  1. 创建数据库创建测试项目,普通java项目或者是JavaWeb项目均可,如下图所示

1. smbms数据库

/*

SQLyog 企业版 - MySQL GUI v8.14

MySQL - 5.5.40 : Database - smbms

*********************************************************************

*/

/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

CREATE DATABASE /*!32312 IF NOT EXISTS*/`smbms` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci */;

USE `smbms`;

/*Table structure for table `smbms_address` */

DROP TABLE IF EXISTS `smbms_address`;

CREATE TABLE `smbms_address` (

`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',

`contact` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '联系人姓名',

`addressDesc` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '收货地址明细',

`postCode` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '邮编',

`tel` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '联系人电话',

`createdBy` bigint(20) DEFAULT NULL COMMENT '创建者',

`creationDate` datetime DEFAULT NULL COMMENT '创建时间',

`modifyBy` bigint(20) DEFAULT NULL COMMENT '修改者',

`modifyDate` datetime DEFAULT NULL COMMENT '修改时间',

`userId` bigint(20) DEFAULT NULL COMMENT '用户ID',

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

/*Data for the table `smbms_address` */

insert  into `smbms_address`(`id`,`contact`,`addressDesc`,`postCode`,`tel`,`createdBy`,`creationDate`,`modifyBy`,`modifyDate`,`userId`) values (1,'王丽','北京市东城区东交民巷44号','100010','13678789999',1,'2016-04-13 00:00:00',NULL,NULL,1),(2,'张红丽','北京市海淀区丹棱街3号','100000','18567672312',1,'2016-04-13 00:00:00',NULL,NULL,1),(3,'任志强','北京市东城区美术馆后街23号','100021','13387906742',1,'2016-04-13 00:00:00',NULL,NULL,1),(4,'曹颖','北京市朝阳区朝阳门南大街14号','100053','13568902323',1,'2016-04-13 00:00:00',NULL,NULL,2),(5,'李慧','北京市西城区三里河路南三巷3号','100032','18032356666',1,'2016-04-13 00:00:00',NULL,NULL,3),(6,'王国强','北京市顺义区高丽营镇金马工业区18号','100061','13787882222',1,'2016-04-13 00:00:00',NULL,NULL,3);

/*Table structure for table `smbms_bill` */

DROP TABLE IF EXISTS `smbms_bill`;

CREATE TABLE `smbms_bill` (

`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',

`billCode` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '账单编码',

`productName` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '商品名称',

`productDesc` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '商品描述',

`productUnit` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '商品单位',

`productCount` decimal(20,2) DEFAULT NULL COMMENT '商品数量',

`totalPrice` decimal(20,2) DEFAULT NULL COMMENT '商品总额',

`isPayment` int(10) DEFAULT NULL COMMENT '是否支付(1:未支付 2:已支付)',

`createdBy` bigint(20) DEFAULT NULL COMMENT '创建者(userId)',

`creationDate` datetime DEFAULT NULL COMMENT '创建时间',

`modifyBy` bigint(20) DEFAULT NULL COMMENT '更新者(userId)',

`modifyDate` datetime DEFAULT NULL COMMENT '更新时间',

`providerId` int(20) DEFAULT NULL COMMENT '供应商ID',

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

/*Data for the table `smbms_bill` */

insert  into `smbms_bill`(`id`,`billCode`,`productName`,`productDesc`,`productUnit`,`productCount`,`totalPrice`,`isPayment`,`createdBy`,`creationDate`,`modifyBy`,`modifyDate`,`providerId`) values (1,'BILL2016_001','洗发水、护发素','日用品-洗发、护发','瓶','500.00','25000.00',2,1,'2014-12-14 13:02:03',NULL,NULL,13),(2,'BILL2016_002','香皂、肥皂、药皂','日用品-皂类','块','1000.00','10000.00',2,1,'2016-03-23 04:20:40',NULL,NULL,13),(3,'BILL2016_003','大豆油','食品-食用油','斤','300.00','5890.00',2,1,'2014-12-14 13:02:03',NULL,NULL,6),(4,'BILL2016_004','橄榄油','食品-进口食用油','斤','200.00','9800.00',2,1,'2013-10-10 03:12:13',NULL,NULL,7),(5,'BILL2016_005','洗洁精','日用品-厨房清洁','瓶','500.00','7000.00',2,1,'2014-12-14 13:02:03',NULL,NULL,9),(6,'BILL2016_006','美国大杏仁','食品-坚果','袋','300.00','5000.00',2,1,'2016-04-14 06:08:09',NULL,NULL,4),(7,'BILL2016_007','沐浴液、精油','日用品-沐浴类','瓶','500.00','23000.00',1,1,'2016-07-22 10:10:22',NULL,NULL,14),(8,'BILL2016_008','不锈钢盘碗','日用品-厨房用具','个','600.00','6000.00',2,1,'2016-04-14 05:12:13',NULL,NULL,14),(9,'BILL2016_009','塑料杯','日用品-杯子','个','350.00','1750.00',2,1,'2016-02-04 11:40:20',NULL,NULL,14),(10,'BILL2016_010','豆瓣酱','食品-调料','瓶','200.00','2000.00',2,1,'2013-10-29 05:07:03',NULL,NULL,8),(11,'BILL2016_011','海之蓝','饮料-国酒','瓶','50.00','10000.00',1,1,'2016-04-14 16:16:00',NULL,NULL,1),(12,'BILL2016_012','芝华士','饮料-洋酒','瓶','20.00','6000.00',1,1,'2016-09-09 17:00:00',NULL,NULL,1),(13,'BILL2016_013','长城红葡萄酒','饮料-红酒','瓶','60.00','800.00',2,1,'2016-11-14 15:23:00',NULL,NULL,1),(14,'BILL2016_014','泰国香米','食品-大米','斤','400.00','5000.00',2,1,'2016-10-09 15:20:00',NULL,NULL,3),(15,'BILL2016_015','东北大米','食品-大米','斤','600.00','4000.00',2,1,'2016-11-14 14:00:00',NULL,NULL,3),(16,'BILL2016_016','可口可乐','饮料','瓶','2000.00','6000.00',2,1,'2012-03-27 13:03:01',NULL,NULL,2),(17,'BILL2016_017','脉动','饮料','瓶','1500.00','4500.00',2,1,'2016-05-10 12:00:00',NULL,NULL,2),(18,'BILL2016_018','哇哈哈','饮料','瓶','2000.00','4000.00',2,1,'2015-11-24 15:12:03',NULL,NULL,2);

/*Table structure for table `smbms_provider` */

DROP TABLE IF EXISTS `smbms_provider`;

CREATE TABLE `smbms_provider` (

`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',

`proCode` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '供应商编码',

`proName` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '供应商名称',

`proDesc` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '供应商详细描述',

`proContact` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '供应商联系人',

`proPhone` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '联系电话',

`proAddress` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '地址',

`proFax` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '传真',

`createdBy` bigint(20) DEFAULT NULL COMMENT '创建者(userId)',

`creationDate` datetime DEFAULT NULL COMMENT '创建时间',

`modifyDate` datetime DEFAULT NULL COMMENT '更新时间',

`modifyBy` bigint(20) DEFAULT NULL COMMENT '更新者(userId)',

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

/*Data for the table `smbms_provider` */

insert  into `smbms_provider`(`id`,`proCode`,`proName`,`proDesc`,`proContact`,`proPhone`,`proAddress`,`proFax`,`createdBy`,`creationDate`,`modifyDate`,`modifyBy`) values (1,'BJ_GYS001','北京三木堂商贸有限公司','长期合作伙伴,主营产品:茅台、五粮液、郎酒、酒鬼酒、泸州老窖、赖茅酒、法国红酒等','张国强','13566667777','北京市丰台区育芳园北路','010-58858787',1,'2013-03-21 16:52:07',NULL,NULL),(2,'HB_GYS001','石家庄帅益食品贸易有限公司','长期合作伙伴,主营产品:饮料、水饮料、植物蛋白饮料、休闲食品、果汁饮料、功能饮料等','王军','13309094212','河北省石家庄新华区','0311-67738876',1,'2016-04-13 04:20:40',NULL,NULL),(3,'GZ_GYS001','深圳市泰香米业有限公司','初次合作伙伴,主营产品:良记金轮米,龙轮香米等','郑程瀚','13402013312','广东省深圳市福田区深南大道6006华丰大厦','0755-67776212',1,'2014-03-21 16:56:07',NULL,NULL),(4,'GZ_GYS002','深圳市喜来客商贸有限公司','长期合作伙伴,主营产品:坚果炒货.果脯蜜饯.天然花茶.营养豆豆.特色美食.进口食品.海味零食.肉脯肉','林妮','18599897645','广东省深圳市福龙工业区B2栋3楼西','0755-67772341',1,'2013-03-22 16:52:07',NULL,NULL),(5,'JS_GYS001','兴化佳美调味品厂','长期合作伙伴,主营产品:天然香辛料、鸡精、复合调味料','徐国洋','13754444221','江苏省兴化市林湖工业区','0523-21299098',1,'2015-11-22 16:52:07',NULL,NULL),(6,'BJ_GYS002','北京纳福尔食用油有限公司','长期合作伙伴,主营产品:山茶油、大豆油、花生油、橄榄油等','马莺','13422235678','北京市朝阳区珠江帝景1号楼','010-588634233',1,'2012-03-21 17:52:07',NULL,NULL),(7,'BJ_GYS003','北京国粮食用油有限公司','初次合作伙伴,主营产品:花生油、大豆油、小磨油等','王驰','13344441135','北京大兴青云店开发区','010-588134111',1,'2016-04-13 00:00:00',NULL,NULL),(8,'ZJ_GYS001','慈溪市广和绿色食品厂','长期合作伙伴,主营产品:豆瓣酱、黄豆酱、甜面酱,辣椒,大蒜等农产品','薛圣丹','18099953223','浙江省宁波市慈溪周巷小安村','0574-34449090',1,'2013-11-21 06:02:07',NULL,NULL),(9,'GX_GYS001','优百商贸有限公司','长期合作伙伴,主营产品:日化产品','李立国','13323566543','广西南宁市秀厢大道42-1号','0771-98861134',1,'2013-03-21 19:52:07',NULL,NULL),(10,'JS_GYS002','南京火头军信息技术有限公司','长期合作伙伴,主营产品:不锈钢厨具等','陈女士','13098992113','江苏省南京市浦口区浦口大道1号新城总部大厦A座903室','025-86223345',1,'2013-03-25 16:52:07',NULL,NULL),(11,'GZ_GYS003','广州市白云区美星五金制品厂','长期合作伙伴,主营产品:海绵床垫、坐垫、靠垫、海绵枕头、头枕等','梁天','13562276775','广州市白云区钟落潭镇福龙路20号','020-85542231',1,'2016-12-21 06:12:17',NULL,NULL),(12,'BJ_GYS004','北京隆盛日化科技','长期合作伙伴,主营产品:日化环保清洗剂,家居洗涤专卖、洗涤用品网、墙体除霉剂、墙面霉菌清除剂等','孙欣','13689865678','北京市大兴区旧宫','010-35576786',1,'2014-11-21 12:51:11',NULL,NULL),(13,'SD_GYS001','山东豪克华光联合发展有限公司','长期合作伙伴,主营产品:洗衣皂、洗衣粉、洗衣液、洗洁精、消杀类、香皂等','吴洪转','13245468787','山东济阳济北工业区仁和街21号','0531-53362445',1,'2015-01-28 10:52:07',NULL,NULL),(14,'JS_GYS003','无锡喜源坤商行','长期合作伙伴,主营产品:日化品批销','周一清','18567674532','江苏无锡盛岸西路','0510-32274422',1,'2016-04-23 11:11:11',NULL,NULL),(15,'ZJ_GYS002','乐摆日用品厂','长期合作伙伴,主营产品:各种中、高档塑料杯,塑料乐扣水杯(密封杯)、保鲜杯(保鲜盒)、广告杯、礼品杯','王世杰','13212331567','浙江省金华市义乌市义东路','0579-34452321',1,'2016-08-22 10:01:30',NULL,NULL);

/*Table structure for table `smbms_role` */

DROP TABLE IF EXISTS `smbms_role`;

CREATE TABLE `smbms_role` (

`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',

`roleCode` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '角色编码',

`roleName` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '角色名称',

`createdBy` bigint(20) DEFAULT NULL COMMENT '创建者',

`creationDate` datetime DEFAULT NULL COMMENT '创建时间',

`modifyBy` bigint(20) DEFAULT NULL COMMENT '修改者',

`modifyDate` datetime DEFAULT NULL COMMENT '修改时间',

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

/*Data for the table `smbms_role` */

insert  into `smbms_role`(`id`,`roleCode`,`roleName`,`createdBy`,`creationDate`,`modifyBy`,`modifyDate`) values (1,'SMBMS_ADMIN','系统管理员',1,'2016-04-13 00:00:00',NULL,NULL),(2,'SMBMS_MANAGER','经理',1,'2016-04-13 00:00:00',NULL,NULL),(3,'SMBMS_EMPLOYEE','普通员工',1,'2016-04-13 00:00:00',NULL,NULL);

/*Table structure for table `smbms_user` */

DROP TABLE IF EXISTS `smbms_user`;

CREATE TABLE `smbms_user` (

`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',

`userCode` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户编码',

`userName` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户名称',

`userPassword` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户密码',

`gender` int(10) DEFAULT NULL COMMENT '性别(1:女、 2:男)',

`birthday` date DEFAULT NULL COMMENT '出生日期',

`phone` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '手机',

`address` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '地址',

`userRole` int(10) DEFAULT NULL COMMENT '用户角色(取自角色表-角色id)',

`createdBy` bigint(20) DEFAULT NULL COMMENT '创建者(userId)',

`creationDate` datetime DEFAULT NULL COMMENT '创建时间',

`modifyBy` bigint(20) DEFAULT NULL COMMENT '更新者(userId)',

`modifyDate` datetime DEFAULT NULL COMMENT '更新时间',

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

/*Data for the table `smbms_user` */

insert  into `smbms_user`(`id`,`userCode`,`userName`,`userPassword`,`gender`,`birthday`,`phone`,`address`,`userRole`,`createdBy`,`creationDate`,`modifyBy`,`modifyDate`) values (1,'admin','系统管理员','1234567',1,'1983-10-10','13688889999','北京市海淀区成府路207号',1,1,'2013-03-21 16:52:07',NULL,NULL),(2,'liming','李明','0000000',2,'1983-12-10','13688884457','北京市东城区前门东大街9号',2,1,'0000-00-00 00:00:00',NULL,NULL),(5,'hanlubiao','韩路彪','0000000',2,'1984-06-05','18567542321','北京市朝阳区北辰中心12号',2,1,'2014-12-31 19:52:09',NULL,NULL),(6,'zhanghua','张华','0000000',1,'1983-06-15','13544561111','北京市海淀区学院路61号',3,1,'2013-02-11 10:51:17',NULL,NULL),(7,'wangyang','王洋','0000000',2,'1982-12-31','13444561124','北京市海淀区西二旗辉煌国际16层',3,1,'2014-06-11 19:09:07',NULL,NULL),(8,'zhaoyan','赵燕','0000000',1,'1986-03-07','18098764545','北京市海淀区回龙观小区10号楼',3,1,'2016-04-21 13:54:07',NULL,NULL),(10,'sunlei','孙磊','0000000',2,'1981-01-04','13387676765','北京市朝阳区管庄新月小区12楼',3,1,'2015-05-06 10:52:07',NULL,NULL),(11,'sunxing','孙兴','0000000',2,'1978-03-12','13367890900','北京市朝阳区建国门南大街10号',3,1,'2016-11-09 16:51:17',NULL,NULL),(12,'zhangchen','张晨','0000000',1,'1986-03-28','18098765434','朝阳区管庄路口北柏林爱乐三期13号楼',3,1,'2016-08-09 05:52:37',1,'2016-04-14 14:15:36'),(13,'dengchao','邓超','0000000',2,'1981-11-04','13689674534','北京市海淀区北航家属院10号楼',3,1,'2016-07-11 08:02:47',NULL,NULL),(14,'yangguo','杨过','0000000',2,'1980-01-01','13388886623','北京市朝阳区北苑家园茉莉园20号楼',3,1,'2015-02-01 03:52:07',NULL,NULL),(15,'zhaomin','赵敏','0000000',1,'1987-12-04','18099897657','北京市昌平区天通苑3区12号楼',2,1,'2015-09-12 12:02:12',NULL,NULL);

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;

/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;

/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

2. smbms项目

  1. 2.      添加相应的jar包 也可以基于maven添加依赖

基于maven添加依赖

<?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.hdax</groupId>
<artifactId>smbms</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties> <dependencies>
  <dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.47</version>
  </dependency>
  <dependency>
   <groupId>org.mybatis</groupId>
   <artifactId>mybatis</artifactId>
   <version>3.5.0</version>
  </dependency>
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.12</version>
  </dependency>
  <dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.17</version>
  </dependency>
  <dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-log4j12</artifactId>
   <version>1.8.0-beta2</version>
  </dependency>
</dependencies> </project>
  1. 3.      创建MyBatis核心配置文件configuration.xml

MyBatis核心配置文件主要用于配置数据库连接和MyBatis运行时所需的各种特性,包含了设置和影响MyBatis行为的属性。

为了方便管理以后各框架集成所需的配置文件,需在项目工程下新建Source Folder

类型的resources目录,并在此目录下添加MyBatis的核心配置文件,默认文件名为“configuration.xml”。需要注意的是,为了在框架集成时更好地区分各个配置文件,我们一般将此文件命名为“mybatis-config.xml”。该文件需要配置数据库连接信息和MyBatis的参数.

<?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>
<!--引入database.properties配置文件-->
<properties resource="database.properties"/> <!--日志-->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings> <!--全局别名 ,方便在mapper配置文件中使用-->
<typeAliases>
<!--通用-->
<package name="org.hdax.pojo"/> <!--指定别名-->
<!--<typeAlias type="org.hdax.pojo.User" alias="user"/>-->
<!--<typeAlias type="org.hdax.pojo.Provider" alias="provider"/>-->
</typeAliases> <!--配置mybatis环境-->
<environments default="mysql">
<environment id="mysql">
<!--配置事务管理,采用JDBC的事务管理-->
<transactionManager type="JDBC"></transactionManager>
<!--POOLED:mybatis自带的数据源,JNDI:基于tomcat的数据源-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments> <!--将mapper文件加入配置中-->
<mappers>
<mapper resource="org/hdax/dao/ProviderMapper.xml"/>
</mappers>
</configuration>
  1. 4.      创建持久化类(POJO)和SQL映射文件
import java.util.Date;

public class User {

    //字段
private Integer id; //id
private String userCode; //用户编码
private String userName; //用户名称
private String userPassword; //用户密码
private Integer gender; //性别
private Date birthday; //出生日期
private String phone; //电话
private String address; //地址
private Integer userRole; //用户角色
private Integer createdBy; //创建者
private Date creationDate; //创建时间
private Integer modifyBy; //更新者
private Date modifyDate; //更新时间
//省略 getter&setter 方法
}

创建接口或 (省略接口)直接调用selectOne方法执行映射的语句操作

接口

package org.hdax.dao;
import org.hdax.pojo.Provider;
import java.util.List;
public interface ProviderMapper {
/**
* 查询条数
* @return
*/
public Integer count(); /**
* 查询全部
* @return
*/
public List<Provider> findAll();
}

SQL映射文件

接下来,继续创建SQL映射文件,完成与POJO(实体类)的映射,该文件也是一个XML文件,名为ProviderMapper.xml

<?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 namespace="org.hdax.dao.ProviderMapper">
<!--查询总条数-->
<select id="count" resultType="Integer">
select count(1) from smbms_provider
</select> <!--查询所有-->
<select id="findAll" resultType="Provider" >
select * from smbms_provider
</select>
</mapper>

mapper:映射文件的根元素节点,只有一个属性namespace。

namespace:用于区分不同的mapper,全局唯一。

select:表示查询语句,是MyBatis最常用的元素之一,常用属性如下。

id属性:该命名空间下唯一标识符。

resultType属性:表示SQL语句返回值类型,此处通过SQL语句返回的是int数据

类型。

  创建Mybatis工具类

  

package org.hdax.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; public class MyBatisUtil {
private static SqlSessionFactory factory; //在静态代码块下,factory只会被创建一次
static{
try {
InputStream stream = Resources.getResourceAsStream("mybatis-config.xml");
factory = new SqlSessionFactoryBuilder().build(stream);
} catch (IOException e) {
e.printStackTrace();
}
} //创建SqlSession对象
public static SqlSession createSqlSession(){
return factory.openSession(); //默认false为手动提交
} //关闭SqlSession
public static void closeSqlSession(SqlSession session){
if (null != session){
session.close();
}
}
}
  1. 5.  创建测试类
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.hdax.dao.ProviderMapper;
import org.hdax.pojo.Provider;
import org.hdax.util.MyBatisUtil;
import org.junit.After;
import org.junit.Test; import java.util.List; public class ProviderMapperTest {
private Logger logger = Logger.getLogger(ProviderMapperTest.class);
private SqlSession session = null; //查询总条数
@Test
public void testCount(){
int count = 0;
session = MyBatisUtil.createSqlSession(); //第一种方式:调用selectOne方法执行映射的查询语句操作
// count = session.selectOne("org.hdax.dao.ProviderMapper.count"); //第二种方式:调用getMapper(Mapper.class)执行dao接口方法来实现对数据库的查询操作
count = session.getMapper(ProviderMapper.class).count(); logger.debug("ProviderDaoTest testCount---> " + count);
} //查询所有
@Test
public void testgetProviderList(){
SqlSession sqlSession = MyBatisUtil.createSqlSession();
List<Provider> all = sqlSession.getMapper(ProviderMapper.class).findAll();
for (Provider provider : all){
logger.debug("testGetProviderList proCode: " + provider.getProCode() + " and proName: " + provider.getProName());
}
} //在test之后执行
@After
public void close(){
MyBatisUtil.closeSqlSession(session);
}
}

在前面的基础上完成增加数据库测试运行环境

<configuration>
<!-- 引入 database.properties 文件-->
<!-- <properties resource="database.properties"/> --> <!-- <properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
</properties> --> <properties resource="database.properties">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms"/>
<property name="user" value="root"/>
<property name="password" value="123456"/>
</properties> ...省略无关知识点内容... <environments default="test">
<environment id="development">
<!--配置事务管理,采用JDBC的事务管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- POOLED:mybatis自带的数据源,JNDI:基于tomcat的数据源 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
<environment id="test">
<!--配置事务管理,采用JDBC的事务管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- POOLED:mybatis自带的数据源,JNDI:基于tomcat的数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://10.0.0.122:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="test"/>
</dataSource>
</environment>
</environments> <!-- 将mapper文件加入到配置文件中 -->
<mappers>
    ...省略无关知识点内容...
  </mappers> 
</configuration>

总结

mybatis的优点同样是mybatis的缺点,正因为mybatis使用简单,数据的可靠性、完整性的瓶颈便更多依赖于程序员对sql的使用水平上了。sql写在xml里,虽然方便了修改、优化和统一浏览,但可读性很低,调试也非常困难,也非常受限。

mybatis没有hibernate那么强大,但是mybatis最大的优点就是简单小巧易于上手,方便浏览修改sql语句。

MyBatis的基本要素包括核心对象、核心配置文件、SOL映射文件。

对象/关系映射(Object/Relational Mapping) 即ORM,也可以理解为一种数据持久化技术.

数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称.

parameterType

输入:

在映射文件中通过parameterType指定输入参数的类型.

resultType

输出:

在映射文件中通过resultType指定输出结果的类型

#{}和${}

#{}

#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo,hashmap.

如果接收简单类型,#{}中可以写成value或其它名称.
   #{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性…的方式获取对象属性值.

${}

${}表示一个拼接符号,会引用sql注入,所以不建议使用${}.

${}接收输入参数,类型可以是简单类型,pojo,hashmap.

如果接收简单类型,${}中只能写成value.

${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性…的方式获取对象属性值.

selectOne和selectList

selectOne表示查询出一条记录进行映射,如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象).

selectList表示查询出一个列表(多条记录)进行映射.如果使用selectList查询多条记录,不能使用selectOne.

Mybatis(一) 入门的更多相关文章

  1. MyBatis学习总结(一)——MyBatis快速入门

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  2. MyBatis快速入门

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  3. MyBatis学习总结(一)——MyBatis快速入门(转载)

    本文转载自http://www.cnblogs.com/jpf-java/p/6013537.html MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了 ...

  4. MyBatis入门学习教程-MyBatis快速入门

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  5. MyBatis学习总结(一)——MyBatis快速入门

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  6. 【转】MyBatis学习总结(一)——MyBatis快速入门

    [转]MyBatis学习总结(一)——MyBatis快速入门 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC ...

  7. mybatis快速入门(六)

    前面mybatis的入门程序基本上都写完了,就看大家的灵活运用了,今天来吧前面的整合一下封装一个公共的BaseDao 只需要把前面的改造下然后创建一个BaseDao的接口,其它的继承BaseDao接口 ...

  8. MyBatis学习总结-MyBatis快速入门的系列教程

    MyBatis学习总结-MyBatis快速入门的系列教程 [MyBatis]MyBatis 使用教程 [MyBatis]MyBatis XML配置 [MyBatis]MyBatis XML映射文件 [ ...

  9. MyBatis基础入门《二十》动态SQL(foreach)

    MyBatis基础入门<二十>动态SQL(foreach) 1. 迭代一个集合,通常用于in条件 2. 属性 > item > index > collection : ...

  10. MyBatis基础入门《十九》动态SQL(set,trim)

    MyBatis基础入门<十九>动态SQL(set,trim) 描述: 1. 问题 : 更新用户表数据时,若某个参数为null时,会导致更新错误 2. 分析: 正确结果: 若某个参数为nul ...

随机推荐

  1. python selenium 执行完毕关闭chromedriver进程

    #OS是我们操作dos系统时需要引入的库 import os #杀死这个chromedriver进程,因为每次启动都会打开,所以需要kill,这里用的chrome浏览器,打开方式时chromedriv ...

  2. Tomcat非root身份运行制作Linux系统服务管理

    理论知识怱略,马上开始实战 一.首先准备好tomcat 启动.关闭.重启Shell脚本: 以下Shell脚本主要修改值 tomcatPath:tomcat目录 runUser:以哪个身份运行 此处测试 ...

  3. HTML5+CSS3制作无限滚动与文字跳动效果

    ㈠用HTML5+CSS3做无限滚动效果 ⑴逻辑分析 ⑵实践示例 前5张图片为所有图片显示区,假设总长度为1100px: 后面出现的五张图片为克隆区,只是将前面的图片拷贝了一份: 然后将前五张和后五张的 ...

  4. C# 5.0

    序言 异步成员 但是 async 和 await 才是此版本真正的主角. C# 在 2012 年推出这些功能时,将异步引入语言作为最重要的组成部分,另现状大为改观. 如果你以前处理过冗长的运行操作以及 ...

  5. Java多线程和并发(六),yield函数和中断线程

    目录 1.yield函数 2.中断线程 六.yield函数和中断线程 1.yield函数 2.中断线程 (1)已经被抛弃的方法 (2)目前使用的方法

  6. AtCoder AGC017C Snuke and Spells

    题目链接 https://atcoder.jp/contests/agc017/tasks/agc017_c 题解 很久前不会做看了题解,现在又看了一下,只想说,这种智商题真的杀我... 转化成如果现 ...

  7. python学习之路(13)

    列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, ...

  8. [CSP-S模拟测试]:花(DP)

    题目传送门(内部题111) 输入格式 一个整数$T$,表示测试数据组数. 每组测试数据占一行,两个整数,分别表示$L$和$S$. 输出格式 对每组数据,输出一个整数表示答案. 样例 样例输入1: 13 ...

  9. JQuery实现表格动态增加行并对新行添加事件

    实现功能: 通常在编辑表格时表格的行数是不确定的,如果一次增加太多行可能导致页面内容太多,反应变慢:通过此程序实现表格动态增加行,一直保持最下面有多个空白行. 效果: 一:原始页面 二:表1增加新行并 ...

  10. HiddenField Class

    HiddenField Class Namespace: System.Web.UI.WebControls Assembly: System.Web.dll Represents a hidden ...