发表于: 2018-04-04 23:52:41

1 686


今天完成的事情:


1.解决服务器数据库插入中文显示问号的问题

2.写完批量插入,查询

3.配置maven插件,打包项目,运行jar,并在服务器运行main

4.学习基础数组和数组的内存控制



1.关于数据库插入中文是问号的原因:

character_set_server 和 character_set_database 为latinl


之前插入数据查询出来中文字符串是问号,但是其它字符串没影响:



使用show variables like 'character%'查询:


修改:

set character_set_server = utf8;
set character_set_database = utf8;

然后连接的时候url添加:

jdbcUrl = jdbc:mysql://119.29.17.188/jnshu?useUnicode=true&characterEncoding=UTF-8

再次执行可以了,插入后查出来结果正确(第五条):

[Person{id=1, create_at=20180330, update_at=20180330, name='大师兄', age=22, sex=1, tell=138, qq=138, email='11@QQ.COM', pro='NICAI', waikey='null'}, 

Person{id=2, create_at=0, update_at=0, name='???', age=22, sex=1, tell=135000, qq=23896235, email='7799@12.com', pro='????', waikey='null'}, 

Person{id=3, create_at=0, update_at=0, name='小师弟', age=15, sex=1, tell=0, qq=0, email='null', pro='二师兄', waikey='null'}, 

Person{id=4, create_at=0, update_at=0, name='???', age=22, sex=1, tell=138000, qq=8342657, email='7788@12.com', pro='????????', waikey='null'}, 

Person{id=5, create_at=0, update_at=0, name='三师兄', age=22, sex=1, tell=138000, qq=8342657, email='7788@12.com', pro='巅峰的世界你不懂', waikey='null'}]



2.完善增删改查


interface Mapper:

@Component
public interface PersonMapper {

//    @Select("SELECT * FROM person")
   public List<Person> findAll();

//    @Select(" SELECT * FROM person WHERE id = #{id}")
//    @ResultMap("personMap")
   Person selectById(int id);

//    @Update("Update person SET name=#{name},age=#{age},sex=#{sex},tell=#{tell},qq=#{qq},email=#{email},pro=#{pro},waikey=#{waikey} WHERE id=#{id}")
   void updatePerson(Person person);

//    @Delete("DELETE FROM person WHERE id = #{id}")
   void delectPerson(int id);

//    @Insert("INSERT INTO person (id,create_at,update_at,name,age,sex,pro,tell,qq,email,waikey) values (#{id},#{create_at},#{update_at},#{name},#{age},#{sex},#{pro},#{tell},#{qq},#{email},#{waikey})")
   void insertPerson(Person person);

//    @Insert("INSERT INTO person (id,create_at,update_at,name,age,sex,pro,tell,qq,email,waikey) values (#{id},#{create_at},#{update_at},#{name},#{age},#{sex},#{pro},#{tell},#{qq},#{email},#{waikey})")
   void createPerson(Person person);

void insertPersonList(List<Person> list);

}


@Service(不使用sqlSessionDaoSupport访问session可以不用):

@Service
public class PersonService extends SqlSessionDaoSupport implements PersonMapper{

@Autowired
   public void setSessionFactory(SqlSessionFactory sqlSessionFactory){
super.setSqlSessionFactory(sqlSessionFactory);
}

public Person selectById(int id) {

/**
        * *从语句键和参数中检索单个行。
        * statement :mapper.xml里的 namespace
        * @param <T>返回的对象类型。
        * @param语句唯一标识符匹配使用的语句。
        * @param参数一个参数对象传递到语句。
        * @return映射对象
        *   <T> T selectOne(String statement, Object parameter);
        */
       return this.getSqlSession().selectOne("mybatis.mapper.PersonMapper.selectById",id);
}

public List<Person> findAll() {
return this.getSqlSession().selectList("mybatis.mapper.PersonMapper.findAll");
}

public void updatePerson(Person person) {
this.getSqlSession().update("mybatis.mapper.PersonMapper.updatePerson",person);
}

public void delectPerson(int id) {
this.getSqlSession().delete("mybatis.mapper.PersonMapper.delectPerson",id);
}

public void insertPerson(Person person) {
this.getSqlSession().insert("mybatis.mapper.PersonMapper.insertPerson",person);
}

public void createPerson(Person person) {
this.getSqlSession().insert("mybatis.mapper.PersonMapper.createPerson",person);
}

public void insertPersonList(List<Person> list) {
this.getSqlSession().insert("mybatis.mapper.PersonMapper.insertPersonList",list);
}

}



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" >

