mybatis笔记-5、mybatis开发DAO的方法

MyBatis-在Dao层的基本使用-20200426 1.MyBaitis半自动,轻量级持久层框架(全自动的有hibernate) 2.重要配置文件 1).映射配置文件:主要用于配置sql语句,方法的对应关系 映射文件举例: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0/... 阅读详情


SqlSession使用范围:

SqlSessionFactory创建Session

SqlSessionFactoryBuilder

SqlSessionFactoryBuilder创建SqlSessionFactory,

将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。

在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。

SqlSessionFactory

SqlSessionFactory创建SqlSession,使用单例模式管理SqlSessionFactory(工厂一旦创建,使用一个实例)。

将来mybatis和spring整合之后,使用单例模式管理SqlSessionFactory。

SqlSession

SqlSession是一个面向用户(程序员)的借口

SqlSession中提供了很多操作数据库的方法:如selectOne、selectList。

SqlSession是线程不安全的,在SqlSession实现类中除了接口中的方法(操作数据库的方法)还有数据域属性。

结论:SqlSession最佳应用场合在方法体内,定义局部变量使用。

二、原始dao开发方法(程序员需要些dao借口和dao实现类)

思路:

程序要需要些dao接口和dao实现类

需要向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession

2.1 dao接口

public interface UserDao {
    //根据id查询用户信息
    public User findUserById(int id) throws Exception;

    //根据用户名列查询用户列表
    public List<User> findUserByName(String name) throws Exception;

    //添加用户信息
    public void insertUser(User user) throws Exception;

    //删除用户信息
    public void deleteUser(int id) throws Exception;
}

2.2 dao接口实现类

package com.iot.mybatis.dao;

import com.iot.mybatis.po.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import java.util.List;

public class UserDaoImpl implements UserDao{
    // 需要向dao实现类中注入SqlSessionFactory
    private SqlSessionFactory sqlSessionFactory;
	// 这里通过构造方法注入
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
        this.sqlSessionFactory = sqlSessionFactory;
    }


    @Override
    public User findUserById(int id) throws Exception {
        // session不要写到类属性里,因为是线程不安全的
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = sqlSession.selectOne("test.findUserById",id);
        //释放资源
        sqlSession.close();
        return user;
    }

    @Override
    public List<User> findUserByName(String name) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();

        List<User> list = sqlSession.selectList("test.findUserByName", name);

        // 释放资源
        sqlSession.close();

        return list;
    }

    @Override
    public void insertUser(User user) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行插入操作
        sqlSession.insert("test.insertUser", user);

        // 提交事务
        sqlSession.commit();

        // 释放资源
        sqlSession.close();
    }

    @Override
    public void deleteUser(int id) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //执行插入操作
        sqlSession.delete("test.deleteUser", id);

        // 提交事务
        sqlSession.commit();

        // 释放资源
        sqlSession.close();
    }
}

2.3 测试代码

package com.iot.mybatis.dao;

import java.io.InputStream;

import com.iot.mybatis.po.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

public class UserDaoImplTest {

	private SqlSessionFactory sqlSessionFactory;

	// 此方法是在执行testFindUserById之前执行
	@Before
	public void setUp() throws Exception {
		// 创建sqlSessionFactory

		// mybatis配置文件
		String resource = "SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);

		// 创建会话工厂,传入mybatis的配置文件信息
		sqlSessionFactory = new SqlSessionFactoryBuilder()
				.build(inputStream);
	}

	@Test
	public void testFindUserById() throws Exception {
		// 创建UserDao的对象
		UserDao userDao = new UserDaoImpl(sqlSessionFactory);

		// 调用UserDao的方法
		User user = userDao.findUserById(1);
		
		System.out.println(user);
	}

}

2.4 总结原始dao开发问题

1.dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。

2.调用sqlsession方法时将statement的id硬编码了

3.调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。

三、mapper代理方法(程序员只需要写mapper借口(相当于dao接口))

程序员只需要mapper接口(相当 于dao接口)

程序员还需要编写mapper.xml映射文件

程序员在编写mapper.xml(映射文件)和mapper.java需要遵循一个开发规范

