• 吴裕雄天生自然SPRINGSpring的数据库编程


    数据库编程是互联网编程的基础,Spring框架为开发者提供了JDBC模板模式,即jdbcTemplate,它可以简化许多代码,但在实际应用中jdbcTemplate并不常用。工作更多的时候,用的是Hibernate框架和MyBatis框架进行数据库编程。
    package entity;
    
    public class MyUser {
        private Integer uid;
        private String uname;
        private String usex;
    
        public Integer getUid() {
            return uid;
        }
    
        public void setUid(Integer uid) {
            this.uid = uid;
        }
    
        public String getUname() {
            return uname;
        }
    
        public void setUname(String uname) {
            this.uname = uname;
        }
    
        public String getUsex() {
            return usex;
        }
    
        public void setUsex(String usex) {
            this.usex = usex;
        }
    
        public String toString() {
            return "myUser [uid=" + uid + ", uname=" + uname + ", usex=" + usex + "]";
        }
    }
    package dao;
    
    import java.util.List;
    import entity.MyUser;
    
    public interface TestDao {
        public int update(String sql, Object[] param);
    
        public List<MyUser> query(String sql, Object[] param);
    }
    package dao;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.RowMapper;
    import org.springframework.stereotype.Repository;
    
    import entity.MyUser;
    
    @Repository
    public class TestDaoImpl implements TestDao {
        @Autowired // 使用配置类中的JDBC模板
        private JdbcTemplate jdbcTemplate;
    
        /**
         * 更新方法,包括添加、修改、删除 param为sql中的参数,如通配符?
         */
        @Override
        public int update(String sql, Object[] param) {
            return jdbcTemplate.update(sql, param);
        }
    
        /**
         * 查询方法 param为sql中的参数,如通配符?
         */
        @Override
        public List<MyUser> query(String sql, Object[] param) {
            RowMapper<MyUser> rowMapper = new BeanPropertyRowMapper<MyUser>(MyUser.class);
            return jdbcTemplate.query(sql, rowMapper);
        }
    }
    package service;
    
    public interface TestService {
        public void testJDBC();
    }
    package service;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import dao.TestDao;
    import entity.MyUser;
    
    @Service
    @Transactional
    public class TestServiceImpl implements TestService {
        @Autowired
        public TestDao testDao;
    
        @Override
        public void testJDBC() {
            String insertSql = "insert into user values(null,?,?)";
            // 数组param的值与insertSql语句中?一一对应
            Object param1[] = { "chenheng1", "男" };
            Object param2[] = { "chenheng2", "女" };
            Object param3[] = { "chenheng3", "男" };
            Object param4[] = { "chenheng4", "女" };
            String insertSql1 = "insert into user values(?,?,?)";
            Object param5[] = { 1, "chenheng5", "女" };
            Object param6[] = { 1, "chenheng6", "女" };
            // 添加用户
            testDao.update(insertSql, param1);
            testDao.update(insertSql, param2);
            testDao.update(insertSql, param3);
            testDao.update(insertSql, param4);
            // 添加两个ID相同的用户,出现唯一性约束异常,使事物回滚。
            //testDao.update(insertSql1, param5);
            //testDao.update(insertSql1, param6);
            // 查询用户
            String selectSql = "select * from user";
            List<MyUser> list = testDao.query(selectSql, null);
            for (MyUser mu : list) {
                System.out.println(mu);
            }
        }
    }
    package config;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    import org.springframework.jdbc.datasource.DriverManagerDataSource;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    @Configuration // 通过该注解来表明该类是一个Spring的配置,相当于一个xml文件
    @ComponentScan(basePackages = { "dao", "service" }) // 配置扫描包
    //配置多个配置文件value={"classpath:jdbc.properties","xx","xxx"}
    @PropertySource(value = { "classpath:jdbc.properties" }, ignoreResourceNotFound = true)
    @EnableTransactionManagement // 开启声明式事务的支持
    public class SpringJDBCConfig {
        @Value("${jdbc.url}") // 注入属性文件jdbc.properties中的jdbc.url
        private String jdbcUrl;
        @Value("${jdbc.driverClassName}")
        private String jdbcDriverClassName;
        @Value("${jdbc.username}")
        private String jdbcUsername;
        @Value("${jdbc.password}")
        private String jdbcPassword;
    
        /**
         * 配置数据源
         */
        @Bean
        public DriverManagerDataSource dataSource() {
            System.out.println(this.jdbcUrl);
            System.out.println(this.jdbcDriverClassName);
            System.out.println(this.jdbcUsername);
            System.out.println(this.jdbcPassword);
            DriverManagerDataSource myDataSource = new DriverManagerDataSource();
            // 数据库驱动
            myDataSource.setDriverClassName(this.jdbcDriverClassName);
            // 相应驱动的jdbcUrl
            myDataSource.setUrl(this.jdbcUrl);
            // 数据库的用户名
            myDataSource.setUsername(this.jdbcUsername);
            // 数据库的密码
            myDataSource.setPassword(this.jdbcPassword);
            return myDataSource;
        }
    
        /**
         * 配置JdbcTemplate
         */
        @Bean(value = "jdbcTemplate")
        public JdbcTemplate getJdbcTemplate() {
            return new JdbcTemplate(dataSource());
        }
    
        /**
         * 为数据源添加事务管理器
         */
        @Bean
        public DataSourceTransactionManager transactionManager() {
            DataSourceTransactionManager dt = new DataSourceTransactionManager();
            dt.setDataSource(dataSource());
            return dt;
        }
    }
    jdbc.driverClassName=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/springtest?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    jdbc.username=root
    jdbc.password=admin
    package config;
    
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    import service.TestService;
    
    public class TestJDBC {
        public static void main(String[] args) {
            // 初始化Spring容器ApplicationContext
            AnnotationConfigApplicationContext appCon = new AnnotationConfigApplicationContext(SpringJDBCConfig.class);
            TestService ts = appCon.getBean(TestService.class);
            ts.testJDBC();
            appCon.close();
        }
    }

     

    CREATE DATABASE springtest;
    commit;
    
    use springtest;
    commit;
    
    CREATE TABLE user(
    uid INT NOT NULL AUTO_INCREMENT,
    uname VARCHAR(40) NOT NULL,
    usex VARCHAR(40) NOT NULL,
    PRIMARY KEY (uid)
    )ENGINE=InnoDB DEFAULT CHARSET=utf8
    ;
    commit;

     

  • 相关阅读:
    COGS 2104. [NOIP2015]神奇的幻方
    洛谷 P1387 最大正方形
    包和一些常用的模块
    模块
    模块的导入和使用
    函数迭代器与生成器
    函数的小知识
    函数的闭包和装饰器
    函数的进阶
    初识函数
  • 原文地址:https://www.cnblogs.com/tszr/p/15310708.html
Copyright © 2020-2023  润新知