<mapper namespace="mybatis.mapper.PersonMapper">

<resultMap id="personMap" type="mybatis.model.Person" >
<id column="id" property="id"/>
<result column="create_at"  property="create_at"/>
<result column="update_at"  property="update_at"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<result column="sex"  property="sex"/>
<result column="pro" property="pro"/>
<result column="tell"  property="tell"/>
<result column="qq"  property="qq"/>
<result column="email"  property="email"/>
<result column="waikey"  property="waikey"/>
</resultMap>
<!--命名sql语句 可以在下面调用,在这标注可以有这种引用方式-->
   <!--<sql id="person_column">-->
       <!--id,create_at,update_at,name,age,sex,tell,qq,email,pro,waikey-->
   <!--</sql>-->
   <!-- 要么是resultMap="userMap"   要么是resultTpye="int" -->
   <select id="selectById" parameterType="int" resultMap="personMap" >
SELECT * FROM person WHERE id = #{id}
</select>

<select id="findAll" parameterType="mybatis.model.Person" resultMap="personMap">
SELECT * FROM person
</select>

<insert id="insertPerson" parameterType="mybatis.model.Person"  useGeneratedKeys="true"  >
INSERT INTO person
(id,create_at,update_at,name,age,sex,pro,tell,qq,email,waikey)
values
(#{id},#{create_at},#{update_at},#{name},#{age},#{sex},#{pro},#{tell},#{qq},#{email},#{waikey})
</insert>

<insert id="createPerson" parameterType="mybatis.model.Person"  useGeneratedKeys="true"  >
INSERT INTO person
(id,create_at,update_at,name,age,sex,pro,tell,qq,email,waikey)
values
(#{id},#{create_at},#{update_at},#{name},#{age},#{sex},#{pro},#{tell},#{qq},#{email},#{waikey})
</insert>

<insert id="insertPersonList" parameterType="mybatis.model.Person"  useGeneratedKeys="true">
INSERT INTO person(id,create_at,update_at,name,age,sex,pro,tell,qq,email,waikey)
values
<foreach  item="item" collection="list" separator="," index = "index">
(#{item.id},#{item.create_at},#{item.update_at},#{item.name},#{item.age},#{item.sex},#{item.tell},#{item.qq},#{item.email},#{item.pro},#{item.waikey})
</foreach>
</insert>

<update id="updatePerson" parameterType="mybatis.model.Person" >
Update person SET name=#{name},age=#{age},sex=#{sex},tell=#{tell},qq=#{qq},email=#{email},pro=#{pro},waikey=#{waikey} WHERE id=#{id}
</update>

<delete id="delectPerson" parameterType="int"  >
DELETE FROM person WHERE id = #{id}
</delete>

</mapper>


main方法(这里只贴了简单的main方法,MybatisAction是本测试类的类名):

public static void main(String[] args){

ApplicationContext conn = new ClassPathXmlApplicationContext("mybatis/springmybatis.xml");

MybatisAction mybatisAction = (MybatisAction) conn.getBean("mybatisAction");

System.out.print("\n ==================================== \n" + mybatisAction.personMapper.findAll() + "\n ==================================== \n");
}



3.使用插件打包


使用的插件:

<!--assembly打包插件-->

maven-assembly-plugin

<!--依赖包复制到库 插件-->

maven-dependency-plugin

<!--编译插件 compiler-->

maven-compiler-plugin

<!--还有一个maven-jar-plugin 打包插件-->

maven-jar-plugin


执行mvn -package打包命令后,在target目录下生成jar包


但是在插件里写的main方法类无法加载:

<manifest>
  <mainClass>action.MybatisAction</mainClass>
</manifest>


java运行jar包提示找不到主函数入口。


使用idea打包可以运行:


把jar包上传后在服务器(CentOs)运行:



4.数组的内存控制


List<User> list = new ArrayList(); 严格说是对象而不是数组

数组也是存放在堆内存中,引用数组的变量存放在栈内存中。局部变量也是,存放在栈内存中,一旦使用完毕立即释放内存。

数组的长度是不变的,一旦初始化之后它的长度就被定义了,固定不变。数组被定义以后会在内存中开辟两个空间,一个存放实际数组本身(在堆内存中),一个存放指引变量(在栈内存中)。所以我们每次看待数组的时候都要把它想成两个部分,一个是引用它的变量,一个是它本身。

当定义一个数组的时候,只是创建了一个空的引用,并没有开辟它的真实内存。只有当它初始化的时候才会在内存开辟空间,此时它的长度已经被定义下来了。

比如 

int[]  list;

它就是一个空引用,没有实际的指向地址。

使用数组的时候必须初始化,或者,给它一个指向已经初始化的数组的内存地址。由此也可以知道所有的引用对象都是,可以不用进行初始化,需要初始化的是它实际的在堆内存里的对象本身,我们使用它们的时候都是通过引用变量来使用它们,我们更改引用变量的值的时候,实际上就是更改了它指向的地址,原来的对象本身还是在内存中不变。如果这个对象没有引用变量引用的时候就变成了垃圾数据,这就需要回收机制把它回收释放内存。

数组是静态的,它占的内存不变。实际上java就是静态语言,数据存放在内存里,数据对象都是在来回的调用、引用,它本身不变,java不允许直接访问堆内存中的数值。

数组的初始化分为静态和动态

静态初始化就是我们定义它的时候直接赋初始值,系统就会自动为它分配内存,定义长度;

动态初始化就是我们只定义它的长度,而不赋值,系统为它的内容赋初始值。

当动态初始化的时候,系统是默认按照它的基本类型定义初始值:

int等整数类型赋值0;

float、double是0.0;

字符类型赋值是'\u000';

boolean是false;

引用类型就赋值是null。


多维数组,严格来说并不算多维数组

比如定义一个数组:int[ ][ ] a  = new int[ 3 ][ ];

a[ 0 ][ ] = new int[ 2 ];

这里a是一个二维数组,它里面储存的new int[]也是一个数组,但是这里储存的只是一个引用对象,java可以把多维数组当成一维数组处理。初始化的时候可以从左边初始化a的第一个元素,现在它是个数组,储存在a数组里的是引用变量而不是这个数组本身,但是这个引用变量会作为a数组的元素储存在堆内存之中。然后再初始化这个数组的元素,如果还是数组就一直迭代下去,直到可以初始化的值(就是在堆内存中的实际对象),然后再继续下一个。这样就是一直引用下去,直到所有的引用类型向下迭代到内存里初始化的实际对象。



明天计划的事情:

1.测试服务器数据池连接,学习try/catch


2.继续学习java基础


遇到的问题:

1.更改服务器数据库编码并重启的时候遇到问题,无法重启。再次连接无法连接上,还是之前提示的‘没有.sock文件,不能连接数据库’

只能再执行一次mysqld --user=root;解决


2.使用插件打包的时候class main路径的问题,无论写什么都找不到主函数入口。使用idea打包则可以解决,但是查看mf文件,主函数指定的地址和使用插件打包的一样。


3.多维数组,既然a里面的数组作为a数组的元素储存在堆中,那栈中还会储存这些作为元素的数组的引用变量么。是相当于a数组的引用变量储存在栈中,它指向的数组对象储存在堆中。其中的元素指向new数组,这些数组的引用变量在栈中,但是作为a的元素这些引用变量又会储存在堆中,还是说不会在栈中开辟新空间储存这些数组元素的引用变量了?


收获:


1.打包运行

2.数据库本身的查询

3.数组的内存空间













返回列表 返回列表
评论

    分享到