程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。

1、mapper.xml中namespace就mapper.java的类全路径

2、mapper.xml中statement的id和mapper.java中方法名一致

3、mapper.xml中statement的parameter指定输入参数的类型和mapper.java的方法输入参数类型一致

开发规范

对应关系图:

|---类(对应xml的mapper+namespace)
|---|---方法(对应xml的id)
|---|---|---方法的参数(对应xml的parameterType和resultType)
  • 在mapper.xml中namespace等于mapper接口地址
<!--
 namespace 命名空间,作用就是对sql进行分类化管理,理解为sql隔离
 注意:使用mapper代理方法开发,namespace有特殊重要的作用,namespace等于mapper接口地址
 -->
<mapper namespace="com.iot.mybatis.mapper.UserMapper">
  • mapper.java接口中的方法名和mapper.xml中statement的id一致。通过标签名可以知道session调用的方法类型

  • mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。

  • mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。

<select id="findUserById" parameterType="int" resultType="com.iot.mybatis.po.User">
    SELECT * FROM  user  WHERE id=#{value}
</select>
//根据id查询用户信息
public User findUserById(int id) throws Exception;

总结:以上开发规范主要是对下边的代码进行统一生成:

User user = sqlSession.selectOne("test.findUserById", id);
sqlSession.insert("test.insertUser", user);

代码

mapper.xml(实现)

相当于接口的实现类

------------mapper.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">
<!--
 namespace 命名空间,作用就是对sql进行分类化管理,理解为sql隔离
 注意:使用mapper代理方法开发,namespace有特殊重要的作用
 -->
<mapper namespace="com.iot.mybatis.mapper.UserMapper">
 <!-- 在映射文件中配置很多sql语句 -->
    <!--需求:通过id查询用户表的记录 -->
    <!-- 通过select执行数据库查询
     id:标识映射文件中的sql,称为statement的id
     将sql语句封装到mappedStatement对象中,所以将id称为statement的id
     parameterType:指定输入参数的类型
     #{}标示一个占位符,
     #{value}其中value表示接收输入参数的名称,如果输入参数是简单类型,那么#{}中的值可以任意。

     resultType:指定sql输出结果的映射的java对象类型,select指定resultType表示将单条记录映射成java对象
     -->
    <select id="findUserById" parameterType="int" resultType="com.iot.mybatis.po.User">
        SELECT * FROM  user  WHERE id=#{value}
    </select>

    <!-- 根据用户名称模糊查询用户信息,可能返回多条
	resultType:指定就是单条记录所映射的java对象类型
	${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。
	使用${}拼接sql,引起 sql注入
	${value}:接收输入参数的内容,如果传入类型是简单类型,${}中只能使用value
	 -->
    <select id="findUserByName" parameterType="java.lang.String" resultType="com.iot.mybatis.po.User">
        SELECT * FROM user WHERE username LIKE '%${value}%'
    </select>


    <!-- 添加用户
        parameterType:指定输入 参数类型是pojo(包括 用户信息)
        #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值
        -->
    <insert id="insertUser" parameterType="com.iot.mybatis.po.User">
        <!--
         将插入数据的主键返回,返回到user对象中

         SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用与自增主键

         keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性
         order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序
         resultType:指定SELECT LAST_INSERT_ID()的结果类型
          -->
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
          SELECT LAST_INSERT_ID()
        </selectKey>
        INSERT INTO user (username,birthday,sex,address)values (#{username},#{birthday},#{sex},#{address})
        <!--
            使用mysql的uuid()生成主键
            执行过程:
            首先通过uuid()得到主键,将主键设置到user对象的id属性中
            其次在insert执行时,从user对象中取出id属性值
             -->
        <!--  <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
            SELECT uuid()
        </selectKey>
        insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address}) -->

    </insert>

    <!-- 删除 用户
        根据id删除用户,需要输入 id值
         -->
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id=#{id}
    </delete>

    <!-- 根据id更新用户
    分析:
    需要传入用户的id
    需要传入用户的更新信息
    parameterType指定user对象,包括 id和更新信息,注意:id必须存在
    #{id}:从输入 user对象中获取id属性值
     -->
    <update id="updateUser" parameterType="com.iot.mybatis.po.User">
        update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
        where id=#{id}
    </update>
    
</mapper>
在SqlMapConfig.xml中加载映射文件
<mappers>  
    <mapper resource="mapper/UserMapper.xml"/>  
</mappers>  
UserMapper.java(接口)
public interface UserMapper {
    //根据id查询用户信息
    public User findUserById(int id) throws Exception;

    //根据用户名列查询用户列表
    public List<User> findUserByName(String name) throws Exception;

    //添加用户信息
    public void insertUser(User user) throws Exception;

    //删除用户信息
    public void deleteUser(int id) throws Exception;

    //更新用户
    public void updateUser(User user)throws Exception;
}
UserMapperTest/java(测试)

UserMapper userMapper=sqlSession.getMapper(UserMapper接口.class);

User user=userMapper.findUserById(1);

public class UserMapperTest {  

    private SqlSessionFactory sqlSessionFactory;  
      
    //注解Before是在执行本类所有测试方法之前先调用这个方法  
    @Before  
    public void setup() throws Exception{  
        //创建SqlSessionFactory  
        String resource="SqlMapConfig.xml";  
          
        //将配置文件加载成流  
        InputStream inputStream = Resources.getResourceAsStream(resource);  
        //创建会话工厂,传入mybatis配置文件的信息  
        sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);  
    }  
      
    @Test  
    public void testFindUserById() throws Exception{  
          
        SqlSession sqlSession=sqlSessionFactory.openSession();  
          
        //创建UserMapper代理对象  
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);  
          
        //调用userMapper的方法  
        User user=userMapper.findUserById(1);  
          
        System.out.println(user.getUsername());  
    }  
}  

一些问题总结

1、代理对象内部调用selectOne或selectList

  • 如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。
  • 如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。

2、mapper接口方法参数只能有一个是否影响系统开发

mapper接口方法参数只能有一个,系统是否不利于扩展维护?系统框架中,dao层的代码是被业务层公用的。即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。

注意:持久层方法的参数可以包装类型、map…等,service方法中建议不要使用包装类型(不利于业务层的可扩展)。

Mybatis实现DAO层开发(原始Dao开发方式和Mapper接口代理开发方式) Mybatis实现DAO层开发 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方式和Mapper接口代理开发方式。而现在主流的开发方式是接口代理开发方式,这种方式总体上更加简便。我们的课程讲解也主要以接口代理开发方式为主。 一 . Mybatis实现DAO的传统开发方式 传统方式开发DAO 的说明,需求如下: 根据用户id查询一个用户信息 根据用户名称模糊查询用户信息列表... 阅读详情

相关推荐

MyBatis详解(二):mybatis开发dao

终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!23)]既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

zhendeC1的博客 722

JAVA多线程引用dao,service

public class WechatNotifyRunable implements Runnable { private final Logger logger = Logger.getLogger(WechatNotifyRunable.class); private static List notifyList = new ArrayList(); private UserInfoDao userInfoDao; private CheckInOutDao checkInOutDao; privat

qdwel1987的博客 1601

CCS20实战入门:第一个工程搭建示例

通过实际操作演示如何在ccs20中创建并配置首个开发项目,涵盖环境设置与基础调试步骤,帮助新手快速上手ccs20集成开发环境,提升嵌入式开发效率。

weixin_31185473的博客 883

Mybatis中代理dao的获取

//1.获取字节输入流 InputStream in = org.apache.ibatis.io.Resources.getResourceAsStream("SqlMapConfig.xml"); //2.根据字节输入流构建SqlSessionFactory SqlSessionFactory factory = new SqlSession...

qq_34721292的博客 696

个人信息保护合规审计人员(高级)能力考核试卷+面试模拟

《个人信息保护合规审计考试与面试指南》 摘要:本文提供个人信息保护合规审计考试及面试的全面指导。考试采用闭卷笔试形式,满分100分,合格线75分,时长120分钟,包含单选、多选、判断题及综合案例分析题。内容涵盖《个人信息保护法》核心条款、审计程序、风险评估等实务要点。面试环节采用情景模拟方式,重点考察应试者在压力下处理审计独立性、客户关系与监管要求的平衡能力,以及应对数据泄露等突发事件的处置流程。案例题聚焦大型互联网平台的数据收集、共享、跨境传输等高风险环节的合规审计,要求设计完整的审计方案框架。面试评分标

qq_41525079的博客 1142

深入大模型-13-大模型Skills应用之标准目录结构和开发一个Skill的步骤

首先对比Prompt工程,上下文工程,Skills工程,MCP工具的概念与区别,然后介绍Skill的标准目录结构,同时描述了开发一个Skill的步骤和最佳实践。

qq_20466211的博客 747

Java--MyBatis的Dao方式以及Dao动态代理

一、MyBatis传统Dao方式以及Dao动态代理 二、MyBatis传参parameterType 三、MyBatis输出参数 resultType 和 resultMap 四、MyBatis动态SQL

MinggeQingchun的博客 990

Smart PLC高速脉冲输入计米轮模块(编码器测速/计米详细讲解)

线缆行业单绞机PLC控制算法详细解读可以参看下面的文章链接:线缆行业单绞机控制算法(详细图解+代码)_RXXW_Dor的博客-优快云博客在了解单绞机之前需要大家对收放卷以及排线控制有一定的了解,不清楚的可以参看下面几篇博客,这里不再赘述,受水平和能力所限,文中难免出现错误和不足之处,诚恳的欢迎大家批评和指正。PLC张力控制(开环闭环算法分析)_RXXW_Dor的博客-优快云博客_plc闭环控制实例。SMART PLC时间间隔定时器应用(高速脉冲测频/测速)_RXXW_Dor的博客-优快云博客。

RXXW_Dor的博客 2819

MyBatis快速入门第三讲——dao层开发方法

使用MyBatis开发Dao层,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法。本文案例代码的编写是建立在前文MyBatis框架的学习(二)——MyBatis架构与入门案例基础之上的!需求明确开发需求,在实际开发中,我们总归是要开发Dao层的,所以在本文中我使用MyBatis这个框架技术开发Dao层来将以下功能一一实现: 根据用户id查询一个用户信息 根据用户名称模糊查询用户信息列表

李阿昀的博客 1万+

富芮坤fr8008gp 240X280 lvgl项目启动

fr8008gp_240X280_lvgl项目启动

cheng___yi的博客 1757

【Claude】Extra inputs are not permitted 错误:代理剥离 Beta 标头的解决方案 bug报错已解决

深入分析Claude Code Extra inputs are not permitted 400错误的技术原理,解析代理剥离Beta标头的根因与多种修复方案。

一键难忘的博客 145

MyBatis开发Dao的原始Dao开发和Mapper动态代理开发

使用MyBatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper动态代理开发方法。原始Dao开发中存在以下问题: Dao方法体存在重复代码:通过SqlSessionFactory创建SqlSession,调用SqlSession的数据库操作方法 调用sqlSession的数据库操作方法需要指定statement的id,这里存在硬编码,不得于开发维护。 而动态代理开发中Mappe...

宜春 4991

华为OD面试八股真题 - 操作系统相关 - 2

华为OD技术面,操作系统相关八股真题提供详细解答,这篇博客主要涉及于进程和线程相关知识点

qq_45776114的博客 965

mybatis开发dao的方法

简介   使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法。 主要概念介绍:   MyBatis中进行Dao开发时候有几个重要的类,它们是SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession。   SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等。通过SqlSessionF...

BIGBAI的博客 297

总结目前开源的视频生成/视频编辑大模型

随着Sora的爆火,视频生成和视频编辑受到了越来越多的关注。这篇博客总结一下目前开源的视频生成和视频编辑的大模型,并分析他们各自的优缺点,以及在自己进行科研任务或者工作中应该如何选用对应的开源模型,希望能给从事这一领域研究和使用的小伙伴们帮助。

沉迷单车的追风少年 3541

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Spring整合Mybatis之DAO层、Service层开发

4. Spring整合Mybatis编程Service层开发。

男神的专栏 1119

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

MyBatis开发dao方法

MyBatis开发dao方法 1.SqlSession在代码中的使用场合 使用场合:sqlSession在使用时由SqlSessionFactory生成创建一个Sqlsession会话对象,对象在代码中可以定义为成员变量、方法形参、方法的局部变量。 1.1.SqlSessionFactory SqlSessionFactory作为会话工厂,创建sqlSession,可以将Sql

happy_meng 265

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Dao层的开发方法(原始dao开发和Mapper接口开发)

原始Dao开发方法 1.编写dao接口 2.编写dao接口的实现类 3.Mapper映射文件 4.SqlMapConfig配置文件 5.测试类 6.结果 8.总结 1、dao接口实现类方法中存在大量重复方法,就是通过SqlSessionFactory创建SqlSession,调用SqlSession的数据库操作方法 2、调用sqlsession方法时将statement的id硬编码了...

廖子默 3492

Mybatis注解开发和编写dao实现类的方式

三:SqlMapConfig.xml中用注解,此处应该用class属性指定被注解的dao全限定类名。指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件。//4.使用SqlSession创建Dao接口的代理对象。//3.使用工厂生产SqlSession对象。//1.使用工厂创建SqlSession对象。@author: 牛哄哄的柯南。@author: 牛哄哄的柯南。@author: 牛哄哄的柯南。@author: 牛哄哄的柯南。//3.使用工厂创建dao对象。

2401_88972388的博客 836

【SpringMVC+mybatis】5.mybatis开发dao方法

1.SqlSession使用范围 (1)通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管SqlSessionFactoryBuilder,在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。

返璞归真 407

Mybatis开发Dao

一、Mybatis进行原始的Dao开发   原始Dao开发需要编写Dao接口和Dao实现类,步骤如下:   1、Dao接口 public interface UserDao { public User findUserById(int id); }   2、Dao实现类 public class UserDaoImpl implements UserD...

dengduoya4019的博客 171

MyBatis—传统 Dao开发方式、分析

搭建MyBatis框架基本步骤 1.导入Maven依赖 2. 创建Dao接口:定义操作数据的方法 3. 创建mapper文件:也叫sql映射文件:用来写sql语句,与接口中的方法相对应的sql语句 4. 创建MyBatis的一个主配置文件:1). 连接数据库 2).指定mapper文件的位置 5. 使用MyBatis的对象SqlSession,通过SqlSession的方法执行sql语句 ...

我们都是被分成两半的人,一边热爱生活,一边憎恨生活。面对生活,我们总是在矛盾的两端摇摆,在反复的矛盾和犹豫中,一边踉跄前行,一边重振旗鼓。我渴望改变,渴望变得更好,渴望找到出口……就像一个溺水人的挣扎,就像一个救生圈。我是一个矛盾集合体,想要变得快乐,但是 1260

MyBatis--使用mapper代理方法开发dao

mybatis开发dao方法第二种:使用mapper代理方法 使用mapper代理方法开发dao 程序员只需要写mapper接口(相当于dao接口)) pom.xml加载mysql、mybatis、junit驱动 <dependency> <groupId>mysql</groupId> <artifactId>mys...

人生理想,活的尽兴 788

MyBatis--使用原始方法开发dao

mybatis开发dao方法有两种: 1、mapper代理方法(程序员只需要写mapper接口(相当于dao接口)) 2、原始dao开发方法(程序员需要写dao接口和dao实现类) 先从原始入手,介绍原始dao开发方法 使用原始方法开发dao pom.xml加载mysql、mybatis、junit驱动 <dependency> <groupId>mys...

人生理想,活的尽兴 808

Mybatis 一(5)之Mybatis开发dao的两种方式

【5】.两种方式: 1. 原始 dao的开发方式(程序员要写 dao的接口和 dao的实现类) 2. mapper代理方式

Karen博客 360
上一篇: mybatis笔记-4、入门案例的改善
下一篇: mybatis笔记-6、confXML配置文件详解
hancoder
博客等级 码龄9年 4135粉丝 167原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值